Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4863 / 13646 ツリー ←次へ | 前へ→

【53960】[難題相談]フォルダ内の*.csvファイルを統合し、データをまとめる cpdim 08/2/18(月) 16:45 質問[未読]
【53962】Re:[難題相談]フォルダ内の*.csvファイルを... かみちゃん 08/2/18(月) 18:18 発言[未読]
【53963】Re:[難題相談]フォルダ内の*.csvファイルを... cpdim 08/2/18(月) 18:41 お礼[未読]
【53964】Re:[難題相談]フォルダ内の*.csvファイルを... かみちゃん 08/2/18(月) 18:57 発言[未読]
【53970】Re:[難題相談]フォルダ内の*.csvファイルを... cpdim 08/2/19(火) 9:54 お礼[未読]
【53971】Re:[難題相談]フォルダ内の*.csvファイルを... かみちゃん 08/2/19(火) 10:00 発言[未読]
【53978】Re:[難題相談]フォルダ内の*.csvファイルを... cpdim 08/2/19(火) 14:48 お礼[未読]
【53993】Re:[難題相談]フォルダ内の*.csvファイルを... かみちゃん 08/2/19(火) 17:27 発言[未読]
【53996】Re:[難題相談]フォルダ内の*.csvファイルを... cpdim 08/2/19(火) 18:00 質問[未読]
【54003】Re:[難題相談]フォルダ内の*.csvファイルを... neptune 08/2/19(火) 23:13 発言[未読]
【54007】解決しました。どうもありがとうございまし... cpdim1 08/2/20(水) 0:30 お礼[未読]
【53972】Re:[難題相談]フォルダ内の*.csvファイルを... VBWASURETA 08/2/19(火) 10:06 回答[未読]
【53973】Re:[難題相談]フォルダ内の*.csvファイルを... VBWASURETA 08/2/19(火) 10:12 発言[未読]

【53960】[難題相談]フォルダ内の*.csvファイルを...
質問  cpdim  - 08/2/18(月) 16:45 -

引用なし
パスワード
   こんにちは。ExcelのVBAについてのご相談を申し上げます。

VBAに関しては勉強しているつもりでしたが、
今回は私の実力では完全にお手上げ状態でみなさんのお力をお貸しいただきたく投稿しました。
どうぞよろしくお願いいたします。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
【現状】
<フォルダ内のファイル名>
1.「DATA」というフォルタ内には約1000個の"abc_eea_0001234.csv"のようなcsvファイルが存在。
2.ファイル名の中のeeaは他にeea,eeb,eec,efa,efb,efcのようなファイルが同じフォルダ内に混在。

<ファイル内のデータ>
3.各ファイルの中身は、1aセル:日付、1bセル:eea(ファイル名の一部)、1cセル:0001234(ファイル名の一部)になっていて、11行から本データが入っている。
4.本データの形式は、11行から1000行まで並んでおり、A,B,Cまでのセルに保存されている。(下のような形式)

*************************************
   A     B     C(セル)
*************************************
1  日付     eea   0001234

        .....

8 --------------------------------
9  line    num    data
10 --------------------------------
11  101     111    8123
12  102     112    2145
13  103     113     142
         .
         .
         .
513 602     12     51
*************************************

【やりたいこと】
1.「DATA」フォルダ内の全てのCSVファイル名を検索し、eea〜eecかeed〜eefを選択処理する。
2.eea〜eecの場合は、全てのcsvファイルに関して、1a:日付, 1b:eea, 1c:001234のデータと11行から1000行までのc列の縦のデータを取り出し、下のように横並びに並べ替える。


********************************************
   A   B   C    D  E  ...
********************************************
2   line:       101  102  ...
3    num:       111  112  ...
4  日付 eea 001234  data  data ...
5  日付 eea 001235  data  data ...
6  日付 eea 001236  data  data ...
         ...

31 日付 eeb 000001 data data ...
32 日付 eeb 000002 data data ...
         ...

153 日付 eec 001923 data data ...
154 日付 eec 000002 data data ...
         ...
          
********************************************

3.上のようにまとめたファイルを"xxx.csv"というファイル名で保存する。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ここまでです。
大変厚かましい事で、恐縮ではございますが、
どうか、みなさんの助けをお願い申し上げたいのです。よろしくお願いします。

