Excel VBA質問箱 IV

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

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


8599 / 13644 ツリー ←次へ | 前へ→

【32159】多数ファイル内データの取得方法について さくら 05/12/7(水) 17:59 質問[未読]
【32160】Re:多数ファイル内データの取得方法について Statis 05/12/7(水) 18:16 発言[未読]
【32161】Re:多数ファイル内データの取得方法について Statis 05/12/7(水) 18:32 発言[未読]
【32162】Re:多数ファイル内データの取得方法につ... さくら 05/12/7(水) 19:26 回答[未読]
【32164】Re:多数ファイル内データの取得方法につ... Statis 05/12/7(水) 20:02 回答[未読]
【32195】Re:多数ファイル内データの取得方法につ... さくら 05/12/8(木) 20:40 質問[未読]
【32196】Re:多数ファイル内データの取得方法につ... Statis 05/12/8(木) 21:19 回答[未読]
【32378】データの取得方法についてII さくら 05/12/13(火) 17:40 質問[未読]

【32159】多数ファイル内データの取得方法について
質問  さくら  - 05/12/7(水) 17:59 -

引用なし
パスワード
   以下の件につきまして御教授頂ければ幸いです。
常に開いているファイル(Book1とする)のA列に、ファイル名が記述されています。
Book1に記述されたマクロの実行により、他のフォルダにある複数のファイル(仮にファイル1から連番でファイル100まであるとします)に対して、以下の動作をさせたいのです。
ファイル1〜ファイル100には、何れもA列とB列にデータがあるとします。
1.ファイル1を開き、C列に、行毎のA列のデータとB列のデータの加算値を出力する。
2.C列のデータを、常に開いているファイルの同じ行のB列にペーストする。その後は、ファイル1のデータは保存せずに閉じます。
ファイル1について、1.2.の動作を終えた後、残るファイル100まで、順に1.2.と同様の動作を自動でさせたいのですが、ファイル1からファイル2への継続動作の仕方がわかりません。
以下では、ファイル1に対してのみ1.2.の動作をして終わります。
Sub Macro1()
Dim LastCell As Range, c As Range

 Set LastCell = Range("A65536").End(xlUp)
 For Each c In Range("A1", LastCell)
  strFileName = " C:\WINDOWS\フォルダ1\" & c.Value
  If c.Value <> "" And Dir(strFileName) <> "" Then
   Workbooks.Open Filename:=" C:\WINDOWS\フォルダ1\" & c.Value

    ActiveSheet.Range("C1")= ActiveSheet.Range("A1") +     ActiveSheet.Range("B1")
    ActiveSheet.Range("C1").Select
    Selection.Copy
    ActiveWorkbook.Close SaveChanges:=False
    Workbooks("Book1").Activate
    Cells(1, 2).Select
    ActiveSheet.Paste
  End If
 Next
 Set LastCell = Nothing
End Sub

【32160】Re:多数ファイル内データの取得方法につ...
発言  Statis  - 05/12/7(水) 18:16 -

引用なし
パスワード
   こんにちは

>ファイル1〜ファイル100には、何れもA列とB列にデータがあるとします。
>1.ファイル1を開き、C列に、行毎のA列のデータとB列のデータの加算値を出力する。
該当セルはA1とB1とC1だけですか?

>2.C列のデータを、常に開いているファイルの同じ行のB列にペーストする。
最初のファイルはB列の1行目に貼り付けますが、次のファイルはとこに貼り付けますか?

【32161】Re:多数ファイル内データの取得方法につ...
発言  Statis  - 05/12/7(水) 18:32 -

引用なし
パスワード
   ▼Statis さん:
>こんにちは
>
>>ファイル1〜ファイル100には、何れもA列とB列にデータがあるとします。
>>1.ファイル1を開き、C列に、行毎のA列のデータとB列のデータの加算値を出力する。
>該当セルはA1とB1とC1だけですか?
>
>>2.C列のデータを、常に開いているファイルの同じ行のB列にペーストする。
>最初のファイルはB列の1行目に貼り付けますが、次のファイルはとこに貼り付けますか?

追加質問があります。
加算値をC列に入力する必要性がないのでは?
(上書き保存しないで閉じているので)

【32162】Re:多数ファイル内データの取得方法につ...
回答  さくら  - 05/12/7(水) 19:26 -

引用なし
パスワード
   >こんにちは
>>
>>該当セルはA1とB1とC1だけですか?
>実際には、A列、B列共に1行〜10行のデータがあり、A1+B1〜A10+B10の10個のデータを得たいのですが。
>>最初のファイルはB列の1行目に貼り付けますが、次のファイルはとこに貼り付けますか?
>すいません。重要なことが記述不足でした。
>最初のファイルのA1+B1〜A10+B10の10個のデータを、B列の1行目〜10行目へ順に貼>り付けます。ファイル2のA1+B1〜A10+B10の10個のデータは、同じB列の11行目〜>20行目へ貼り付けます。ファイル3のデータは同21行目からというように貼り付け>ていきたいのですが。
>>追加質問があります。
>>加算値をC列に入力する必要性がないのでは?
>>(上書き保存しないで閉じているので)
>C列に入力しなくとも加算値を取得してB列へ貼り付けられるのでしたら、おっしゃる通りその必要はありません。
>宜しくお願い致します。

【32164】Re:多数ファイル内データの取得方法につ...
回答  Statis  - 05/12/7(水) 20:02 -

引用なし
パスワード
   こんにちは
お試しを。
(ファイル名のあるシート名をSheet1にしていますのでそちらの環境に合わせてください。)


Sub Macro1()

Dim LastCell As Range, c As Range, Wb As Workbook, strFileName As String
Dim i As Long, Co As Long

