Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
特定フォルダのcsvファイルをすべて開き、開いたファイルCell(1,1)を元エクセルに集計する
投稿日時: 21/07/11 14:02:33
投稿者: A太郎

特定フォルダに存在するcsvファイルの一覧を取得し、
個々のcsvファイルのCell(1,1)の値を、元ファイルへ集約するマクロを作りたいです。
 
一つ目のファイルのCell(1,1)は転記されているようですが、以降の値が変化しません。
個々ファイルが正しく開けているのか疑問です。
間違いをご指摘いただけますと幸いです。
**********************************************************************
 
 
Sub Sample1()
    Dim buf As String, cnt As Long
    Dim i As Long
    Dim c(10) As Variant, d(10) As Variant
     
'特定フォルダからファイル名一覧を取得し、個々のファイル名を変数cに格納 
    Const Path As String = "C:\1234\volume\" 
    buf = Dir(Path & "*.csv")
    i = 1
    Do While buf <> ""
        cnt = cnt + 1
        c(i) = buf
        buf = Dir()
        i = i + 1
    Loop
    
'個々のファイルのCell(1,1)の値を変数dへ格納
    i = 1
    Do While c(i) <> ""
        Workbooks.Open Path & c(1)
        d(i) = ActiveSheet.Cells(1, 1).Value
        ActiveWorkbook.Close
        ThisWorkbook.Activate
        i = i + 1
    Loop
 
'変数dをthisworkbookのSheetXへ転記
    i = 1
    Do While i < 10
        ThisWorkbook.Worksheets("SheetX").Cells(i, 1) = d(i)
        i = i + 1
    Loop
      
End Sub

回答
投稿日時: 21/07/11 16:23:20
投稿者: simple

変数の名前を注意してよく確認してください。
 
 
回答を得ているのに放置しているスレッドがあります。
なんらかの返事をするのがマナーではないですか?

投稿日時: 21/07/11 16:26:54
投稿者: A太郎

simple さんの引用:
変数の名前を注意してよく確認してください。
 
 
回答を得ているのに放置しているスレッドがあります。
なんらかの返事をするのがマナーではないですか?

 
 
simple様
大変申し訳ありません。
今後は、適宜頂いたコメントを確認いたします。
至らないところが多く申し訳ありませんでした。

回答
投稿日時: 21/07/12 07:25:15
投稿者: WinArrow
投稿者のウェブサイトに移動

ステップ実行して、
変数の値を確認してみましょう。

回答
投稿日時: 21/07/12 07:49:23
投稿者: WinArrow
投稿者のウェブサイトに移動

A太郎 さんの引用:

特定フォルダに存在するcsvファイルの一覧を取得し、
個々のcsvファイルのCell(1,1)の値を、元ファイルへ集約するマクロを作りたいです。
 
一つ目のファイルのCell(1,1)は転記されているようですが、以降の値が変化しません。
個々ファイルが正しく開けているのか疑問です。
間違いをご指摘いただけますと幸いです。
**********************************************************************

 
説明文について質問
 
(1)
>集約する
とは、具体的に何をしたいのか?
 
※合計したい・・・と推測するが、違うかな?
 
(2)
>以降の値が変化しません。
とは、どのような結果を期待しているのか?
 
意図する結果と
実行結果の違いを説明しましょう。
 
 
蛇足
 
>Dim C(10) As Variant
と定義した場合、格納個数は、11個(添え字:0〜10)になります。
変数「i」は、1から開始されていますから、添え字:0には何も入りません。
勿論、添え字:0ではアクセスしていないから、不具合は発生しませんが・・・・
承知している/いないで、バグになることがあり得ます。

回答
投稿日時: 21/07/12 10:48:07
投稿者: WinArrow
投稿者のウェブサイトに移動

>合計したい・・・と推測するが、違うかな?
合計ではないようですね・・・・
 
配列を動的に作成し、参照するサンプルコードを紹介します。
 

Option Explicit

