お酒好きのおしりトラブル対策とは

転記元エクセルの転記元シートのCells(i,1)の値を
転記先エクセルの転記先シートのCells(i,2)に貼り付けをしたいです。
転記先シートにあるコマンドボタンを押したときに処理されるようになっています。

調べていると転記元エクセルは開いていないといけなさそうなので、
Openで開く処理を入れたのですが、
画面描画されるとチカチカすると思うので、Open前に
Application.ScreenUpdating = False
処理を入れました。
なのに、どうやら表示されているようなんです。

されているようだとゆうのは、
実際には画面にエクセルの画面は出てこないのですが、
タスクトレイに「転記元.xls」と出ているのと、
VBのエディタに「転記元.xls」のエクセルオブジェクトが追加されたり消えたりと
チカチカしていて、処理時間も5分以上かかります。
とにかくチカチカさせたくないのですが、
どのようにすればよいでしょうか。

環境:Excel2002 WindowsXP Professional

Private Const EXCEL_NAME_MOTO = "転記元.xls"
Private Const EXCEL_NAME_SAKI = "転記先.xls"
Private Const SHEET_NAME_MOTO = "転記元シート"
Private Const SHEET_NAME_SAKI = "転記先シート"

Private Sub CommandButton1_Click()

Dim i as Integer

Application.ScreenUpdating = False
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & EXCEL_NAME_MOTO

For i = 1 To 100

Workbooks(EXCEL_NAME_MOTO).Sheets(SHEET_NAME_MOTO).Cells(i, 1).Copy
Workbooks(EXCEL_NAME_SAKI).Sheets(SHEET_NAME_SAKI).Cells(i, 2).PasteSpecial _
Paste:=xlValues
Next

Workbooks(EXCEL_NAME_MOTO).Close
Application.ScreenUpdating = True

End Sub

このQ&Aに関連する最新のQ&A

A 回答 (3件)

値で貼り付けたいなら、以下でどうでしょう



Private Sub CommandButton1_Click()
Dim i as Integer
 Application.ScreenUpdating = False
 Workbooks.Open Filename:=ThisWorkbook.Path & "\" & EXCEL_NAME_MOTO

 Workbooks(EXCEL_NAME_SAKI).Sheets(SHEET_NAME_SAKI).Range("B1:B100").Value _
  = Workbooks(EXCEL_NAME_MOTO).Sheets(SHEET_NAME_MOTO).Range("A1:A100").Value

 Workbooks(EXCEL_NAME_MOTO).Close False
 Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
これなら処理時間も早く、チカチカしませんでした。
しかしどうして
ScreenUpdating = False
入れてもチカチカしたんでしょう…

お礼日時:2007/12/14 10:59

開かないで読んではどうですか?


詳しい使い方はわからないんですが、Application.ExecuteExcel4Macroというのを使うと、Excelファイルを開かずにいろんな事ができるらしいです。

Private Sub CommandButton1_Click()
Dim i As Integer
Dim sourceSheet As String
sourceSheet = "'" & ThisWorkbook.Path & "\[" & EXCEL_NAME_MOTO & "]" & SHEET_NAME_MOTO & "'!"
For i = 1 To 100
Worksheets(SHEET_NAME_SAKI).Cells(i, 1) = Application.ExecuteExcel4Macro(sourceSheet & "R" & Trim(Str(i)) & "C1")
Next
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
そうゆう方法もあるのですね。
ExecuteExcel4Macro
これはどのエクセルのバージョンでもサポートされているかどうかが気になりますね。

お礼日時:2007/12/14 11:01

>とにかくチカチカさせたくないのですが、



単一のセルのコピーとペーストを100回も繰り返しているからです。
FOR文の部分を変更して下さい。

1.コピー方法の変更

For i = 1 To 100
Workbooks(EXCEL_NAME_MOTO).Sheets(SHEET_NAME_MOTO).Cells(i, 1).Copy _
Workbooks(EXCEL_NAME_SAKI).Sheets(SHEET_NAME_SAKI).Cells(i, 2)
Next


2.まとめて1回でコピー

Workbooks(EXCEL_NAME_MOTO).Sheets(SHEET_NAME_MOTO).Range("A1:A100").Copy
Workbooks(EXCEL_NAME_SAKI).Sheets(SHEET_NAME_SAKI).Cells(1, 2).PasteSpecial _
Paste:=xlValues

この回答への補足

ありがとうございます。
すいません。質問用にコードを簡単にしすぎてしまいました。
本当は連続していないセルをコピーして、
連続していないセルに貼り付けるので、
まとめて1回でコピーは出来ないのかなぁと思いました。
わからないですが…

補足日時:2007/12/14 10:12
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QWorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】

