Excel VBA質問箱 IV

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

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


5883 / 13645 ツリー ←次へ | 前へ→

【48334】ファイルのデータをまとめ、更に別場所にコピー の ぶ 07/4/13(金) 9:53 質問[未読]
【48341】Re:ファイルのデータをまとめ、更に別場所... Kein 07/4/13(金) 13:29 回答[未読]
【48344】Re:ファイルのデータをまとめ、更に別場所... の ぶ 07/4/13(金) 14:47 お礼[未読]
【48347】Re:ファイルのデータをまとめ、更に別場所... の ぶ 07/4/13(金) 15:30 質問[未読]
【48349】Re:ファイルのデータをまとめ、更に別場所... Kein 07/4/13(金) 16:08 回答[未読]
【48353】Re:ファイルのデータをまとめ、更に別場所... の ぶ 07/4/13(金) 17:05 お礼[未読]
【48406】Re:ファイルのデータをまとめ、更に別場所... の ぶ 07/4/16(月) 16:19 質問[未読]

【48334】ファイルのデータをまとめ、更に別場所に...
質問  の ぶ  - 07/4/13(金) 9:53 -

引用なし
パスワード
   いつも参考にさせていただいてます。
質問です。
下記の様なブックが3つあります。
A1〜A30くらい(毎月変動)までに名前、
B1列〜AF1列(1日から31日)にシフト名a〜dが入ります。
同じく
B2〜AF2にシフト名
以下A列にコードが入ってる限りB〜AF列にシフト名が入る。

A.xls シート名1
  A  B  C  D  E........AF
1 名1 a  b  c  b........a
2 名2 b  a  d  c........c


B.xls シート名2
  A  B  C  D  E........AF
1 名3 a  b  c  b........a
2 名4 b  a  d  c........c


C.xls シート名3
  A  B  C  D  E........AF
1 名5 a  b  c  b........a
2 名6 b  a  d  c........c


3つのファイルのデータを纏めて一つのブックにし保存したいと思ってます。

ABC.xls
  A  B  C  D  E........AF
1 名1 a  b  c  b........a
2 名2 b  a  d  c........c
1 名3 a  b  c  b........a
2 名4 b  a  d  c........c
1 名5 a  b  c  b........a
2 名6 b  a  d  c........c

上記で出来たファイルから名前で検索し、1〜31(B〜AF)をコピーし
別ブックD.xlsのA1〜A31に入れたいと思っています。
上記のやり方がわからなく困っております。

どなたか良い方法ありましたらご教授ください。

【48341】Re:ファイルのデータをまとめ、更に別場...
回答  Kein  - 07/4/13(金) 13:29 -

引用なし
パスワード
   マクロは、まとめ用の新規ブックに入れるのが自然ですね。
まず新規ブックを一つ作り、VBEで標準モジュールを追加し、
そこへ以下のマクロを入れて「ブック名やシート名に注意して、
違っていたら実際の名前に修正してから」実行して下さい。

Sub Data_Collect()
  Dim WS As Worksheet
  Dim BkAry As Variant
  Dim i As Long, xR As Long
  Dim MyF As String, Snm As String

  Set WS = ThisWorkbook.Worksheets(1)
  BkAry = Array("A", "B", "C")
  Application.ScreenUpdating = False
  WS.Cells.ClearContents
  For i = 0 To 2
   MyF = Application.DefaultFilePath & _
   "\" & BkAry(i) & ".xls"
   Snm = StrConv(CStr(i + 1), 4)
   Workbooks.Open MyF
   With ActiveWorkbook.Worksheets(Snm)
     xR = .Range("A65536").End(xlUp).Row
     If i = 0 Then
      .Range("A1:AF" & xR).Copy WS.Range("A1")
     Else
      .Range("A2:AF" & xR).Copy WS.Range("A65536") _
      .End(xlUp).Offset(1)
     End If
   End With
   ActiveWorkbook.Close False
  Next i
  Set WS = Nothing
End Sub

名前を検索してD.xlsに転記するマクロは

Sub Data_Cpy()
  Dim Nm As String
  Dim CkR As Variant
  Dim WB As Workbook

  With Worksheets(1)
   If WorksheetFunction.CountA(.Range("A:A")) = 0 Then
     Exit Sub
   End If
   Do
     Nm = InputBox("検索する名前を入力して下さい")
     If Nm = "" Then Exit Sub
     CkR = Application.Match(Nm, .Range("A:A"), 0)
     If IsError(CkR) Then MsgBox Nm & vbLf & "は見つかりません"
   Loop While IsError(CkR)
   .Range(.Cells(CkR, 2), .Cells(CkR, 32)).Copy
  End With
  Application.ScreenUpdating = False
  On Error Resume Next
  Set WB = Workbooks("D.xls")
  If Err.Number <> 0 Then
   Workbooks.Open ThisWorkbook.Path & "\D.xls"
   Set WB = ActiveWorkbook: Err.Clear
  End If
  On Error GoTo 0
  With WB.Worksheets(1)
   .Activate
   .Range("A:A").ClearContents
   .Range("A1").PasteSpecial xlPasteValues, , , True
  End With
  With Application
   .CutCopyMode = False
   .ScreenUpdating = True
  End With
  Set WB = Nothing
