• ベストアンサー

VBAのブックやシートのアクティブ化について質問です。

元ファイルに格納されているマクロを実行すると、 他のエクセルファイルを開いて、 そこから必要な情報を収集して元ファイルに集める… というマクロをいま組んでいるのですが、 他のエクセルファイルを開いたら、 そのファイルはアクティブになるはずで、 それ以下に記述の処理は、元のファイルを触らない限り、 当該他のファイルに対して行われると思っているのですが、 元ファイルが処理されていします。 なので、現在、記述する際には、 以下のようにブック名とシート名から指定しています。 Workbooks(BookBango & ".xls").Sheets(2).Range(Workbooks(BookBango & ".xls").Sheets(2).Cells(1, 1), Workbooks(BookBango & ".xls").Sheets(2).Cells(paste_counter, 3)).Copy … これで一応動くは動くのですが、 とても冗長ですし、ミスを誘いやすく、修正が大変ですので、 解決したいのですが、 どうにも解決法が分かりません。 不勉強で申し訳ありませんが、どうかご指導下さい。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

>他のエクセルファイルを開いたらそのファイルはアクティブになるはずで、 >それ以下に記述の処理は、元のファイルを触らない限り当該他のファイルに対して行われると思っているのですが まんまと落とし穴に嵌ってしまいましたね。(^^;;; 原因は、コードの書いてある場所にあります。 そのコードは、シートモジュールに書いてあり、 かつ、 Rangeオブジェクトの親(シート)オブジェクトが省ぶかれていますよね。 それでは質問のようになります。 シートオブジェクトを省いたRangeをシートモジュールに書くと、 他のブック(または同じブックの他のシート)をアクティブにしても Rangeオブジェクトはコードのあるシートを摑んだままです。 即ち今回の場合は、元ブックのそのコードの書いてあるシートということになります。   なので、フツーは、既出の回答のようにオブジェクト変数を使ったりしますが、 シートオブジェクトを省いたRangeオブジェクトを使いたいということであれば そのコードを【標準モジュール】に置き、シートからCallするようにします。 【標準モジュール】に置いておけば質問者が考えてるとおりになります。   これは一回でも経験したことがないと分からないことです。 例えば、元ブックのSheet1のCommandButtonをクリックして他のブックを開き そのブックのSheet1のセルを元ブックのSheet1へコピーする場合 '-------シートモジュール------------- Private Sub CommandButton1_Click()   Call CellCopy End Sub '-------標準モジュール------------------------   Sub CellCopy()   Workbooks.Open ThisWorkbook.Path & "\BBB.xls"   Range("A1:B5").Copy ThisWorkbook.Sheets("Sheet1").Range("B10")     ==その他の処理== End Sub '----------------------------------------------- とまあ、偉そうなことを書きましたが、 外していましたら、ご容赦願います!(^^;;; 以上。

westnorth1
質問者

お礼

標準モジュールを挿入して改めてやったら、 成功しました!! こんな簡単なことに気づかなかったとはお恥ずかしい限りです。 適当な勉強は駄目ですね・・・しっかり勉強し直します。 ありがとうございました!!

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

No.1の方の指摘のように変数を使うべきです。 Dim WkBk As Workbook Dim WkSt As WorkSheet Dim Rng As Range Set WkBk = Workbooks(BookBango & ".xls") Set WkSt = WkBk.WorkSheets(2) Set Rng = WkSt.Range(Cells(1, 1), Cells(paste_counter, 3)) または Set Rng = WkSt.Range("A1:C" & Cstr(paste_counter)) Rng.Copy・・・

westnorth1
質問者

お礼

単に標準モジュールに記述していなかったための問題でした・・・ お恥ずかしい限りです。 ご回答ありがとうございました。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

With ~ End With や 変数を使用するのが一般的だと思います 例として '------------------------------------------ Workbooks(BookBango & ".xls").Sheets(2).Range("A1").Value="aaa" MsgBox Workbooks(BookBango & ".xls").Sheets(2).Range("A1").Value '------------------------------------------ のような処理があるとします Withを使用すると '------------------------------------------ With Workbooks(BookBango & ".xls").Sheets(2).Range("A1") .Value="aaa" MsgBox .Value End With '------------------------------------------ で済みます また、次のような処理の場合は '------------------------------------------ Workbooks("aaa.xls").Sheets("aaa").Range("A1").Value=Workbooks("bbb.xls").Sheets("bbb").Range("A1").Value          ・          ・          ・ Workbooks("aaa.xls").Sheets("aaa").Range("A10").Value=Workbooks("bbb.xls").Sheets("bbb").Range("A10").Value '------------------------------------------ 変数を使用するのが良いと思います '------------------------------------------ Dim aaa As Object Dim bbb As Object Set aaa=Workbooks("aaa.xls").Sheets("aaa") Set bbb=Workbooks("bbb.xls").Sheets("bbb") aaa.Range("A1").Value=bbb.Range("A1").Value          ・          ・          ・ aaa.Range("A10").Value=bbb.Range("A10").Value '------------------------------------------ のようにすれば、修正があった場合 例えば aaa.xlsをccc.xlsに bbb.xlsをddd.xlsに修正したい場合も Set aaa=Workbooks("aaa.xls").Sheets("aaa") Set bbb=Workbooks("bbb.xls").Sheets("bbb") の部分を Set aaa=Workbooks("ccc.xls").Sheets("aaa") Set bbb=Workbooks("ddd.xls").Sheets("bbb") で修正は終わりです 解り難い説明ですみません

westnorth1
質問者

お礼

単に標準モジュールに記述していなかったための問題でした・・・ お恥ずかしい限りです。 変数を扱う方法も初めて知りましたので、 今後使えそうだったら、是非使ってみたいと思います。 丁寧なご回答ありがとうございました!

関連するQ&A

  • VBAにて別シートに貼り付けたいのでができません

    今開いているファイル(A)内のシート(依頼)にVBAを以下の用に記述しました。 これをデスクトップにあるファイル(提出)内のシート(データ更新)に貼り付けたいのですが できません。 「インデックスが有効範囲にありません。」と表示されます。 どこが悪いか教えて下さい。 sub 取り込み( ) Sheets("依頼").Range(Cells(15, 2), Cells(30, 21)).Copy Workbooks.Open Filename:="C:\Documents and Settings\Administrator\デスクトップ \作業中\提出.xls" Sheets("データ更新").Select Range(Cells(15, 2), Cells(15,2)).Select     ActiveSheet.Paste Application.CutCopyMode = False End sub

  • VBAであるBOOKの「sample」というシートを別BOOKに

    VBAであるBOOKの「sample」というシートを別BOOKに 別Bookにコピーしたいのですが、 ネットを参考にして下記のようにするとエラーになります。 実行時エラー'9' 「インデックスが有効範囲にありません」 と表示されます。 どこが間違っているでしょうか? どなたか教えてください。 ---------------------------------------- Dim NewBook As Workbook Dim fName As String Set NewBook = Workbooks.Add fName = ThisWorkbook.Path & "cp.xls" NewBook.SaveAs Filename:=fName Workbooks("moto.xls").Sheets("ピッキング").Cells.Copy Workbooks(fName).Sheets("Sheet1").Paste Destination:=Cells(1, 1) '<---ここでエラー Workbooks(fName).Save ----------------------------------------

  • シートを別のブックに複数自動コピー

    初質問です。よろしくお願いします。 マクロを使って、あるブックのシート(20から50枚程度)を、別の貼り付け先のブックに自動的にコピーしようとすると、10回をすぎたあたり(必ずしも一定せず)で 「実行時エラー'1004': WorksheetクラスのCopyメソッドが失敗しました。」 というエラーと共にマクロが止まり、デバッグしようとすると 「ActiveSheet.Copy After:=Workbooks("貼り付け先ブック.xls").Sheets("○○シート")」 のところで止まっています。 マクロの記述内容は以下の通りです。 Sheets("貼り付け元シート").Activate ActiveSheet.Copy After:=Workbooks("貼り付け先ブック.xls").Sheets("○○シート") Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False Range("A1").Select Windows("貼り付け元ブック.xls").Activate ・・・以下貼り付け元シートを変えつつ複数回繰り返し これができる様になれば非常にラクになるので、ぜひご教授願います。

  • ブックの保護(シート構成) でシートのコピー

    エクセルで外部データを参照させるために, 別のブックを開きシートをコピーし元のブックに貼り付け別のブックは閉じるというマクロを作成しました。 Workbooks.Open Filename:=a Sheets("データ").Select Sheets("データ").Copy After:=Workbooks("ファイル.xls").Sheets("メニュー") Workbooks(a).Close SaveChanges:=False a(変数)というファイルを開く シートのデータを選択 データをコピーし ファイル.xls のメニューシートの後に貼り付け a(変数)のエクセルファイルを保存せずに閉じる 動作としては正常に動きました。 しかし、この ファイル.xls には ID とパスワードで管理しています。 その管理したシートがあるんですが、それを表示させないために シートを非表示→ブックの保護→シート構成 を行いました。 マクロを動かすと、シート構成をしているので Sheets("データ").Copy After:=Workbooks("ファイル.xls").Sheets("メニュー")  が動かないことに気が付きました。 何かいい方法があればご教授お願いします。

  • EXCEL VBA セルからファイル名を読み込む

    EXCEL VBAについての質問です 同じ処理を名前の違う複数のファイルで行いたいと思っています そこで、セルA2へファイル名の『○○.xls』○○部分だけをそれぞれのファイルに書き込んでおき、マクロは共通にしてファイル名をそれぞれのファイルから読み込んで実行したいと思っています。 良い方法を教えてください。 Workbooks("200809.csv").Activate Sheets("200809").Select Range("C3:C33").Copy Windows("○○.xls").Activate'←ここをファイルにあわせて変更できる形にしたい Sheets("報告書").Select Range("G5:G35").Select ActiveSheet.Paste Windows("200809.csv").Activate Range("K3:K33").Copy Windows("○○.xls").Activate’←ここ Sheets("報告書").Select Range("I5:I35").Select ActiveSheet.Paste Workbooks("200809.csv").Close SaveChanges:=False よろしくお願いします。

  • VBA 一個前のシートのデータをコピーして貼付

    (1) Private Sub Workbook_Open()に、マクロの記録で作成した(2)を組み込んで処理をしたいのですが、一つ前のファイルを選択する記述・一つ前のシートを指定する記述が判りません。 ●御教示いただきたい事項 ・(1)で開かれた時、ファイルはマスター.xls が開いていますが、 ファイル名 ccc.xlsが開いた状態にする記述のしかた。     ・(2)が各シートで実行される、共通の記述のしかた。 (1) Private Sub Workbook_Open() Workbooks.Open Filename:="C:\Documents and Settings\aaa\My Documents\bbbマスター\マスター.xls" End Sub (2)  ファイル名 ccc.xlsにマクロの記録で作成 Sub Macro4()     Range("J11").Select     'Sheets("7月")のセル J11 Sheets("6月").Select  Range("I7").Select Selection.Copy Sheets("7月").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

  • VBAで名前を付けて保存

    テキストファイルをエクセル出力する処理を考えております。 テキストファイルを開き、名前をつけて保存する処理が上手くできません。 シート1のある2つのセルに入力パスと出力パスが設定されているとします。 例えばcells(4,4)に入力パスが設定されており(¥~~~.txt) cells(6,4)に出力パスが設定されており(¥~~~xls) 上記のような状態とします。 cells(4,4)にあるテキストファイルを開き、 それを拡張子をエクセルにしてcells(6.4)にある出力先に名前をつけて保存をしたいのです。 オープンする場合は Workbooks.OpenText Filename:=Workbooks("○○.xlsm").Sheets(1).Cells(4, 4).Value & ".TXT" で上手くいきました。 しかし保存の際に ActiveWorkbook.SaveAs Filename:=Sheets(1).Cells(6, 4).Value & ".xls" で実行するとエラーがでてしまいます。 どうすれば良いでしょうか。

  • エクセルVBAで書式と値の貼付けにつて

    エクセル2007VBAで新規ファイルを作る場合のコピー、貼り付けで質問しましたが 式も全て貼り付けになるとUSBメモリーで持ち出した場合、エラーとなります。 それで値と書式のみ貼り付けする様下記の様に書き直しましたが、.PasteSpecialでメソッドまたはデータメンバーが見つかりませんとなります。 ぐぐっててヘルプを見ますが解決出来ません。どなたがご教授お願いします。 元の式 Sub DGCopy() Workbooks.Add With ThisWorkbook .Sheets(5).Cells.Copy Sheets(1).Cells Sheets(1).Select Sheets("Sheet1").Name = "電気代" .Sheets(6).Cells.Copy Sheets(2).Cells Sheets(2).Select Sheets("Sheet2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ' ダイアログでCancelをクリックした場合 ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub 書き直した式 Sub DGCopy() Workbooks.Add With ThisWorkbook Sheets(5).Select Cells.Selection.Copy Sheets(1).Selection .PasteSpecial Paste:=xlPasteFormats ←エラー部分 .PasteSpecial Paste:=xlPasteValues Sheets("sheets1").Name = "電気代" Sheets(6).Select Cells.Selection.Copy Sheets(2).Selection .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteValues Sheets("sheets2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub

  • 異なるブック間でのセル範囲のコピー/VBA

    異なるブック間でクリップボードを経由せず直接コピーしたいため 下記のマクロを記述していますが、実行エラーが発生します。 どうしてでしょうか。 ThisWorkbook.Worksheets(3).Range(Cells(3, 1), Cells(3 + a, 1)).Value = Workbooks("excel.xls").Worksheets(1).Range(Cells(11, 3), Cells(11 + a, 3)).Value (補足) (1)VBA実行中のThisWorkbook、excel.xlsは別のブック ですが、同じフォルダにあります。 (2)aは数値が入る変数です。

  • エクセルのシートのコピーについて

    シートのコピーをVBAで行いたいのですが、エラーになってしまいます。 間違っている箇所が分からないのでご教授お願いします。 貼り付けというブックにマクロが組まれています。 ”データ”のブックにあるシート名が”貼り付けのブックのリスト”のシートに記載されています。 リストのシートに記載されているシートを貼り付けのブックにコピーしたいです。 よろしくお願いします。 Sub シートコピー() 行数 = 2 Do Until IsEmpty(Cells(行数, 3).Value) コピー元 = Workbooks("貼り付け.xls").Worksheet("リスト").Cells(行数, 3) Workbooks("データ.xls").Worksheet(コピー元).Copy After:=Workbooks("貼り付け.xls").Sheets(Workbooks("貼り付け.xls").Sheets.Count) 行数 = 行数 + 1 Loop End Sub

専門家に質問してみよう