よろしくお願いします。
今あるブックにあるシートを別のブックにコピーしたいのですが、今考えているのは

ここから////////
'ブックを開く
Workbooks.Open コピー元のブックのパス
'シートをコピー
Worksheets.Item(コピーするシート名).Copy _
after:=Workbooks(コピー先のブック名).Sheets(1)

'ブックを閉じる
Application.DisplayAlerts = False
Workbooks.Item(コピー元のブック名)Close True
Application.DisplayAlerts = True
ここまで////

なのですが、コピーものとのブックが複数ある時、画面がチラチラしてしまいます。ブックをオープンさせずにシートを他ブックにコピーさせる方法ってないでしょうか。
ご存知の方がいらっしゃいましたら、ご教授お願いします。

Aベストアンサー

画面のチラツキを押さえたいだけなら、画面の更新をやめればいいだけじゃないでしょうか?

ブックを開く前に
Application.ScreenUpdating = False
ブック閉じてから
Application.ScreenUpdating = True

QExcel VBA ExecuteExcel4Macroについて

こんにちは。よろしくお願いします。
あるフォルダ"D:\test"のなかに、4つのxlsファイル"o.xls"、"a.xls"、"b.xls"、"c.xls"があるとします。
使用するシート名は、それぞれo,a,b,c(ファイル名から".xls"を除いたもの)とします。
このとき"o.xls"を開いて、下記のマクロを実行すると、1行目にパス名、2行名にファイル名、3行目以下に(1列目は"a.xls"の、2列目は"b.xls"の、3列目は"c.xls"の)セルA3以下が読み込まれます。
たとえば、結果は添付の図のようになります。図がうまくアップできなかったらごめんなさい。