End Sub   

【48344】Re:ファイルのデータをまとめ、更に別場...
お礼  の ぶ  - 07/4/13(金) 14:47 -

引用なし
パスワード
   Keinさん
ご解答、コードの提示までしていただいてありがとうございます。

このコードで試してみたいと思います。

分からないところだらけなので、実行してみた後にまた質問させていただきます

【48347】Re:ファイルのデータをまとめ、更に別場...
質問  の ぶ  - 07/4/13(金) 15:30 -

引用なし
パスワード
   お世話になります。

いただいたコードで試そうとしているのですが、質問があります。

現在は固定でA.xls、B.xls、C.xls、ABC.xlsでやろうと思っているのですが、
将来的には、3つのファイルパスをABC.xlsのセルに記入させて、そのパスのファイルから検索するような感じにしたいと思っています。
その場合、
>BkAry = Array("A", "B", "C")
(配列名がそのままファイル名になっているということでしょうか?)
や、
>MyF = Application.DefaultFilePath & _
>"\" & BkAry(i) & ".xls"
の部分を、ABC.xlsのファイルパスの記入されたセルを参照し、
当てはめてやる、といった感じで変えてやればよいのでしょうか?

例)MyF = Cells(50,1) Aのパス

【48349】Re:ファイルのデータをまとめ、更に別場...
回答  Kein  - 07/4/13(金) 16:08 -

引用なし
パスワード
   >3つのファイルパス
フルパスを書くとなると結構長いので、タイプミスでエラーになるかも
しれませんよ。なのでもし、3つのブックが別々のフォルダーに保存
されているなら、一つにまとめておいてブック名(拡張子はいらない)のみを
セルに入力した方がいいです。
それが出来ないなら、"ファイルを開く"ダイアログを繰り返し出して、
コピー元のブックを一つ選択しては処理する。というやり方にした方が安全です。
それで良ければコードは・・

Sub Data_Collect2()
  Dim WS As Worksheet
  Dim i As Long, xR As Long
  Dim MyF As String, Snm As String

  Set WS = ThisWorkbook.Worksheets(1)
  Application.ScreenUpdating = False
  WS.Cells.ClearContents
  For i = 1 To 3
   MyF = Application _
   .GetOpenFilename("エクセルブック(*.xls),*.xls")
   If MyF = "False" Then Exit Sub
   Snm = StrConv(CStr(i), 4)
   Workbooks.Open MyF
   With ActiveWorkbook.Worksheets(Snm)
     xR = .Range("A65536").End(xlUp).Row
     If i = 1 Then
      .Range("A1:AF" & xR).Copy WS.Range("A1")
     Else
      .Range("A2:AF" & xR).Copy WS.Range("A65536") _
      .End(xlUp).Offset(1)
     End If
   End With
   ActiveWorkbook.Close False
  Next i
  Set WS = Nothing
End Sub

【48353】Re:ファイルのデータをまとめ、更に別場...
お礼  の ぶ  - 07/4/13(金) 17:05 -

引用なし
パスワード
   ご返事ありがとうございます。

フルパス指定だと、確かにミスする可能性ありますね。
エラーが出る可能性を残しておく必要ないですしね。

また少し挑戦してみます。

【48406】Re:ファイルのデータをまとめ、更に別場...
質問  の ぶ  - 07/4/16(月) 16:19 -

引用なし
パスワード
   お世話になります。

頂いたコードで色々唸っているのですが、分からないところがあるので、
質問させてください。

1.>xR = .Range("A65536").End(xlUp).Row
 >If i = 1 Then
2.> .Range("A1:AF" & xR).Copy WS.Range("A1")
 >Else
3.> .Range("A2:AF" & xR).Copy WS.Range("A65536") _
 > .End(xlUp).Offset(1)
 >End If

1.xRにA列の下から上にデータが入ってる直前のセルを探してその値を入れる
2.A1:AF30〜データが入っている一番下のセルをコピー
(データがある列を全部コピー)
>WS.Range("A1")
→これも分かりません。

3.全体の処理的には2週目(2ファイル目)以降は3.にいくみたいなのですが、
処理自体がちょっと分からないので困っております。

お時間有ればご教授お願い致します。

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