プロが教える店舗&オフィスのセキュリティ対策術

エクセルVBAで、エクセルの指定シートに複数のCSVファイルからデータを取得する方法を
ご教授お願います。
エクセルの指定シートの指定されたセルに、複数のCSVファイルから指定箇所のデータを
取得し転送する方法を考えていますが、どうもうまくいきません。
たとえば、
CSVファイル(1) A5(A)
          A10(B)
CSVファイル(2) A5(C)
          A10(D)     
CSVファイル(3) A5(E)
          A10(F)   
     ・
     ・
     ・
と、指定されたセルからデータを取得し、
エクセルの指定シートの表に
                   CSVファイル               
                 (1)  (2)  (3) ・ ・ ・
-------------------------------------------
A5から取得したデータ    A   C   E ・ ・ ・
A10から取得したデータ    B   D   F ・ ・ ・
-------------------------------------------
と、いうように転送して貼り付けていきたいです。

いろいろ調べてみたのですが、このような方法が見つけられませんでした。
ぜひ、皆様のお知恵をお貸しください。
宜しくお願い致します。

A 回答 (3件)

>読み込むCSVファイルは毎回ファイル名が変わる為、マクロでファイルを選択し、選択したファイルからそれぞれデータを取得したいのですが、変数への置き換え方が分かりません。



私は、基本的にはまったく知らない方には、ブラックボックスとして使っていただくように考えています。

ファイル名が決まっているような質問の内容でしたから、そういうコードにしたまででしたが、すでに、#2のコードを書く時に、以下のように考えていました。

試してみてください。書き換えは、必要に応じて「パスを登録」の部分だけです。
また、なくても、可能です。
ファイルの選択は、Ctrl キーを押しながらファイルを一つずつ選ぶか、シフトキーを押しながら範囲を選ぶかしてください。選択した順序どおりに処理されます。

'//
Sub TestMacro1R()
 Dim sh As Worksheet
 Dim Files As Variant
 Dim i As Long, j As Long, k As Long
 Dim oPath As String
 Dim sPath As String
 oPath = ThisWorkbook.Path
 sPath = ThisWorkbook.Path & "\MyFolder\" 'パスを登録
 Set sh = ThisWorkbook.ActiveSheet '書きだすシート
 ChDir sPath
 Files = Application.GetOpenFilename("Text(*.csv),*.csv", , "ファイル選択", , True)
 If VarType(Files) = vbBoolean Then Exit Sub
 k = 1 '書き出し列
 j = 1 '書き出し行
 For i = UBound(Files) To 1 Step -1
  If k > Columns.Count Then MsgBox "列の制限より終了します。", 48: Exit For
   Application.ScreenUpdating = False
   With Workbooks.Open(Files(i))
    sh.Cells(j, k).Value = .ActiveSheet.Range("A5").Value
    sh.Cells(j + 1, k).Value = .ActiveSheet.Range("A10").Value
    .Close False
   End With
   k = k + 1
  Application.ScreenUpdating = True
 Next
 Set sh = Nothing
 ChDir oPath
 Beep
End Sub
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございました。
早速試してみたいと思います。

お礼日時:2011/01/10 11:14

>いろいろ調べてみたのですが、このような方法が見つけられませんでした。


基本的に、横にデータを伸ばしていくスタイルのものは、VBAなどでは書かないことが多いです。

ある程度、マクロが分かるレベルでしたら、ご自身で書き換えられるはずです。

Sub TestMacro1()
 Dim sh As Worksheet
 Dim Files(5) As String
 Dim i As Long, j As Long, k As Long
 Dim sPath As String
 sPath = ThisWorkbook.Path & "\MyFolder\" 'パスを登録
 Set sh = ThisWorkbook.ActiveSheet '書きだすシート
 'k は書き出し列, j 書き出し行
 'ファイル名が以下よりも多くあるなら、↑Dim Files(数)を増やして書き加える)
 Files(1) = "Test1.csv"
 Files(2) = "Test2.csv"
 Files(3) = "Test3.csv"
 Files(4) = "Test4.csv"
 Files(5) = "Test5.csv"
 k = 1 '書き出し列
 For i = 1 To UBound(Files)
  If Dir(sPath & Files(i)) <> "" Then
  If k > Columns.Count Then MsgBox "列の制限より終了します。", 48: Exit For
   Application.ScreenUpdating = False
   With Workbooks.Open(sPath & Files(i))
    j = 1 '書き出し行
    sh.Cells(j, k).Value = .ActiveSheet.Range("A5").Value
    sh.Cells(j + 1, k).Value = .ActiveSheet.Range("A10").Value
    .Close False
   End With
   k = k + 1
  End If
  Application.ScreenUpdating = True
 Next
 Set sh = Nothing
End Sub

'k と i は別々にするのは、必ずしも、A1 から書きだすとは限らないからです。

この回答への補足

ご返答ありがとうございます。
詳しい説明ありがとうございます。

読み込むCSVファイルは毎回ファイル名が変わる為、マクロでファイルを選択し、選択したファイルからそれぞれ
データを取得したいのですが、変数への置き換え方が分かりません。

別の回答にも書き込みましたが、ほぼ初心者に近い状態です。
お手数ですが、解説つきにしてもらえると大変助かります。

補足日時:2010/11/28 22:10
    • good
    • 0

指定のシート↓



    A     B     C
1  (A)    (C)    (E)
2  (B)    (D)    (F)

のようにしたいのでしょうか?


Range("A1").Value=CSVファイル(1).Range("A5").Value
Range("A2").Value=CSVファイル(1).Range("A10").Value
Range("B1").Value=CSVファイル(2).Range("A5").Value
Range("B2").Value=CSVファイル(2).Range("A10").Value
Range("C1").Value=CSVファイル(3).Range("A5").Value
Range("C2").Value=CSVファイル(3).Range("A10").Value


とか

For i=1 to X
For j=1 to 2
Cells(j, i).Value=CSVファイル(i).Cells(j*5,1).Value
Next
Next

こんな感じでしょうか

この回答への補足

ご返答ありがとうございます。
返事遅くなりすいません。

説明が不足でしたが、書き込むシートは毎回同じなのですが、CSVファイルは毎回ファイル名が変わるため、
このファイルを選択してファイル内のデータを取得したいのですが、このCSVファイルの置き換え方が分かりません。

入門本を呼んで簡単なマクロしか組んだことが無いほぼ初心者に近い状態なので、ご迷惑をおかけしますが内容を詳し
く説明していただけると助かります。

宜しくお願い致します。

補足日時:2010/11/28 22:01
    • good
    • 0

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