Sub sample1()
Application.Calculation = xlManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
Worksheets("o").Cells.Clear
Dim p As String, fn As String, fc As Long, i As Long, j As Long, d, e
p = ActiveWorkbook.Path
fn = Dir(p & "\" & "*.xls", 0)
fc = 0

If fn <> "" Then
fc = fc + 1
For j = 3 To 6
With Worksheets("o")
.Cells(1, fc).Value = p & "\" & fn
.Cells(2, fc).Value = fn
d = ExecuteExcel4Macro("'" & p & "\[" & fn & "]" & Mid(fn, 1, Len(fn) - 4) & "'!R" & j & "C1")
If d = 0 Or IsError(d) Then
Exit For
Else
.Cells(j, fc) = d
End If
End With
Next j
End If

Do
fn = Dir()
If fn <> "" Then
fc = fc + 1
For i = 3 To 6
With Worksheets("o")
.Cells(1, fc).Value = p & "\" & fn
.Cells(2, fc).Value = fn
e = ExecuteExcel4Macro("'" & p & "\[" & fn & "]" & Mid(fn, 1, Len(fn) - 4) & "'!R" & i & "C1")
If e = 0 Or IsError(d) Then
Exit For
Else
.Cells(i, fc) = e
End If
End With
Next i
Else
Exit Do
End If
Loop
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.Calculation = xlAutomatic
End Sub

上記の例は変数iとjが3から6までしか動きませんし、読み込むxlsファイルも3つしかありませんのですぐに終わりますが、実際には行やファイルがもっとたくさんあり、非常に時間がかかっています。そこで、

ExecuteExcel4Macro("'" & p & "\[" & fn & "]" & Mid(fn, 1, Len(fn) - 4) & "'!R" & i & "C1")



e = ExecuteExcel4Macro("'" & p & "\[" & fn & "]" & Mid(fn, 1, Len(fn) - 4) & "'!R3C1:R6C1")

というような風にして、For~Nextも使用せず

.range(Cells(3, fc),cells(6, fc)) = e

というふうに範囲で読み込もうとしたのですがうまくいきません。
ExecuteExcel4Macroは範囲を読み込むことはできないのでしょうか?
何とかして処理速度を上げたいのですが、どうすればよいでしょうか。

こんにちは。よろしくお願いします。
あるフォルダ"D:\test"のなかに、4つのxlsファイル"o.xls"、"a.xls"、"b.xls"、"c.xls"があるとします。
使用するシート名は、それぞれo,a,b,c(ファイル名から".xls"を除いたもの)とします。
このとき"o.xls"を開いて、下記のマクロを実行すると、1行目にパス名、2行名にファイル名、3行目以下に(1列目は"a.xls"の、2列目は"b.xls"の、3列目は"c.xls"の)セルA3以下が読み込まれます。
たとえば、結果は添付の図のようになります。図がうまくアップできなかった...続きを読む

Aベストアンサー

こんにちは。

mitarashiさん、どうもありがとうございます。
今回の件については、私のコードは苦肉の策の内容のようです。

>ExecuteExcel4Macroは範囲を読み込むことはできないのでしょうか?

今回のコードも、INDEX関数で取ることはできないわけではないのですが、本質的には、一つずつ取り出すしかないようですね。

なお、ExecuteExcel4Macroを使うと、使うメリットは、ファイルを開かなくて済むということですが、DAOやADOの方法もあります。開くときのオーバーヘッドが減らせますから、ファイルの数が多ければ多いほど、時間は少なくて済むはすだと思います。

以下のコードは、値自体のエラー値や'0'を取り去ることも出来ませんが、同じ技法を使った、Consolidate という方法があります。少しは、速くなるような気がします。

なお、以下のコードの細かい点は検証されていません。
'-------------------------------------------

Sub TestMacro1()
  Dim p As String
  Dim fn As String
  Dim j As Long
  Const EXT As String = ".xls" '拡張子
  Application.Calculation = xlManual
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  
  p = Application.DefaultFilePath
  
  With Worksheets("o")
    .UsedRange.Clear
    fn = Dir(p & "\" & "*.xls", vbNormal)
    
    Do
      .Cells(1, j + 1).Value = p & "\" & fn
      .Cells(2, j + 1).Value = fn
      
      .Range("A3").Resize(4).Offset(, j).Consolidate Sources:= _
      "'" & p & "\[" & fn & "]" & Replace(fn, EXT, "", 1) & "'!R3C1:R6C1", _
      Function:=xlSum, TopRow:=True, LeftColumn:=False, CreateLinks:=False
      j = j + 1
      fn = Dir()
    Loop While Dir() <> ""
  End With
  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
  Application.Calculation = xlAutomatic
End Sub

こんにちは。

mitarashiさん、どうもありがとうございます。
今回の件については、私のコードは苦肉の策の内容のようです。

>ExecuteExcel4Macroは範囲を読み込むことはできないのでしょうか?

今回のコードも、INDEX関数で取ることはできないわけではないのですが、本質的には、一つずつ取り出すしかないようですね。

なお、ExecuteExcel4Macroを使うと、使うメリットは、ファイルを開かなくて済むということですが、DAOやADOの方法もあります。開くときのオーバーヘッドが減らせますから、ファイル...続きを読む

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QVBAでのExecuteExcel4Macroの値取得でエラー

こんにちは。
Excel VBAより、ExecuteExcel4Macroを実行して、
外部のExcelファイルの、名前(店名、月度)を定義したセルの値を取得したいと思っています。
店名:文字列型
月度:Date型

そこで、ExecuteExcel4Macro()を実行し、以下のような処理を加えました。

------------------------------------------------------------------------------------

dim 店名 as Variant, 月度 as Variant
If 外部マクロ実行("'c:\[test.xls]出勤簿'!店名", 店名) = False Or _
外部マクロ実行("'c:\[test.xls]出勤簿'!月度", 月度) = False Then
MsgBox "取得失敗", vbExclamation
End
End If


Public Function 外部マクロ実行(com As String, ByRef result As Variant) As Boolean
On Error GoTo erron3
result = ExecuteExcel4Macro(com)
On Error GoTo 0
外部マクロ実行 = True
Exit Function

erron3:
外部マクロ実行 = False
End Function

------------------------------------------------------------------------------------

これを実行したところ、「月度」の値は取得できるのですが、
「店名」の値には「エラー 2042」という値が入ります。
※dirname, filenameは正しい値が入っています。
※シート「出勤簿」および「月度」「店名」のセル名の定義も存在します。

test.xlsを開いてるときは、上記の現象は起こらず、
「店名」の値は正常に取得できます。


また、試しに、test.xlsを開き、
Worksheets("出勤簿").Range("店名")を実行すると、正常な値が取得できました。


まとめると、
・閉じたブックの、あるシートにある、セルに定義された名前を指定して
・ExecuteExcel4Macroで、文字列が入っている値を取得しようとした時、
・正常に値が取得できない
という現象に遭遇しています。

3日ほど調べているのですが、どうしても原因が分かりません。
解決策をお持ちの方、いらっしゃいましたらアドバイスを頂けると助かります。

環境:WindowsXP Pro SP3
Excel 2003 (11.5612.5606)

以上、よろしくお願いいたします。

こんにちは。
Excel VBAより、ExecuteExcel4Macroを実行して、
外部のExcelファイルの、名前(店名、月度)を定義したセルの値を取得したいと思っています。
店名:文字列型
月度:Date型

そこで、ExecuteExcel4Macro()を実行し、以下のような処理を加えました。

------------------------------------------------------------------------------------

dim 店名 as Variant, 月度 as Variant
If 外部マクロ実行("'c:\[test.xls]出勤簿'!店名", 店名) = False Or _
外部マクロ実行("'c:\[test....続きを読む

Aベストアンサー

'-------------------------------------------------
Sub Test()
 Dim 店名
 Dim 月度

 店名 = 外部マクロ実行("'C:\[test.xls]出勤簿'!店名")
 月度 = 外部マクロ実行("'C:\[test.xls]出勤簿'!月度")

   If 店名 = 0 Or 月度 = 0 Then
     MsgBox "取得失敗", vbExclamation
   Else
     MsgBox 店名 & " @ " & Format(月度, "yyyy/m/d")
   End If

End Sub
'-----------------------------------------------

Function 外部マクロ実行(com As String)
  外部マクロ実行 = ExecuteExcel4Macro(com)
End Function
'-----------------------------------------------


●ただ今回の場合は、Functionは無しでもいいような。。。

'----------------------------------------------
Sub Test555()
 Dim 店名
 Dim 月度

 店名 = ExecuteExcel4Macro("'C:\[test.xls]出勤簿'!店名")
 月度 = ExecuteExcel4Macro("'C:\[test.xls]出勤簿'!月度")

   If 店名 = 0 Or 月度 = 0 Then
     MsgBox "取得失敗", vbExclamation
   Else
     MsgBox 店名 & " @ " & Format(月度, "yyyy/m/d")
   End If

End Sub
'----------------------------------------------------

以上。

'-------------------------------------------------
Sub Test()
 Dim 店名
 Dim 月度

 店名 = 外部マクロ実行("'C:\[test.xls]出勤簿'!店名")
 月度 = 外部マクロ実行("'C:\[test.xls]出勤簿'!月度")

   If 店名 = 0 Or 月度 = 0 Then
     MsgBox "取得失敗", vbExclamation
   Else
     MsgBox 店名 & " @ " & Format(月度, "yyyy/m/d")
   End If

End Sub
'-----------------------------------------------

Function 外部マクロ実行(com As String)
  外部...続きを読む

Qブックを開かずにデータを読む方法を教えてください

 エクセルVBAでブックを開かずにデータ読み取る方法をどなたか教えていただけないでしょうか?ExecuteExcel4Macroメソッドを使用する方法を検討しているのですが、ヘルプを見ても使い方が良くわかりません。例えば
   Book1のsheet(1)のRange("A1")
に既存する
   Book2のsheet(1)のRange("B1")
の値をコピーする場合、Book2を開かずに処理したいのですが、やり方がわからず困っています。よろしくお願いします!

Aベストアンサー

こんばんは。

ブックを開かずに開く方法は、いくつかありますが、よほどの理由がなれば、そのような必要はありません。

#1さんのおっしゃるような方法で、特に、オートメーション・オブジェクトを作って取り出すような方法なら、何の支障もないはずです。

ExecuteExcel4Macro で取り出すのは、通常は、ワン・セルの値だけですが、関数も埋め込めます。コツは、R1C1 方式で書くということだけです。

以下のサンプルで、イミィディエイトウィンドウで出力された数式をごらんください。


Sub Test1()
Dim ret As Variant
 ret = getValue("Book2.xls", "Sheet1", "A1")
End Sub

Function getValue(ByVal Bk As String, _
         ByVal strSht As String, _
         ByVal strCell As String, _
         Optional ByVal strPath As String)
         
 If Not strCell Like "R#*C#*" Then
  strCell = Application.ConvertFormula(strCell, xlA1, xlR1C1, xlAbsolute)
 End If
 If strPath = "" Then
   strPath = Application.DefaultFilePath & "\"
 End If
 Debug.Print "'" & strPath & "[" & Bk & "]" & strSht & "'!" & strCell
 getValue = ExecuteExcel4Macro("'" & strPath & "[" & Bk & "]" & strSht & "'!" & strCell)
End Function

------------------------------------------------
ただし、
> Book2のsheet(1)のRange("B1")

シートインデックスから取り出す方法は、このような方法では難しいではないかと思います。

こんばんは。

ブックを開かずに開く方法は、いくつかありますが、よほどの理由がなれば、そのような必要はありません。

#1さんのおっしゃるような方法で、特に、オートメーション・オブジェクトを作って取り出すような方法なら、何の支障もないはずです。

ExecuteExcel4Macro で取り出すのは、通常は、ワン・セルの値だけですが、関数も埋め込めます。コツは、R1C1 方式で書くということだけです。

以下のサンプルで、イミィディエイトウィンドウで出力された数式をごらんください。


Sub Test1(...続きを読む

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then


人気Q&Aランキング

おすすめ情報