• ベストアンサー

エクセルのマクロであるフォルダ内にある全エクセルファイルのシート1!(

エクセルのマクロであるフォルダ内にある全エクセルファイルのシート1!(A1:X365)の値を取得し、コピー元のエクセルファイル名のシートに貼付ける方法を教えて頂けないでしょうか?できればコピー元のエクセルファイルは開かずに実行させたいです。エクセルは2003を使っています。

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.5

 おはようございます。DOUGLAS_ です。 >「A1:X365」という読み込み範囲を指定する >SQL文 の書き方が分かりませんでしたので、・・・  前回答の 参照URL に書いてありました。  (;^_^A  前回答の下記2点を訂正していただければ結構です。 1) myRS.Open "select * from [Sheet1$]", myCon を myRS.Open "select * from [Sheet1$A1:X356]", myCon に差し替え。 2) Range(Range("Y1"), Cells(1, Columns.Count)).EntireColumn.ClearContents Range(Range("A366"), Cells(Rows.Count, 1)).EntireRow.ClearContents の2行を削除。  なお、ご存じかとは存じますが、「参照設定」というのは、Visual Basic Editor(VBE)で 1)[ツール(T)] - [参照設定(R)...] で、[参照設定 - VBProject] ダイアログ を開きます。 2)[参照可能なライブラリ ファイル(A):] の下の一覧の中から「Microsoft ActiveX Data Objects 2.x Library」というような文字列の書かれた項目の前の チェックボックス を オン にします。  私の環境では「2.x」の部分が「2.0」・「2.1」・「2.5」・「2.6」・「2.7」・「2.8」と 6通り ありましたので、番号の一番大きな「2.8」に参照設定しました。 3)最後に [OK] を クリック して、[参照設定 - VBProject] ダイアログ を閉じます。  なお、私の書いた マクロ は、マクロ が書かれた ブック には、何も変化はありません。  新規ブック を開いて、そこに データ を読み込み、別名で保存するようにしてあります。 >最終的に私がやりたいことは60ある同一フォームのエクセルファイルの、 >A1からX365に入力された数値を >それぞれのセル位置ごとにマスターのファイルで合計を出したい とのことですが、「60ある同一フォームのエクセルファイル」は、同じ フォルダ に入っていることが要件です。  VBA の知識がおありでしたら、私の書いた マクロ を適当に手直ししてくだされば、複数の フォルダ からの読み込みもできるようになります。  では、ご健闘をお祈りします。  <(_ _)>

ganba1192
質問者

お礼

おはようございます。 私の言葉足らずの質問、要望に熱心に回答頂き本当にありがとうございました。おかげさまでやりたかったことは完全に出来るようになりました。 また、いろいろと勉強にもなりました。 大変感謝しております。 本当にありがとうございました。

その他の回答 (4)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

 毎度お騒がせいたします。DOUGLAS_ です。  ADO を使って データ接続 ということで、 http://antonsan.net/study/excel/excel021.php#9 を参考に書いてみました。  「Microsoft ActiveX Data Object 2.x Library」に参照設定なさってください。「2.x」の「x」は数字の大きなものを選べばよかったと存じます。  ただし、「A1:X365」という読み込み範囲を指定する SQL文 の書き方が分かりませんでしたので、読み込んだ後に、範囲外を削除する、というような ダサイ ヤリカタ になってます。 ' 参照設定「Microsoft ActiveX Data Object 2.x Library」 Sub test()  Application.ScreenUpdating = False '「あるフォルダ」の指定  Dim MyPath As String  With Application.FileDialog(msoFileDialogFolderPicker)   .Title = "フォルダを選択してください"   .InitialFileName = "D:\"   .Show   MyPath = .SelectedItems(1)  End With 'Dドライブ 直下に「あるフォルダ」名で、ブック を保存  Workbooks.Add Template:="ブック"  ActiveWorkbook.SaveAs Filename:= _     "D:\" & Replace(Replace(MyPath, ":", ":"), "\", "¥") & ".xls" '「あるフォルダ」内の、ブック を検索  Dim MyName 'As String  Dim myCon As New ADODB.Connection  Dim myRS As New ADODB.Recordset  MyName = Dir(MyPath & "\*.xls")  Do   'アクティブシート を「コピー元のエクセルファイル名」に変える   ActiveSheet.Name = Replace(MyName, ".xls", "")   '「シート1!(A1:X365)の値を取得し、」・「シートに貼付ける」   With myCon    .Provider = "Microsoft.Jet.OLEDB.4.0;"    .Properties("Extended Properties") = "Excel 8.0;HDR=NO"    .Open MyName   End With   myRS.Open "select * from [Sheet1$]", myCon   Range("A1").CopyFromRecordset myRS   Range(Range("Y1"), Cells(1, Columns.Count)).EntireColumn.ClearContents   Range(Range("A366"), Cells(Rows.Count, 1)).EntireRow.ClearContents   myRS.Close   myCon.Close '「あるフォルダ」内の、ブック がなくなるまで、繰り返す。   MyName = Dir   If MyName <> "" Then    Sheets.Add after:=ActiveSheet, Type:="ワークシート"   Else    Exit Do   End If  Loop   '再保存  Set myRS = Nothing  Set myCon = Nothing  ActiveWorkbook.Sheets(1).Activate  ActiveWorkbook.Save  Application.ScreenUpdating = True End Sub

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

