複数のExcelBookの特定セルの取得

このQ&Aのポイント
  • Excel2003について教えてください。複数の同じ内容のBookがあり、このBook内のあるシート内のセルの内容を集めて、別のブックにリストを作成したいのですが、別のコンピュータに複数のBookがあり、これを自分のマシンから参照するとすごく時間がかかります。高速で取り込む方法はないでしょうか?
  • 現在以下のVBAでやっています。Sub リスト取得() Dim eBookname As String 'Book名 Dim DrvDir As String 'ドライブフォルダ Dim rw As Long '行カウンタ Dim TargetCell0 As String '集計するセル Dim TargetCell1 As String '集計するセル Dim TargetCell2 As String '集計するセル Dim TargetCell3 As String '集計するセル TargetCell0 = "B4" TargetCell1 = "C4" TargetCell2 = "H4" TargetCell3 = "I2" DrvDir = ThisWorkbook.Path & "\" & "Working" & "\" '*** フォルダパスをセットします With Worksheets("一覧") .Range("C4:F65535").ClearContents '表示用のC~F列をクリア rw = 3 'フォルダを検索してxlsファイルを特定する eBookname = Dir(DrvDir & "*.xls") Application.Calculation = xlCalculationManual While eBookname <> "" '順にSheet1に書き出していく rw = rw + 1 .Range("C" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell0 .Range("D" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell1 .Range("E" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell2 .Range("F" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell3 eBookname = Dir Wend End With Application.Calculation = xlCalculationAutomatic MsgBox "リストを更新しました。" & vbCrLf & vbCrLf & "取得件数 " & rw - 3 & " 件です。", vbInformation, "" End Sub
  • Excel2003について教えてください。複数の同じ内容のBookがあり、このBook内のあるシート内のセルの内容を集めて、別のブックにリストを作成したいのですが、別のコンピュータに複数のBookがあり、これを自分のマシンから参照するとすごく時間がかかります。高速で取り込む方法はないでしょうか?
回答を見る
  • ベストアンサー

複数のExcelBookの特定セルの取得

Excel2003について教えてください。 複数の同じ内容のBookがあり、このBook内のあるシート内のセルの内容を集めて、別のブックにリストを作成したいのですが、別のコンピュータに複数のBookがあり、これを自分のマシンから参照するとすごく時間がかかります。 高速で取り込む方法はないでしょうか? 現在以下のVBAでやっています。 Sub リスト取得() Dim eBookname As String 'Book名 Dim DrvDir As String 'ドライブフォルダ Dim rw As Long '行カウンタ Dim TargetCell0 As String '集計するセル Dim TargetCell1 As String '集計するセル Dim TargetCell2 As String '集計するセル Dim TargetCell3 As String '集計するセル TargetCell0 = "B4" TargetCell1 = "C4" TargetCell2 = "H4" TargetCell3 = "I2" DrvDir = ThisWorkbook.Path & "\" & "Working" & "\" '*** フォルダパスをセットします With Worksheets("一覧") .Range("C4:F65535").ClearContents '表示用のC~F列をクリア rw = 3 'フォルダを検索してxlsファイルを特定する eBookname = Dir(DrvDir & "*.xls") Application.Calculation = xlCalculationManual While eBookname <> "" '順にSheet1に書き出していく rw = rw + 1 .Range("C" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell0 .Range("D" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell1 .Range("E" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell2 .Range("F" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell3 eBookname = Dir Wend End With Application.Calculation = xlCalculationAutomatic MsgBox "リストを更新しました。" & vbCrLf & vbCrLf & "取得件数 " & rw - 3 & " 件です。", vbInformation, "" End Sub

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