【53962】Re:[難題相談]フォルダ内の*.csvファイル...
発言  かみちゃん E-MAIL  - 08/2/18(月) 18:18 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>VBAに関しては勉強しているつもりでしたが、
>今回は私の実力では完全にお手上げ状態でみなさんのお力をお貸しいただきたく

よく似たこと普段からしていますが、
どこがわかりませんか?

たとえば、ひとつだけのCSVファイルを読み込む場合だとどのようにしますか?
手作業でできますよね?
手作業でできるならば、その操作を「マクロの記録」で記録してみましょう。

その上でわからないことがあれば、できあがったコードを提示しましょう。
そこから先は、繰り返し処理とファイル名判断処理と、出力位置の判断を加えて
いくという感じではないかと思いますが、いかがでしょうか?

難題かもしれませんが、このままでは、作成依頼のような感じがします。
個人的には、作成依頼でも構わないのですが、Q&A系掲示板では嫌われることが
多いですので。

【53963】Re:[難題相談]フォルダ内の*.csvファイル...
お礼  cpdim  - 08/2/18(月) 18:41 -

引用なし
パスワード
   まず、ご回答どうもありがとうございました。


>難題かもしれませんが、このままでは、作成依頼のような感じがします。
>個人的には、作成依頼でも構わないのですが、Q&A系掲示板では嫌われることが
>多いですので。


今回の質問は大変ずうずうしく感じられる質問ではあると自覚しています。
正直なことを申し上げますと、VBAに関してはほぼ知識がなく、普段から手作業でのマクロ作成がメインで、知らない部分に関しては色んな掲示板を調べてなんとなくそれっぽいものを作ってはきました。

しかし、今回の場合は質問させていただいた一連の作業を最初から最後まで一気にする必要があり、最初はいつもの通り手作業で頑張ったんですが、VBAに無知識な私にとっては、壁にぶつかってばかりでした。
ずうずうしいことは分かっていながらもこのような質問をして機嫌を損なってしまい、誠に申し訳ございません。

今回の質問は質問というより、「作成依頼」という感じが強いことも自覚していますが、時期が迫ってのことなどもありましてあせりつつお願いさせていただいたところです。

大変恐縮ではございますが、何卒よろしくお願いいたします。

【53964】Re:[難題相談]フォルダ内の*.csvファイル...
発言  かみちゃん E-MAIL  - 08/2/18(月) 18:57 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>質問させていただいた一連の作業を最初から最後まで一気にする必要があり、最
>初はいつもの通り手作業で頑張った

その頑張りを書いてみませんか?
作成依頼という感じが強いという自覚があるなら、なおさらなのですが、
コードを提示してしまうと、「作成依頼に応えるな」というお叱りをコメント
する者まで受けてしまいますので、答えづらいです。
個人的には、別にお叱りを受けても、私の拙いアドバイスが質問者の解決に役立つ
なら、構わないのですが・・・

>このような質問をして機嫌を損なってしまい

少なくとも私は、それはありませんので、安心してください。

>今回の質問は質問というより、「作成依頼」という感じが強いことも自覚してい
>ますが、時期が迫ってのことなどもありましてあせりつつお願いさせていただいた

急ぎの案件であることはわかりますが、何か、ご自身でできていることは
少しでもないでしょうか?
解決の早道だと思うのですが・・・
ただ、解決と理解は別なのでしょうけど。

【53970】Re:[難題相談]フォルダ内の*.csvファイル...
お礼  cpdim  - 08/2/19(火) 9:54 -

引用なし
パスワード
   ▼かみちゃん さん:
こんにちは。cpdimです。

先日はどうもありがとうございました。

助言の通り一つ一つ勉強して行こうとおもっています。

まず、以下のようにしてフォルダー内の複数のcsvファイルから
abc_ee*_*.csvのファイルのファイル名だけを
現シートの4A行目から下に取り込むことはできましたが、
ファイル名ではなく、各csvファイルの特定セル、あるいは、特定範囲の値を
選択したセルに取り込むにはどのようにすればよいのでしょうか。

ご指導いただけますと幸いです。

Sub test()
  Dim f As String
  Dim s As String
 
  Dim i As Long
  
  f = ThisWorkbook.Path & "\abc_ee*_*.csv"
  i = 4
  s = Dir(f)
  Do While s <> ""
    Cells(i, 1) = s
    i = i + 1
    s = Dir
  Loop
End Sub


どうぞよろしくお願いいたします。