Sub Sample1()
    Dim buf As String, CSVFN As String, cnt As Long
    Dim i As Long
    Dim d
    
    ReDim d(1 To 1, 1 To 1)
     i = 0
'特定フォルダからCSVファイルの1件目を取得し配列の格納
    Const Path As String = "C:\1234\volume\"
    CSVFN = Dir(Path & "*.csv")
    Do Until CSVFN = ""
        i = i + 1
        ReDim Preserve d(1 To 1, 1 To i)
        Application.ScreenUpdating = False
        With Workbooks.Open(Filename:=Path & CSVFN)
            d(1, i) = .Sheets(1).Range("A1").Value
            .Close
        End With
        CSVFN = Dir()
    Loop
    If i > 0 Then
'配列から自ブックのシートに代入する
        d = WorksheetFunction.Transpose(d)
        With ThisWorkbook.Sheets("SheetX")
            .Range("A1").Resize(UBound(d)).Value = d
        End With
    Else
        MsgBox "CSVファイルが存在しません。"
    End If
End Sub



 

回答
投稿日時: 21/07/12 11:20:48
投稿者: simple

既に書いたとおりですが、再度。
 
>個々ファイルが正しく開けているのか疑問です。
ということなら、あなたが何を開いているか、
良く確認してはどうですか?という趣旨で申し上げた。
こういうことがあるので、私はループカウンターが一つの時は、
i ではなく k を使うことが多い。

回答
投稿日時: 21/07/12 15:06:25
投稿者: Suzu

フォルダ内で、10個を超えるのCSVファイルが存在した場合、
 
c(i) = buf
 
の部分で、エラーになりますが大丈夫ですか?
 
 
そもそも、何のために、固定配列を使用していますか?
そもそも、ファイル名変数 buf が、"" になるまでの間、
ループし、その中で、セルへの転記も行ってしまっても良いと思います。
 
そうすれば、
 

引用:
個々ファイルが正しく開けているのか疑問です。

にしても、
 
 ThisWorkbook.Worksheets("SheetX").Cells(i, 1) = d(i)
 ThisWorkbook.Worksheets("SheetX").Cells(i, 2) = buf
 
として、確認できますよね。

投稿日時: 21/07/13 00:46:09
投稿者: A太郎

皆様
説明が下手ですみません。
回答ありがとうございます。
 
WinArrow様
(1)集約するとは、具体的に何をしたいのか?
 
>>>10個のCSVファイルがあり、各CSVファイルの1シート目のCell(1,1)の値を、
マクロが記載されたエクセルのSheetXに、Cell(1,1)からCell(1,10)まで並べて表記したいです。
  
(2)以降の値が変化しません。
とは、どのような結果を期待しているのか?
意図する結果と実行結果の違いを説明しましょう。
 
>>>1つ目のCSVファイルのCell(1,1)の値は転記されましたが
2つ目以降のCSVファイルの値が取れていないようです。
1つ目のCSVファイルの値が10回取得されているだけで、個別の値が取れていないように見えます。
 
 
Suzu様
たしかに、10個以上に対応できませんでした。。。
今後こちらも修正していきたいと思います。

回答
投稿日時: 21/07/13 07:15:56
投稿者: simple

他人の発言をきちんと読んでないのでしょうか。
>>個々ファイルが正しく開けているのか疑問です。
>ということなら、あなたが何を開いているか、
>良く確認してはどうですか?という趣旨で申し上げた。
>こういうことがあるので、私はループカウンターが一つの時は、
>i ではなく k を使うことが多い。

と書きました。
確認されたのですか?
 
Workbooks.Open Path & c(1)
と誤記しているので、
iの値に拘わらず、常に1番目の要素に対応するファイルを開いているのです。

投稿日時: 21/07/14 00:50:08
投稿者: A太郎

simple様
 
回答ありがとうございます。
おっしゃる通り、ご指摘の個所が間違っていました。
修正したところ、目的の動きが行えました。
 
見間違えるような紛らわしい変数は使わないということも勉強になりました。
ありがとうございました。