リンク式で引っぱってくるのは結構速いほうだと思うので、 >別のコンピュータに複数のBookがあり というのがそもそものネックのような気もしますね。 ですが取りあえず、ScreenUpdating と EnableEvents プロパティも制御する事と、 配列を使ってまとめて書き込むようにしたら少しは変わるかも。 Sub try()   Const TargetCell0 As String = "B4" '集計するセル   Const TargetCell1 As String = "C4" '集計するセル   Const TargetCell2 As String = "H4" '集計するセル   Const TargetCell3 As String = "I2" '集計するセル   Dim eBookname As String      'Book名   Dim DrvDir  As String      'ドライブフォルダ   Dim sFormula As String      '共通文字   Dim rw    As Long       '行カウンタ   Dim x(1 To 65531, 1 To 4)     '式文字列格納用配列      '*** フォルダパスをセットします   DrvDir = ThisWorkbook.Path & "\" & "Working" & "\"   With Application     .ScreenUpdating = False     .EnableEvents = False     .Calculation = xlCalculationManual   End With   With Worksheets("一覧")     '表示用のC~F列をクリア     .Range("C4:F65535").ClearContents     'フォルダを検索してxlsファイルを特定する     eBookname = Dir(DrvDir & "*.xls")     While eBookname <> ""       rw = rw + 1       sFormula = "='" & DrvDir & "[" & eBookname & "]ワーク'!"       x(rw, 1) = sFormula & TargetCell0       x(rw, 2) = sFormula & TargetCell1       x(rw, 3) = sFormula & TargetCell2       x(rw, 4) = sFormula & TargetCell3       eBookname = Dir     Wend     .Range("C4:F4").Resize(rw).Formula = x   End With   With Application     .ScreenUpdating = True     .EnableEvents = True     .Calculation = xlCalculationAutomatic   End With   MsgBox "リストを更新しました。" & vbCrLf & vbCrLf & "取得件数 " & rw & " 件です。", vbInformation, "" End Sub

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

>別のコンピュータに複数のBookがあり、これを自分のマシンから >参照するとすごく時間がかかります。 自分のPCにブックをコピーしてからではダメなのですか?