【53971】Re:[難題相談]フォルダ内の*.csvファイル...
発言  かみちゃん E-MAIL  - 08/2/19(火) 10:00 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>まず、以下のようにしてフォルダー内の複数のcsvファイルから
>abc_ee*_*.csvのファイルのファイル名だけを
>現シートの4A行目から下に取り込むことはできましたが、
>ファイル名ではなく、各csvファイルの特定セル、あるいは、特定範囲の値を
>選択したセルに取り込むにはどのようにすればよいのでしょうか。

なかなかいい感じだと思います。

ただ、[53962]でも書きましたとおり、複数ファイルを順番に処理しようとするのではなく、
まず、ひとつだけのCSVファイルを読み込む場合だとどのようにするか。
手作業でできると思いますから、その操作を「マクロの記録」で記録してみる
というところから、始めてはいかがですか?

そのあと、複数ファイルの扱い方等の話に展開されていきます。

【53972】Re:[難題相談]フォルダ内の*.csvファイル...
回答  VBWASURETA  - 08/2/19(火) 10:06 -

引用なし
パスワード
   ▼cpdim さん、かみちゃん さん:
おはようございます。

自分がVBA初心者の頃、お世話になったHPです。
//www2s.biglobe.ne.jp/~iryo/

因みにこちらがCSV関係です。
//www2s.biglobe.ne.jp/~iryo/2vba/vba29c.html#no2951

これでExcelシートとして開けるので、範囲指定のやり方は
セルの扱いと同じなのでそれでわかりますよね?

【53973】Re:[難題相談]フォルダ内の*.csvファイル...
発言  VBWASURETA  - 08/2/19(火) 10:12 -

引用なし
パスワード
   ▼VBWASURETA さん:
あ、訂正です。
VBA覚えるのでしたら、
//www2s.biglobe.ne.jp/~iryo/2vba/v20a.html

目次になっているのでこちらから順に見てやってみて下さい。

【53978】Re:[難題相談]フォルダ内の*.csvファイル...
お礼  cpdim  - 08/2/19(火) 14:48 -

引用なし
パスワード
   かみちゃん さん:

他のVBAサイト等参照しながらやっています。
最初の一つのCSVファイル全体の取り込みはできていますが、
そのCSVファイルの特定セル(A1,B1,C1)だけ取り込みと、
さらにC13〜EOL(End of Line)までの値を新しいブックに横並びにするのができず
状態です。

私の実力では今日中に終わらせるのは無理かもしれません。

いろいろご指導ありがとうございました。
VBAの基礎から勉強します。

【53993】Re:[難題相談]フォルダ内の*.csvファイル...
発言  かみちゃん E-MAIL  - 08/2/19(火) 17:27 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>最初の一つのCSVファイル全体の取り込みはできていますが、

そこまでを提示することはできませんか?

>そのCSVファイルの特定セル(A1,B1,C1)だけ取り込みと、

手作業でするためには、どうしたらいいと思いますか?

>さらにC13〜EOL(End of Line)までの値を新しいブックに横並びにするのができず

C13〜EOLまでコピーして、「形式を選択して貼り付け」で「行と列を入れ替える」
でできませんか?
できれば、「マクロの記録」です。

>私の実力では今日中に終わらせるのは無理かもしれません。

今日中という期限なら、Q&A系の掲示板だけに頼るのは、難しいかもしれませんね。
中には、サンプルコード提供ということで、作成依頼に答えていただける方も
いる(私も含めて)のですが、掲示板ではできるだけしないほうがいいらしい
ので、難しいところです。

【53996】Re:[難題相談]フォルダ内の*.csvファイル...
質問  cpdim E-MAIL  - 08/2/19(火) 18:00 -

引用なし
パスワード
   回答ありがとうございます。
実は、今もいろいろとVBAサイトを参照して
何とか頭を抱えながらやっている最中です。
したに今までできたソースを添付しました。
これでなんとなく
(1)フォルダ内の複数のcsvファイルのA1~C1のデータだけを取り込む
作業はできた感じですが、

C21からC163までの縦に並べられたデータを該当する行に横並びにすることが
できず困っています。

もしよろしければ教えていただけませんでしょうか。
下記のコードもいろいろと私の状況に合わせていろいろと変えたり
してて汚いと思いますが、ぜひご指導いただけますと幸いです。

