• ベストアンサー

Excel他のブックから情報をコピーする方法

いつも大変参考にさせていただいております。 Excelで他のブックの値を、今使っているブックにコピーする方法を探しております。 値のみを引く方法として、WEBより以下の方法がわかりました。 Sub TEST1() Workbooks.Open Filename:=ThisWorkbook.Path & "\Book2.xlsx" Dim Wb1, Wb2 Set Wb1 = ThisWorkbook Set Wb2 = Workbooks("Book2.xlsx") Wb2.Worksheets("Sheet1").Range("D7:D9").Copy Wb1.Worksheets("Sheet1").Range("B1") End Sub これを変更して作っていきたいとおもうのですが、最終的にVBAを起動させると コピー元となるExcelをユーザーが自分で選択するようにしたいです。(Excelの画像の挿入で、デバイスから選択 とするようなイメージです) その場合、どのようにしたら成せるでしょうか。 選択するブックは必ず複数シートあり、そのすべてをコピーしたいと思っています。 どなたか分かるかた、ご助力いただけますと助かります。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.5

> Wb2.Worksheets("Sheet1").Range("D7:D9").Copy Wb1.Worksheets("Sheet1").Range("B1") で > 各箇所を指定しようと思ったのですが、うまくいきませんでした。 > 「アプリケーション定義、オブジェクト定義のエラーです」と表示されてしまします。 その部分ではエラーにならないと思いますよ。 アプリケーション定義、オブジェクト定義のエラーです で検索して該当する状態の部分が無いか探してみてください。

その他の回答 (4)

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.4

> 各シートごとに記入されているセル範囲が異なります。 どのような異なり方なのかが分かりませんので参考になると思われるサイトだけ紹介しておきます。 最終行・最終列の取得方法 https://excel-ubara.com/excelvba4/EXCEL222.html 最終行・最終列取得の説明ですが CurrentRegion UsedRange はそれだけで範囲を取得できます。ただし、それぞれ問題点がありますのでそのあたりは説明を読んでくださいね。 以下のような感じでそれぞれどこまで範囲として取得されるのかテストすれば一応確認はできますよ。 Sheets(1).UsedRange.Select Sheets(1).Range("A1").CurrentRegion.Select

hiyokoou
質問者

お礼

何度もご教授いただき誠にありがとうございます。 いただいたURLの方法ですと、既述のある最終列と最終行までを見に行く というものだったのですが、コピーしたい範囲はシート内の限定的な範囲になります。 その為、 Wb2.Worksheets("Sheet1").Range("D7:D9").Copy Wb1.Worksheets("Sheet1").Range("B1") で 各箇所を指定しようと思ったのですが、うまくいきませんでした。 「アプリケーション定義、オブジェクト定義のエラーです」と表示されてしまします。 この件ご助力いただけませんでしょうか。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.3

> いただいた回答ですと結果がエラーとなりました。「パスがみつかりません」と表示されます。 ChDir "C:\Ok" のところを変更していないからだと思いますよ。 > 第一シートは取得する情報がありません。 > また、取得する側(コピー内容を張り付ける側)のExcelにはその複数シートの内容を1シートにまとめたいと思っています。 回答No.1の感じかなと思いますので 取得される側の一番左端のシートはコピー対象にしないという事に変更して Sub TEST3() Dim Wb1 As Workbook, Wb2 As Workbook Dim Ws As Worksheet Dim mFileName As Variant Dim LastRow As Long Dim i As Long ChDir "C:\Ok" mFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") If mFileName = False Then Exit Sub End If Set Wb1 = ThisWorkbook Set Wb2 = Workbooks.Open(mFileName) With Wb1.Worksheets("Sheet1") For i = 2 To Wb2.Sheets.Count LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row If .Cells(1, "B").Value = "" Then LastRow = 0 Wb2.Sheets(i).Range("D7:D9").Copy .Cells(LastRow + 1, "B") Next End With Set Wb1 = Nothing Set Wb2 = Nothing End Sub

hiyokoou
質問者

お礼