With ThisWorkbook.Worksheets("Sheet1")
   Set LastCell = .Range("A1", .Range("A65536").End(xlUp)) _
                 .SpecialCells(xlCellTypeConstants)
   strFileName = "C:\WINDOWS\フォルダ1\"
   Application.ScreenUpdating = False
   Co = 1
   For Each c In LastCell
     If Len(Dir(strFileName & c.Value)) = 1 Then
       Set Wb = Workbooks.Open(strFileName & c.Value)
       For i = 1 To 10
         .Cells(Co, 2).Value = _
          Wb.ActiveSheet.Cells(i, 1).Value + Wb.ActiveSheet.Cells(i, 2).Value
         Co = Co + 1
       Next i
       Wb.Close SaveChanges:=False
       Set Wb = Nothing
     End If
   Next c
   Application.ScreenUpdating = True
End With
Set LastCell = Nothing

End Sub

【32195】Re:多数ファイル内データの取得方法につ...
質問  さくら  - 05/12/8(木) 20:40 -

引用なし
パスワード
   ご回答ありがとうございます。
試してみたのですが、動きません。なぜでしょうか?
知らない関数があり、よくわからない箇所があるのですが、
ご教授頂いたコードで、ファイルを開かせるまでの以下の部分だけで試したところ、Ifのコードが下記の違いで指定ファイルが開いたり開かなかったりするのですが。
ヘルプを見てもLen関数がよくわかりません。開かせるファイル名によっては =1ではだめなのでしょうか?
Sub Macro1()
(この間同じ)
            If Len(Dir(strFileName & c.Value)) = 1 Then
            If c.Value <> "" And Dir(strFileName) <> "" Then ← 上行をこうすると開くのですが
       Workbooks.Open (strFileName & c.Value)
     End If
  Next c
End With
End Sub

【32196】Re:多数ファイル内データの取得方法につ...
回答  Statis  - 05/12/8(木) 21:19 -

引用なし
パスワード
   ▼さくら さん:
>ご回答ありがとうございます。
>試してみたのですが、動きません。なぜでしょうか?
>知らない関数があり、よくわからない箇所があるのですが、
>ご教授頂いたコードで、ファイルを開かせるまでの以下の部分だけで試したところ、Ifのコードが下記の違いで指定ファイルが開いたり開かなかったりするのですが。
>ヘルプを見てもLen関数がよくわかりません。開かせるファイル名によっては =1ではだめなのでしょうか?
>Sub Macro1()
>(この間同じ)
>            If Len(Dir(strFileName & c.Value)) = 1 Then
>            If c.Value <> "" And Dir(strFileName) <> "" Then ← 上行をこうすると開くのですが
>       Workbooks.Open (strFileName & c.Value)
>     End If
>  Next c
>End With
>End Sub


失礼しました
If Len(Dir(strFileName & c.Value)) > 1 Then
でした

または
If Dir(strFileName) <> "" Then
で良いです。
「C.value=""」は必要ありません。
なぜなら、値のあるセルのみを取得しています。下記にて
 Set LastCell = .Range("A1", .Range("A65536").End(xlUp)) _
                 .SpecialCells(xlCellTypeConstants)

【32378】データの取得方法についてII
質問  さくら  - 05/12/13(火) 17:40 -

引用なし
パスワード
   先日はありがとうございました。再度ご教授頂きたいのですが。
前回同様に常時開いているファイル(Sheet1)に記述されたマクロで他のファイルを開いた後、下記の動作をさせたいのですがうまくいきません。
ファイル1〜100のA列、B列には何れも30行までデータが埋まっているとします。
1.    ファイル1のA1〜A10の平均値 → 常時開いているファイルのB1に出力
2.    ファイル1のA21〜A30の平均値 → 常時開いているファイルのB2に出力
3.    ファイル1のB1〜B10の平均値 → 常時開いているファイルのC1に出力
4.    ファイル1のB21〜B30の平均値 → 常時開いているファイルのC2に出力
ファイル2以降についても、1.〜4.の要領で行う。但し出力先は、直前の出力した各セルの1つ下へ繋げて出力していきたいのです。
前回に習って、上記動作部を下記の通りに書換えて実行しましたが、矢印の行でエラーとなります。
どのようにしたらいいのかご教授頂ければ幸いです。
Sub Macro1()

Dim LastCell As Range, c As Range, Wb As Workbook, strFileName As String
Dim i As Long, Co As Long

With ThisWorkbook.Worksheets("Sheet1")
から
Set Wb = Workbooks.Open(strFileName & c.Value)
まではファイルを開く部分で前回と同様です。以下は
Wb.ActiveSheet.Range("C1").Activate
      For X = 0 To 30 Step 20
        Wb.ActiveCell.Value = _ ← この行が定義エラーとなる
        Application.WorksheetFunction.Average(Wb.ActiveSheet.Range        (Cells(1 + X, 1), Cells(1 + X + 9, 1)))
        ActiveCell.Offset(1, 0).Activate
      Next X
      
Wb.ActiveSheet.Range("D1").Activate
      For X = 0 To 30 Step 20
        Wb.ActiveCell.Value = _
        Application.WorksheetFunction.Average(Wb.ActiveSheet.Range        (Cells(1 + X, 2), Cells(1 + X + 9, 2)))
        ActiveCell.Offset(1, 0).Activate
      Next X
        
      ↓Co=1としている
        . Range(Cells(Co, 2), Cells(Co + 1, 3))= _        
        Wb.ActiveSheet.Range(Cells(1, 3), Cells(2, 4))

        Co = Co + 2
     
       Wb.Close SaveChanges:=False
       Set Wb = Nothing
     End If
   Next c
   Application.ScreenUpdating = True
End With
Set LastCell = Nothing
End Sub

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