よろしくお願いいたします。
もし掲示板でソースを載せるのが難しいようでしたら
メールでもかまいませんので、よろしくお願いいたします。
(メールアドレスを開放しておきました。)


Sub Books2Sheet()

  Dim Fld As String
  Dim Fn As String
  Dim Book As Workbook

  Dim rngDest As Range
  Dim myPath As String
  Dim myBookName As String
  Dim mySheet As Worksheet


Fld = フォルダ選択()            'フォルダ選択 Function参照
  If Fld = "" Then Exit Sub
   
  Fn = Dir(Fld & "\NVM_TW*_*.csv")    '選択したフォルダ内のNVM_TW*_*.csvファイルを参照
  If Fn = "" Then Exit Sub        'そのようなファイルがなければExit Sub
   
  Set Book = Workbooks.Add        '新しいブックをセットする
   
  myPath = Fld & "\"
  myBookName = Dir(myPath & "NVM_TW*_*.csv") '選択されたファイル名をmyBookName変数にいれる
  If myBookName = "" Then Exit Sub      '何も選択されたファイルがなければ、Exit Sub
  
  Set rngDest = Workbooks.Add.Worksheets(1).Range("A4")
  
  Do Until myBookName = ""
    If myBookName = ThisWorkbook.Name Then
    Else
      With Workbooks.Open(myPath & myBookName)
        For Each mySheet In .Worksheets
          With mySheet.Range("A1", "C1") 'A1からC1までのセル値を取得する
          ''With mySheet.UsedRange
            .Copy rngDest
            Set rngDest = rngDest.Offset(.Rows.Count)
          End With
        Next
        .Close False
      End With
    End If
    myBookName = Dir()
  Loop
  MsgBox "完了!"
  
  
End Sub