度々のご回答ありがとうございます。 すでにベストアンサーなのですが、追加して伺っても良いでしょうか。 取り込みたい複数シートはシート名固定で、各シートごとに記入されているセル範囲が異なります。 個別シートごとに Range("") で範囲指定して、データを取得しようと思っています。 今、いただいた内容を調べながら解釈しようとしていますが、上記の方法もご教授頂けますと助かります。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.2

> 選択するブックは必ず複数シートあり、そのすべてをコピーしたいと思っています。 "D7:D9"をシート毎にコピーするという事も考えられますね。このあたり説明不足だと思いますよ。 全てのシートのデータを全てコピーするのでしたらブックをコピーすればいいと思うので無しですよね。 回答No.1で忘れてましたが 開くフォルダを指定したい場合は、今回のようにフォルダを指定してください ChDir "C:\Ok"  みたいにです。 Sub TEST2() Dim Wb1 As Workbook, Wb2 As Workbook Dim Ws As Worksheet Dim mFileName As Variant Dim i As Long, SCnt As Long ChDir "C:\Ok" mFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") If mFileName = False Then Exit Sub End If Set Wb1 = ThisWorkbook Set Wb2 = Workbooks.Open(mFileName) SCnt = Wb1.Sheets.Count If SCnt > Wb2.Sheets.Count Then SCnt = Wb2.Sheets.Count End If For i = 1 To SCnt Wb2.Sheets(i).Range("D7:D9").Copy Wb1.Sheets(i).Cells(1, "B") Next Set Wb1 = Nothing Set Wb2 = Nothing End Sub

hiyokoou
質問者

お礼

ご回答いただきありがとうございます。 質問させていただいたのは例で、いただいた答えをもって私のやりたいことに落とし込もうと思っていました。 実際には取得される側のExcelにはシート名が固定された複数シートあり(シート数固定)、第一シートは取得する情報がありません。 また、取得する側(コピー内容を張り付ける側)のExcelにはその複数シートの内容を1シートにまとめたいと思っています。 その後に取得する側のExcelには各表があり、その1シートにまとめた内容を関数を使ってそれぞれの表に表示する。 というExcelをつくりたいと思っています。 いただいた回答ですと結果がエラーとなりました。「パスがみつかりません」と表示されます。 また何かわかりましたらご教授いただけますと助かります。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.1

> 選択するブックは必ず複数シートあり、そのすべてをコピーしたいと思っています。 複数シートのD7:D9全てをB列に追加コピーしていくと考えたら Sub TEST1() Dim Wb1 As Workbook, Wb2 As Workbook Dim Ws As Worksheet Dim mFileName As Variant Dim LastRow As Long mFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") If mFileName = False Then Exit Sub End If Set Wb1 = ThisWorkbook Set Wb2 = Workbooks.Open(mFileName) With Wb1.Worksheets("Sheet1") For Each Ws In Wb2.Worksheets LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row If .Cells(1, "B").Value = "" Then LastRow = 0 Ws.Range("D7:D9").Copy .Cells(LastRow + 1, "B") Next End With Set Wb1 = Nothing Set Wb2 = Nothing End Sub