#2 DOUGLAS_ です。  美味しそうな エサ に食らい付いて、とても初歩的な ミス をしてしまいました。  下記2点を訂正します(なお、変数は、都度、宣言しています)。 1) MyName = Dir(MyPath & "\*.xls") の前に  Dim i As Integer  Dim j As Integer  Dim myArr(364, 23) As Variant を追加します。 2) Range("A1:X365") = ExecuteExcel4Macro("'" & MyPath & "\[" & MyName & "]Sheet1'!R1C1:R365C24") を   For i = 1 To 24    For j = 1 To 365     myArr(j - 1, i - 1) = ExecuteExcel4Macro("'" & MyPath & "\[" & MyName & "]Sheet1'!R" & j & "C" & i)    Next   Next   Range("A1:X365") = myArr に差し替えます。  ただし、この方法では、とても時間がかかり、パソコン にも、かなり負荷が掛かってそうですので、別の方法を考えてみます。  大変お騒がせいたしました。   <(_ _)>

ganba1192
質問者

補足

DOUGLASさん回答ありがとうございます。やはりコピーしてシートを作っての繰り返しはパソコンへの負荷が大きいのですね。 最終的に私がやりたいことは60ある同一フォームのエクセルファイルの、A1からX365に入力された数値をそれぞれのセル位置ごとにマスターのファイルで合計を出したいと思っています。シートをファイル数分コピーして増やそうと思ったのは一つのファイルにまとめれば後は私のエクセル関数の知識でもやりたいことは達成できると思ったからです。 他にいい方法があれば教えて下さい。お願いします。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

 面白そうなお題でしたので、乗ってみました。 Sub test()  Application.ScreenUpdating = False '「あるフォルダ」の指定  Dim MyPath As String  With Application.FileDialog(msoFileDialogFolderPicker)   .Title = "フォルダを選択してください"   .InitialFileName = "D:\"   .Show   MyPath = .SelectedItems(1)  End With 'Dドライブ 直下に「あるフォルダ」名で、ブック を保存  Workbooks.Add Template:="ブック"  ActiveWorkbook.SaveAs Filename:= _     "D:\" & Replace(Replace(MyPath, ":", ":"), "\", "¥") & ".xls"   '「あるフォルダ」内の、ブック を検索  Dim MyName 'As String  MyName = Dir(MyPath & "\*.xls")  Do    'アクティブシート を「コピー元のエクセルファイル名」に変える   ActiveSheet.Name = Replace(MyName, ".xls", "")    '「シート1!(A1:X365)の値を取得し、」・「シートに貼付ける」   Range("A1:X365") = ExecuteExcel4Macro("'" & MyPath & "\[" & MyName & "]Sheet1'!R1C1:R365C24") '「あるフォルダ」内の、ブック がなくなるまで、繰り返す。   MyName = Dir   If MyName <> "" Then    Sheets.Add after:=ActiveSheet, Type:="ワークシート"   Else    Exit Do   End If  Loop    '再保存  ActiveWorkbook.Sheets(1).Activate  ActiveWorkbook.Save  Application.ScreenUpdating = True End Sub

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

ブックを開かないで読む http://www.officetanaka.net/excel/vba/tips/tips28.htm とか、あとは外部接続などになるのかな。 開かないでやると、結構面倒な感じがします。

ganba1192
質問者

お礼

ありがとうございました。勉強になりました。

関連するQ&A