Private Function フォルダ選択(Optional Title As String = "Missing", Optional RootFolder As Variant) As String
  Dim Shl As Object  'Shell32.Shell
  Dim Fld As Object  'Folder
  Dim strFld As String
  Dim Ttl As String
   
  If Title = "Missing" Then
    Ttl = "合体前のcsvファイルがあるフォルダを選択してください。"
  Else
    Ttl = Title
  End If
   
  Set Shl = CreateObject("Shell.Application")
  '1:コントロールパネルなどの余分なもの非表示  512:新規フォルダ作成ボタン非表示
  If IsMissing("RootFolder") Then
    Set Fld = Shl.BrowseForFolder(0, Ttl, 1 + 512)
  Else
    Set Fld = Shl.BrowseForFolder(0, Ttl, 1 + 512, RootFolder)
  End If
   
  strFld = ""
  If Not Fld Is Nothing Then
    On Error Resume Next
    strFld = Fld.Self.Path
    If strFld = "" Then
      strFld = Fld.Items.Item.Path
    End If
    On Error GoTo 0
  End If
   
  If InStr(strFld, "\") = 0 Then strFld = ""
   
  フォルダ選択 = strFld
   
  Set Shl = Nothing
  Set Fld = Nothing
End Function

【54003】Re:[難題相談]フォルダ内の*.csvファイル...
発言  neptune  - 08/2/19(火) 23:13 -

引用なし
パスワード
   ▼cpdim さん:
こんにちは

>C21からC163までの縦に並べられたデータを該当する行に横並びにすることが
>できず困っています。
ワークシート関数の「Transpose」ってのでできたと思います。
Helpでworksheetfunctionと、Transposeワークシート関数を調べて見て下さい。

【54007】解決しました。どうもありがとうございま...
お礼  cpdim1 E-MAIL  - 08/2/20(水) 0:30 -

引用なし
パスワード
   かみちゃん さん、VBWASURETAさん、neptuneさん:

いろいろご指導ありがとうございました。

教えていただいたこととVBAサイトなどを参考にして

希望通りの結果を得ることができました。

とても感謝いたします。

どうもありがとうございました。

ちなみに、今まで作成したコードを下に記入して置きます。

Sub Books2Sheet()

  Dim Fld As String
  Dim fn As String
  Dim Book As Workbook

  Dim rngDest As Range
  Dim myPath As String
  Dim myBookName As String
  Dim mySheet As Worksheet

  Application.ScreenUpdating = False
  
  Fld = フォルダ選択()            'フォルダ選択 Function参照
'  If Fld = "" Then Exit Sub
'
'  Fn = Dir(Fld & "\NVM_TW*_*.csv")    '選択したフォルダ内のNVM_TW*_*.csvファイルを参照
'  If Fn = "" Then Exit Sub        'そのようなファイルがなければExit Sub
  
  myPath = Fld & "\"
  myBookName = Dir(myPath & "ABC_TW*_*.csv") '選択されたファイル名をmyBookName変数にいれる
  If myBookName = "" Then
   MsgBox myPath & " に対象ファイルがありません"
  Exit Sub      '何も選択されたファイルがなければ、Exit Sub
  End If
  
'  Set Book = Workbooks.Add        '新しいブックをセットする
 
'  Set rngDest = Workbooks.Add.Worksheets(1).Range("A4")
'  Set rngDest = Book.Worksheets(1).Range("A4")
  Set rngDest = ThisWorkbook.Worksheets("縦NVM").Range("A4")
 
  If MsgBox("4行目以下を消去しますか?", vbYesNo) = vbYes Then
   rngDest.Parent.Cells.Resize(Rows.Count - 3).Offset(3).ClearContents
  End If
  
  Do Until myBookName = ""
    If myBookName = ThisWorkbook.Name Then
    Else
      With Workbooks.Open(myPath & myBookName)
        For Each mySheet In .Worksheets
          With mySheet.Range("C21:C163")
           '---
           '開いたファイルの特定のセル範囲をコピーして、「形式を選択して貼り付け」の「値」と同時に「行列を入れ替える」
           '.Copy
           'rngDest.Offset(, 3).PasteSpecial Paste:=xlPasteValues, _
           ' Operation:=xlNone, SkipBlanks:=False, Transpose:=True
           'Application.CutCopyMode = False
           '---
           '開いたファイルの特定のセル範囲の値を縦横を入れ替えて別のセル範囲の値にする
           rngDest.Offset(, 3).Resize(.Columns.Count, .Rows.Count).Value = WorksheetFunction.Transpose(.Value)
          End With
          With mySheet 'A1からC1までのセル値を取得する
           rngDest.Resize(, 3).Value = Array(Replace(.Range("A1").Value, "// ", ""), .Range("B1").Value, .Range("C1").Value)
           'rngDest.Resize(, 3).Value = .Range("A1:C1").Value
           Set rngDest = rngDest.Offset(1)
          End With
''          With mySheet.Range("A1", "C1") 'A1からC1までのセル値を取得する
'          With mySheet.Range("A1:C1") 'A1からC1までのセル値を取得する
'          ''With mySheet.UsedRange
'            .Copy rngDest
'            Set rngDest = rngDest.Offset(.Rows.Count)
'          End With
        Next
        .Close False
      End With
    End If
    myBookName = Dir()
  Loop
  
  '結果物のA列はファイル名と関係なく日付順で並べ替える
  With rngDest
   With .Offset((.Row - 4) * -1).Resize(.Row - 4)
    .Sort Key1:=.Cells(1, 1), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin
   End With
  End With
  
  Application.ScreenUpdating = True
  
  MsgBox "完了!"
End Sub

Private Function フォルダ選択(Optional Title As String = "Missing", Optional RootFolder As Variant) As String
  Dim Shl As Object  'Shell32.Shell
  Dim Fld As Object  'Folder
  Dim strFld As String
  Dim Ttl As String
 
  If Title = "Missing" Then
    Ttl = "合体前のcsvファイルがあるフォルダを選択してください。"
  Else
    Ttl = Title
  End If
 
  Set Shl = CreateObject("Shell.Application")
  '1:コントロールパネルなどの余分なもの非表示  512:新規フォルダ作成ボタン非表示
  If IsMissing("RootFolder") Then
    Set Fld = Shl.BrowseForFolder(0, Ttl, 1 + 512)
  Else
    Set Fld = Shl.BrowseForFolder(0, Ttl, 1 + 512, RootFolder)
  End If
 
  strFld = ""
  If Not Fld Is Nothing Then
    On Error Resume Next
    strFld = Fld.Self.path
    If strFld = "" Then
      strFld = Fld.Items.Item.path
    End If
    On Error GoTo 0
  End If
 
  If InStr(strFld, "\") = 0 Then strFld = ""
 
  フォルダ選択 = strFld
 
  Set Shl = Nothing
  Set Fld = Nothing
End Function


他にこのような問題で困っている方に参考になれればいいと思います。

4863 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free