関連するQ&A

  • Excel VBAで参照先の変換

    ExcelのVBAでBook1.xlsxのSheet2とSheet2を参照しているSheet3をBook2.xlsxにコピーするプログラムを作成しているのですが、Sheet3のコピーが思うように行きません。 具体的にはSheet3が参照しているSheet2をBook1.xlsxからBook2.xlsxに変換する所です。 下記のようなプログラムを作成しました。 strDirectory = ThisWorkbook.Path strSrcBook = "Book1.xlsx" Workbooks.Open Filename:=strDirectory & "\" & strSrcBook, ReadOnly:=True Set wsSrc = Workbooks(strSrcBook).Worksheets("Sheet2") Set wsDst = ThisWorkbook.Worksheets("Sheet1") wsSrc.Copy After:=wsDst Set wsSrc = Workbooks(strSrcBook).Worksheets("Sheet3") Set wsDst = ThisWorkbook.Worksheets("Sheet2") wsSrc.Copy After:=wsDst wsDst.Range("D:D").Replace "[*]", "" Workbooks(strSrcBook).Close SaveChanges:=False Sheet3のD列がSheet2を参照しているのですが、上記を実行すると開くファイルの選択を要求され、キャンセルし続けると実行が完了しますが、コピーされたSheet3の参照先が正しく変換されずエラー表示となってしまいます。 「wsDst.Range("D:D").Replace "[*]", ""」が完了する前に「Workbooks(strSrcBook).Close SaveChanges:=False」が実行されてしまうのが原因と思われるのですが、実際のプログラムでは開くBookは1つではなくSheet1に記載したリストを順番に開いてコピーするという事を行っている為、作業が完了したBookは閉じるようにしたいです。 どの様に修正すれば「wsDst.Range("D:D").Replace "[*]", ""」が完了するのを待って、「Workbooks(strSrcBook).Close SaveChanges:=False」が実行されるように出来るのでしょうか?

  • Excel 2007 マクロ 別ブックのシートをコピーする方法

    Excel 2007 マクロ 別ブックのシートをコピーする方法 別ブックのシートをコピーして アクティブなブックのシートにコピーしたいと思います。 下記マクロを作成しました。 貼り付ける際に、クリップボードに保存するかどうか 聞かれるメッセージが表示されてうまくいきません。 またもっとシンプルな書き方があればアドバイスお願いします。 Sub 取り込み() Dim wb As Workbook Set wb = Workbooks.Open("\") Sheets("Sheet1").Select Cells.Select Selection.Copy ThisWorkbook.Activate ThisWorkbook.Sheets("特定").Select ActiveSheet.Cells(1, 1).Select ActiveSheet.Paste wb.Close End Sub

  • Excel2007VBA ブックのアクティブ化

    ●質問の主旨(2点) 1.以下のコードは、なぜエラーが返されるのでしょうか? 2.タスクバーにあるアクティブ状態ではないブックの1枚目シートを 選択するためには、以下のコードをどのように書き換えれば良いでしょうか? ●質問の補足 タスクバーにはエクセルブック「Book1」と「Book2」を表示させ、 「Book1」の「sheet1」がアクティブになっています。 Book1の標準モジュールに以下のコードを記述しています。 Sub sample1() Workbooks("Book2.xlsx").Activate Worksheets("sheet1").Select End Sub しかし実行すると「実行時エラー9インデックスが有効範囲にありません」と エラーが返されます。なぜそうなるのかが分かりません。 ご存知の方がいらっしゃればご教示よろしくお願い申し上げます。 私はVBA初心者です。

  • Excel2000で、特定のシートを新規ブックに保存したい

    マクロ実行中のブックの特定のシートを新規ブックに保存したいのです。 特定のシートは、任意で複数枚あるとします。 但し、クリップボードや、Activeメソッド、Selectメソッドなど、 マクロ実行中に、Windowsの他のアプリケーションに 影響の出る恐れがあるロジックは使用しないとします。 また、特定のシートには、罫線や色の設定なども してあり、新規ブックに書式も保存します。 以下のコードは、クリップボードを経由せず、セルをコピーしています。 Sub a() Dim xlsApp As Excel.Application Dim xlsBook As Excel.Workbook Dim xlsSheet As Excel.Worksheet Set xlsApp = CreateObject("Excel.Application") Set xlsBook = Workbooks.Add  '★1 Set xlsSheet = xlsBook.Worksheets(1) '★2 ThisWorkbook.Worksheets("Sheet1").Range("A1:D200").Copy _ Destination:=xlsBook.Worksheets("Sheet1").Range("A1:D200") xlsBook.Close xlsApp.Quit Set xlsApp = Nothing Set xlsBook = Nothing Set xlsSheet = Nothing End Sub このコードは、ちゃんと動きます。 しかし、問題があります。 xlsApp.ScreenUpdating = False xlsApp.Visible = False など上記のコードに追加すると、新規ブックの操作できません。 ★1の部分で、 Set xlsBook = Workbooks.Add  としているからです Set xlsBook = xksApp.Workbooks.Add  とすると、 xlsApp.ScreenUpdating = False xlsApp.Visible = False など、新規ブックの操作ができます。 しかし、 Set xlsBook = xksApp.Workbooks.Add  では ★2の ThisWorkbook.Worksheets("Sheet1").Range("A1:D200").Copy _ Destination:=xlsBook.Worksheets("Sheet1").Range("A1:D200") で、「RangeクラスのCopyメソッドが失敗しました。」 とエラーが発生します。 何か良い方法はありますか?

  • エクセルVBAで他のbookのセルcellsで参照

    エクセルVBAで他のbookのセルの値(一定の範囲)を参照したいのですが、変数を使いたいため、cellsを使用したいのですがうまくいきません。方法はないでしょうか。 下記に例を示します。 rangeを使用すればすべてok((2)(5))(この場合はset文を使用しなくてもok(5))。同じbookならcells使用ok(4)。 他のbookをcells文使用する方法はないでしょうか(もちろんできれば、Thisbookの方もcellsを使用したい)。 よろしくお願いします。 sub test() Dim ThisBook As Workbook Dim Workbook2 As Workbook 'マクロを実行しているワークブック Set ThisBook = ThisWorkbook '他のワークブック Set Workbook2 = Workbooks("test11.xlsx") ' 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value  '(1)だめ 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range("a1:b2").Value '(2) OK 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test11.xlsx").Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value '(3) だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test1.xlsm").Worksheets(1).Range(Cells(3, 3), Cells(4, 4)).Value  '(4)だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:ii8000").Value = Workbooks("test11.xlsx").Worksheets(1).Range("a1:ii8000").Value  '(5) ok End Sub

  • 各ブックの集計値を自動的に他のブックに総合計として表示させたい。

    エクセルで各ブックの集計値を他のブックに集計したいのですが、フォルダを移動させると数値が違ってしまう。どうすればいつ見ても正しい集計値を見れるか教えて下さい。 現在1つのファイルの中にある、ブック1・2・3にそれぞれ数値を入力して合計値をブック3の別シートに合計表示させていますが、同じブックのシート間の集計ではないため、毎回数値が変わってしまい、その都度計算式を(=ブック1 D60+ブック2 d80+・・・など)を入れなおしています。 間違いなく集計できる方法を教えて下さい。ちなみに全くの初心者なので細かく説明していただけると有難いです。 VBAで検索して下記を見つけ、セル範囲やシート名など変更して試してみましたが、内容がよくわからないため 変な数字がでてきました。初心者にはやはり無理でしょうか? Sub Test() Dim MyName As String, wb As Workbook On Error Resume Next MyName = Dir(ThisWorkbook.Path & "\*.xls", vbNormal) Do While MyName <> ""   If UCase(MyName) <> UCase(ThisWorkbook.Name) Then    Application.ScreenUpdating = False    Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & MyName)    ThisWorkbook.Worksheets("Sheet1").Range("A65536").End(xlUp) _      .Offset(1, 0).Value = wb.Worksheets("物件").Range("d90:k90").Value    wb.Close   End If   MyName = Dir Loop Application.ScreenUpdating = True End Sub

  • 他のブックからシートをコピーする

    ExcelVBA勉強中の者です。 他のブックのsheet1をコピーし、使用中のブックのsheet1にペーストする事を目的に ネットの情報を参考に以下のコードを作成しました。 Sub test() Dim book1 As Workbook '変数book1をワークブック型で宣言 Dim book2 As Workbook '変数book2をワークブック型で宣言 Set book1 = Application.ActiveWorkbook 'アクティブになっているブックをbook1へセット Application.ScreenUpdating = False '画面の更新を止める '↓アドレスのブックを開く事までbook2にセット(ReadOnly:=Trueで読み込み専用) Set book2 = Application.Workbooks.Open("C:\Documents and Settings\AAA\デスクトップ\他のブック.xls", ReadOnly:=True) book2.Sheets("Sheet1").Copy after:=book1.Worksheets("sheet1") Set book1 = Nothing '変数book1を開放 book2.Close SaveChanges:=False 'book2を閉じる(SaveChanges:=Falseで保存せずに終了) Application.ScreenUpdating = True '画面の更新を再開する Set book2 = Nothing '変数book2を開放 End Sub 動作としては上手くいったのですが、 book2.Sheets("Sheet1").Copy after:=book1.Worksheets("sheet1") の部分でペースト先を変数book1のsheet1と指定しているにも関わらず sheet1(2)という新しいシートが作成され、そちらへペーストしてしまいます。 思うに「コピーしたシートを挿入する」という動作であると思われますが、 これをペーストするという表記が出来ず困っております。 お手数お掛けしますがどなたかご助力お願い致します。 *Excelのバージョンは2002を使用しております。

  • Excel マクロ 別ブックの情報をコピーする方法

    他のブックの情報をコピーして貼り付けるマクロを作成しています。 2種類のブックから情報をコピーして貼り付けます。 Sub MailTemp() Dim myCellall As Range Dim myCellyoso As Range Dim myCellfor As Range Set myCellall = Sheets("すべて").Range("A3") With Workbooks.Open("\") With .Worksheets("すべて") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellall End With .Close False End With Set myCellyoso = ThisWorkbook.Worksheets("予測").Range("A3") Set myCellfor = ThisWorkbook.Worksheets("結果").Range("A3") With Workbooks.Open("\別ブック") With .Worksheets("予測") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellyoso End With With .Worksheets("結果") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellfor End With .Close False End With End Sub 下記の箇所でエラーが発生して、先に進みません。 原因を調べていましたが、わかりません。 Set myCellfor = ThisWorkbook.Worksheets("結果").Range("A3") エラーメッセージ 実行時エラー'9' インデックスが有効範囲にありません。 アドバイスを頂けますでしょうか。 よろしくお願いいたします。

  • 他Bookへの抽出

    お世話になります。 開いているBook1からデータを抽出し、Book2へコピーしたいのですが、AdvancedFilterでエラーが出てしまいます。 何がまずいのかよくわかりません。 お分かりになる方、ご教授願います。 Private Sub Worksheet_Activate() Set myTbl = Workbooks("Book1.xls").Worksheets("Sheet1").Range("myTbl") Set myQry = Workbooks("Book2.xls").Worksheets("抽出条件").Range("A_抽出条件") Set sakiRng = Workbooks("Book2.xls").Worksheets("A").Range("A3:AR3") myTbl.AdvancedFilter xlFilterCopy, myQry, sakiRng ←ここでエラーになります。 Dim rw As Long '入力最終行 rw = Range("I65536").End(xlUp).Row With Application Range("I" & rw + 1) = .Sum(Range("I1:I" & rw)) Range("AO" & rw + 1) = .SumIf(Range("AP1:AP" & rw), "済", Range("AO1:AO" & rw)) Range("AQ" & rw + 1) = .Sum(Range("AQ1:AQ" & rw)) End With End Sub

  • Excel VBA 非表示の別ブックへシートコピー

    Excel2010のVBAで、別のExcelブックを非表示で開いて、 シートをコピーすると、 「実行時エラー'1004':WorksheetクラスのCopyメソッドが失敗しました。」 というエラーが出て、正しくシートをコピーすることができません。 (1)のように自分のブックへはシートをコピーすることはできるのですが、 (2)のように別のExcelブック上でシートをコピーする場合と (3)のように別のExcelブック上にシートをコピーする場合の いずれも同様のエラーになります。 どのように記述すれば(2)と(3)でもコピーすることができるのでしょうか。 ------------------------------------------------------------- Sub test()  Dim newEx As Excel.Workbook  Dim newFile As String  newFile = ThisWorkbook.Path & "\New_Book.xlsx"  Set newEx = Workbooks.Open(newFile, UpdateLinks:=0)  Application.Windows("New_Book.xlsx").Visible = False  '(1)New_BookのSheet3を自分のブックにコピーする (正常)  newEx.Worksheets("Sheet3").Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)  '(2)New_BookのSheet3をNew_Bookにコピーする (エラー)  newEx.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  '(3)自分のブックのSheet3をNew_Bookにコピーする (エラー)  ThisWorkbook.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  Application.Windows("New_Book.xlsx").Visible = True  Application.DisplayAlerts = False  newEx.Save  newEx.Close  Application.DisplayAlerts = True  Set newEx = Nothing End Sub -------------------------------------------------------------

専門家に質問してみよう