関連するQ&A

  • 複数のエクセルブックを開かず特定シートのセル抽出

    他の方の質問を参考に自作しましたが動作に時間が掛かる為、教えて下さい。  PCはWin10、エクセル2016、ファイル形式はxlsm  該当フォルダはネットワーク上\\○○○○\Users\ この中に複数ブックが存在  抽出したいデータは全てのブックの「メニュー」というSheetのA100からAO100までを  「集計.xlsm]のSheet1の2行目から抽出結果をA2からAO2までを2行目、3行目とずらして値で貼り付けたい 作成したVBAを見て良い方法をご教授下さい。 Sub 集約() Dim myFolder As Variant Dim fso As Object Dim GetFolder As Object Dim Fol As Object Set fso = CreateObject("Scripting.FileSystemObject") With Application.FileDialog(msoFileDialogFolderPicker) If .Show <> 0 Then myFolder = .SelectedItems(1) End If End With With CreateObject("WScript.Shell") .CurrentDirectory = myFolder End With Set GetFolder = fso.GetFolder(myFolder) For Each Fol In GetFolder.SubFolders Debug.Print Fol.Name Next Set GetFolder = Nothing 'フォルダの場所を変数に入れる Dim Folder_path As String Folder_path = Range("a1").Value '集計先のシートを指定し、変数に入れる Dim w Set w = Worksheets("sheet1") '集計するブックを変数に入れる Dim Merge_book As String Merge_book = Dir(Folder_path & "\*.xlsm*") 'いったん数値をクリア w.Range("b" & Rows.Count).Clear '集計先のシートの1行からスタート Dim n n = 4 '指定したフォルダから、Excelファイルを探す Do Until Merge_book = "" Workbooks.Open FileName:=Folder_path & "\" & Merge_book '見つかったら、A列にファイル名、B列に集計値を入れる w.Range("a" & n).Value = Merge_book w.Range("b" & n).Value = Workbooks(Merge_book).Worksheets("メニュー").Range("a100").Value w.Range("c" & n).Value = Workbooks(Merge_book).Worksheets("メニュー").Range("b100").Value w.Range("d" & n).Value = Workbooks(Merge_book).Worksheets("メニュー").Range("c100").Value    ・・・・・・・・・・・・・・・省略・・・・・・・・・・・・・                         ・ ("ao100").Value w.Range("ap" & n).Value = Workbooks(Merge_book).Worksheets("メニュー").Range '次の行へ n = n + 1 '集計するブックを閉じる Workbooks(Merge_book).Close '次のファイルを探しに行く Merge_book = Dir() Loop End Sub この方法は1つのフォルダ直下に全てのブックを入れないと動かないのでPCの容量に負担が掛かり画面もチラチラし、時間も掛かる為、もっと効率的な方法で作業を行いたいのです。 よろしくお願いいたします。

  • 複数のエクセルデータ上特定位置の値を一つのセルに2

    前回の質問「複数のエクセルデータ上特定位置の値を一つのセルに」に対し、ベストアンサーを教えていただきました。その質問とご回答のポイントは次の通りです。 質問: 大量の同じフォーマットのエクセルファイル(Book1,Book2...)があり、それぞれのBookファイルの「NO.」シートのD6セルには番号が入っています。それぞれファイルでSheet1の特定のセル(例えばB4セル)の値を「データ」ファイルのSeet1にまとめたいです。「データ」ファイルのA列には「NO.」が入力されているので、Bookファイルの値はそれぞれ対応する番号の右側3番目のセルに移したいです。 ご回答: sub macro1()  dim myPath as string  dim myFile as string  dim myNo as variant  dim myRng as range  on error resume next  application.screenupdating = false  mypath = "c:\test\" ’book1,2,3…の保存場所を指定する事  myfile = dir(mypath & "*.xlsx") ’拡張子を正しく指定すること  do until myfile = ""   workbooks.open mypath & myfile   myno = workbooks(myfile).worksheets("No.").range("D6").value   set myrng = thisworkbook.worksheets("Sheet1").range("A:A").find(what:=myno, lookin:=xlvalues, lookat:=xlwhole)   myrng.offset(0, 3).value = workbooks(myfile).worksheets("Sheet1").range("B4").value   workbooks(myfile).close savechanges:=false   myfile = dir()  loop  application.screenupdating = true end sub 現在Excel2007を使っており、Bookファイルが全部(.xlsx)の状態では問題なく使えましたが、ファイルが97-2003の(.xls)バージョンになると、マクロを実行したときに次のメッセージが出ます。「データ.xlsmは既に開いています。2重に開くと、これまでの変更内容は破棄されます。データ.xlsmを開きますか?」 もちろんご回答の中の「myfile = dir(mypath & "*.xlsx") ’拡張子を正しく指定すること」は("*.xls")に変更されている状態です。 何が問題なのか全く分からず、困っています。どなたか教えていただけないでしょうか? よろしくお願い致します。

  • 複数のファイルの、複数のシートにあるD9セルの数字を、新しいブックにリ

    複数のファイルの、複数のシートにあるD9セルの数字を、新しいブックにリストしたいのですが、上手くいかないようです。 以下、それらしきマクロのコピペです。 (使用ソフトはエクセル2003です) Sub sample() Dim folder As String Dim sh As Worksheet Dim file As String Dim r As Long folder = "C:\abc\M1501~M2140\" 'ファイルがあるフォルダ sh.Range("A1").Value = "ファイル名" '見出し sh.Range("B1").Value = "A1" '同上 r = 2 '結果出力行の初期値 file = Dir(folder & "*.xls") 'フォルダ内の最初の.xlsファイルを取得 Do While file <> "" 'ファイル名がある間 Workbooks.Open folder & file 'そのファイルを開く sh.Range("A" & r).Value = file '結果シートのA列にファイル名を sh.Range("B" & r).Value = ActiveWorkbook.Sheets("あいうえお").Range("D9") '結果シートのB列に開いたブックのあいうえおのD9の値 ActiveWorkbook.Close False '開いたブックを閉じる r = r + 1 '結果出力行+1 file = Dir '次のファイル名取得 Loop '繰り返す End Sub これですと、「あいうえお」のシートのD9しか結果表示されないようです(実際、これは複数ファイルからの抽出用です)。 この式に複数シート対応の式を加えれば出来そうな気がするのですが、ここからどうすればいいかわかりません; 上記の式を大幅変更でも構いませんので、教えて下さい。

  • ExecuteExcel4Macroでセル値取得

    office2010 あるフォルダにファイルを入れて、ファイルを開かずに対象シートの対象セルの値を取得したいです。 この取得したいセル情報を、変数で指定したいのです。 C:\dataに取得元のファイルが入っています。 このファイル名((1))は、いろいろ変わりますが、中にH4という文字があります。 対象シートのシート名とセルアドレスは、別のファイル(これにマクロがあります) のsettingシートで指定します。 1例ですが、settingシートの B2に11_001 C2にAF9 と設定します。 (1)のファイルで11_001というシートのAF9セル値を取得したいのです。 Dim myPath As String Dim myFile As String myPath = "C:\data\" myFile = Dir(myPath & "*H4*.xlsm") Dim sheetname As String Dim cell As String sheetname = Worksheets("setting").Range("B2") cell = Worksheets("setting").Range("C2").Value ' 'Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!R9C32") Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!" & cell & "") 上記で、 Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!R9C32") は、値取得できます。 このR9C32を変数にする所で、エラーが発生します。 実行時エラー1004と。 いろいろWEB見て、’,スペース等を入れてみましたが、どうしても分からず、 Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!" & cell & "") の最後のセル指定を、変数で設定する方法を教えて頂きたく。

  • Excel vba 実行エラー1004

    (1)アクティブブックの名前を取得してセルO2に貼り付けた。ex. 1234567b.CSV (2)VBAを使って1234567k.CSV におきかえた。 (3)(2)のセルに入力された内容でブックを開きたいが、エラー1004が出て開けない。 (4)開けたとして、そのブックのA1セルを 元のブックをアクティブにして D1に 貼り付けたい。 (5)またさっきのブックに戻ってF1セルを 元のブックをアクティブにして E1セルに貼り付けたい。 というようなVBAを組みたいと思っています。 現在(1)(2)はできましたが(3)でエラーが出たため止まっていますし、その後もわかりません。 Dim bb As String Dim kb As String bb = ActiveWorkbook.Name Cells(2, "O").Value = ActiveWorkbook.Name Cells(3, "O").Value = ActiveWorkbook.Name Range("O2").Formula = Replace(bb, "b.CSV", "k.CSV") kb = Range("O2") 'シート名を取得する Dim bbs As String bbs = Left(bb, 10) Cells(4, "O").Value = bbs Dim kbs As String kbs = Left(kb, 10) Cells(5, "O").Value = kbs 'コピーして貼り付ける kbn = Cells(2, 15) Workbooks.Open Filename:=kbn Range("F1").Select Range("F1").Copy として作ってるんですが、 Workbooks.Open Filename:=kbn でエラーが出てブックが開けません。 ご指導お願いします。

  • 複数のブックからデータを転記するマクロについて

    こんにちは。 VBAの素人なのでネットや本などで自分なりに調べましたが、 どうにも解決できないので、ご教示いただけませんでしょうか。 複数のブックにある同一セル番地にある データを別のブックにまとめたいのですが、 ブック数が500程度あり、マクロでうまくできないか悩んでいます。  (1)転記元ブックを開く。  (2)転記元データをコピーする。  (3)転記先ファイルのセルに貼り付ける。  (4)転記元ブックを閉じる。 の繰り返しだと思うのですが、(2)ができず困っています。 ちなみに、500のブックとまとめるブックも同じフォルダにあります。 具体的には、転記元ブックは以下のような形で、A列に様々な温度のデータが縦に並んでいます。    A列   1行  温度  2行  27 ←ここのみ抽出したい 3行  28 4行  30 それぞれのブックのA2番地の温度データのみを抽出し、転記先ブックのA2からA500までまとめたい。 組んだマクロは以下です。 ------------------------------ Sub 特定フォルダ内ブックを並べ替えて転記() Dim myDir As String, myName As String, myBook As Workbook Dim motodata As Range, sakidata As Range   '集計用のブックがあるフォルダ名を指定 myDir = "D:\VBA練習" myName = Dir(myDir & "\" & "*.xls")   Do While myName <> ""   '↓転記先の最新レコード位置を取得する   Set sakidata = Range("A65536").End(xlUp).Offset(1)   '↓(1)指定した名前のブックを開いて変数に格納する  Set myBook = Workbooks.Open(Filename:=myDir & "\" & myName)   '↓(2)転記元を取得する   Set motodata = myBook.Range("A2")      '↓(3)転記先に貼り付ける   motodata.Copy sakidata   '↓(4)開いたブックを閉じる   myBook.Close  myName = Dir()  Loop End Sub ------------------------------ mybookというキーワードを使用して、A2セルデータをコピーする構文をご教示いただけませんでしょうか。 以上、長々となってしまいましたが、何卒アドバイスの程お願いいたします。

  • マクロ 特定のセル値を「含む」にしたいです。

    f21の値をf21の値を「含む」にしたいのですが どのようにしたらよいでしょうか。 宜しくお願いいたします。 Sub オートフィルターによる抽出() Dim myName As String myName = Range("f21").Value If myName = "" Then MsgBox "担任を入力してください。" Else Range("a22").AutoFilter Field:=6, Criteria1:=myName End If End Sub

  • エクセル外部リンクのセル番地まで知る方法

    エクセル2013です。他のエクセルブックからリンクを張っているとき、以下のマクロで調べることがわかりましたけど、そこでわかるのは、ブック名どまりであって、シートやセル番地はわかりません。わかりたいのは、こっちのブックのどのシートのどのセルが、あっちのブックのどのシートのどのセルとつながっているかです。 わかる方法はないものでしょうか。なお、このマクロは、以下のホームページに書いてあったものです。 https://www.moug.net/tech/exvba/0060039.html Sub GetLinkInfromation() Dim Var As Variant Dim Msg As String Dim i As Integer Var = ActiveWorkbook.LinkSources(xlExcelLinks) For i = 1 To UBound(Var) Msg = Msg & Var(i) & vbCrLf Next i MsgBox Msg End Sub

  • VBA 選択された離れたセルの値の取得について

    EXCELのVBAでどうしても前に進めず困っております。 目的としているコードは、離れたセル(複数)をあらかじめCtrlキーで選択状態にしておき、選択されたセルの値のみをVBAが別のセルに並べていくというものです。 以下が私の作ったコードなのですが、思ったとおりの動作をしてくれません。 VBA初心者なもので、おかしな記述がたくさんあると思うのですが、どなたかアドバイスお願いします。 Public Sub xx() Dim SelectArea As String Dim TargetCell As Range Dim a As Integer Dim Row As Integer Dim Column As Integer Dim CNT1 As Integer a = 0 Row = 0 Column = 0 For CNT1 = 1 To 10 Row = Row + 1 SelectArea = Selection.Address Set TargetCell = Range("B3").Cells(Row - 1, Column) If Intersect(Range(SelectArea), TargetCell) Is Nothing Then Else Range("A30").Cells(a, 0) = Range("B3").Cells(Row - 1, Column).Value a = a + 1 End If Next End Sub

  • フォルダのパスの参照をexcelセル上で指定する

    エクセル上に参照先のフォルダパスを入力し、 VBA上では、セルを参照させたいのですが、 「定数式が必要です」とエラーメッセージが出るのですが、 どこをどうしたらいいですか? --------------------------------------------- Sub 拡張子変更() Dim Folderpath As String ←これだとエラーになる Folderpath = ThisWorkbook.Worksheets("Sheet1").Range("B5").Value Const SAVE_DIR As String = Folderpath '------------ 'Const SAVE_DIR As String = "C:\Desktop\●sample\" ←これだとうまくいく '------------ Const OLD_EXTENSION As String = ".chl" Const NEW_EXTENSION As String = ".txt" Dim OldFName As String Dim NewFName As String OldFName = Dir(SAVE_DIR & "*" & OLD_EXTENSION) Do While Len(OldFName) <> 0 OldFName = SAVE_DIR & OldFName NewFName = _ Left(OldFName, Len(OldFName) - Len(OLD_EXTENSION)) & NEW_EXTENSION FileCopy OldFName, NewFName Kill OldFName OldFName = Dir() Loop End Sub

専門家に質問してみよう