前提・実現したいこと
ExcelファイルからExcelファイル(一覧)へデータを転記するプログラムを作成しました。
(複数の転記元ファイルのデータを、一覧ファイルへ転記)
転記元ファイルのAシート、Bシートの一部セル → 転記先一覧ファイルのZシート
転記元ファイルのBシートは表形式になっており、表の行数はファイルによって異なります。
Bシートに2行以上データがある場合は、Zシートにもその行数分データを転記したいのですが、
その方法がわからず、困っています。
また、Bシートの表にデータがない場合は、転記処理を行わないようにしたいのですが、
これも実現できておりません。
Aシートのデータをa、Bシート表1行目のデータをb1、2行目のデータをb2とすると、
下記のようにデータを転記するマクロを作成したいです。
転記先Zシート(C列以降にもデータを転記しますが、説明の便宜上割愛します)
' A B
1 a b1
2 a b2
3 (別ファイルも同様に繰り返す)
Bシートの表が1行のときに、転記するマクロは作成できたため、
そのソースコードを記載致しますので、アドバイスをいただきたいです。
VBA初心者のため拙いソースコードがあり、改善できる部分もありましたら、併せてご指摘をいただけますと幸いです。
わかりにくい部分もあるかと思いますが、宜しくお願い致します。
該当のソースコード
VBA
1Option Explicit 2 3Dim mFSO As FileSystemObject 4 5Sub 一覧作成() 6 Dim rngList As Range 7 Dim vrtSubjectList As Variant 8 9 'シートの非表示行を表示する 10 Cells.EntireColumn.Hidden = False 11 12 'フィルターをクリア 13 If Worksheets("一覧").FilterMode Then 14 Worksheets("一覧").ShowAllData 15 End If 16 17 '自動更新しないように設定 18 With Application 19 .ScreenUpdating = False 20 .EnableEvents = False 21 .Calculation = xlCalculationManual 22 End With 23 24 'FileSystemObjectを呼び出す 25 Set mFSO = New FileSystemObject 26 27 '一覧表のセル範囲取得 28 Set rngList = ThisWorkbook.Worksheets("一覧").Range(Cells(2, 1), Cells(Cells(Rows.Count, 3).End(xlUp).Row, Cells(2, Columns.Count).End(xlToLeft).Column)) 29 30 '一覧表クリア 31 InitializeTable rngList 32 33 'ファイルのリストを取得 34 vrtSubjectList = Get_UpdatedSubjectList(rngList) 35 36 'データの転記 37 SetUpdated vrtSubjectList, rngList 38 39 '作成した一覧表をソート 40 Sort rngList 41 42 '項番採番 43 Reference rngList 44 45 '画面描画を再開 46 With Application 47 .ScreenUpdating = True 48 .EnableEvents = True 49 .Calculation = xlCalculationAutomatic 50 End With 51 52 MsgBox "一覧表を作成しました。" 53 54End Sub 55 56'一覧表をクリア 57Private Sub InitializeTable(ByRef rngList As Range) 58 Dim rngNotBlank As Range 59 60 Set rngList = ThisWorkbook.Worksheets("一覧").Range(Cells(2, 1), Cells(Cells(Rows.Count, 3).End(xlUp).Row, Cells(2, Columns.Count).End(xlToLeft).Column)) 61 62 With rngList 63 If rngList.Rows.Count > 1 Then 64 On Error Resume Next 65 66 'C列がBlankではないセルを取得 67 Set rngList = ThisWorkbook.Worksheets("一覧").Range(Cells(3, 1), Cells(Cells(Rows.Count, 3).End(xlUp).Row, Cells(2, Columns.Count).End(xlToLeft).Column)) 68 Set rngNotBlank = rngList.Columns(3).SpecialCells(xlCellTypeConstants) 69 On Error GoTo 0 70 If rngNotBlank Is Nothing Then Exit Sub 71 72 '一覧表のデータをクリア 73 rngNotBlank.EntireRow.ClearContents 74 75 End If 76 Set rngList = rngList.CurrentRegion 77 End With 78End Sub 79 80'ファイルのフルパスのリストを取得 81Private Function Get_UpdatedSubjectList(ByRef rngList As Range) As Variant 82 Dim WSF As WorksheetFunction 83 Dim myFolder As folder 84 Dim myFile As file 85 Dim strPath As String 86 Dim vrtNewList() As Variant 87 Dim ix As Long 88 89 Dim intPos As Long 90 91 ReDim vrtNewList(1 To 50000) 92 Set WSF = Application.WorksheetFunction 93 94 strPath = ThisWorkbook.Path 95 96 '一覧と同じフォルダにあるフォルダに対して繰り返し処理 97 For Each myFolder In mFSO.GetFolder(strPath).SubFolders 98 'フォルダ内のファイルに対して繰り返し処理 99 For Each myFile In myFolder.Files 100 ix = ix + 1 101 vrtNewList(ix) = myFile.Path 102 Next 103 Next 104 105 ReDim Preserve vrtNewList(1 To ix) 106 Get_UpdatedSubjectList = vrtNewList 107End Function 108 109'データの転記 110Private Sub SetUpdated(ByVal vrtSubjectList As Variant, ByRef rngList As Range) 111 Dim f As Variant 112 Dim ix, s As Long 113 Dim rng, As Range 114 Dim vrtNewList() As Variant 115 ReDim vrtNewList(LBound(vrtSubjectList) To UBound(vrtSubjectList), 1 To 5) 116 117 For Each f In vrtSubjectList 118 ix = ix + 1 119 '更新しないでファイルを開く 120 With Workbooks.Open(f, UpdateLinks:=0, ReadOnly:=True) 121 '自動計算を有効化(正しい管理番号を取得するため) 122 With Application 123 .Calculation = xlCalculationAutomatic 124 End With 125 126 For s = 1 To Worksheets.Count 127 If Worksheets(s).Name = "B" Then 128 Worksheets("B").Activate 129 Set rng = Worksheets("B").Range(Cells(3, 2), Cells(Cells(Rows.Count, 5).End(xlUp).Row, Cells(3, Columns.Count).End(xlToLeft).Column)) 130 131 '一覧に記載があるか判定 132 If rng.Rows.Count > 1 Then 133 With .Sheets("B") 134 vrtNewList(ix, 1) = .Range("D4").Value 135 vrtNewList(ix, 3) = .Range("H4").Value 136 vrtNewList(ix, 4) = .Range("I4").Value 137 vrtNewList(ix, 5) = .Range("J4").Value 138 End With 139 With .Sheets("A") 140 vrtNewList(ix, 2) = .Range("F7").Value 141 End With 142 Next 143 End If 144 End If 145 Next 146 .Close False 147 End With 148 Next 149 150 'データを一覧に転記 151 With rngList 152 Set rngList = .Cells(3, 2).Resize(UBound(vrtNewList, 1), UBound(vrtNewList, 2)) 153 End With 154 rngList.Value = vrtNewList 155 156End Sub 157 158'作成した一覧表をソート 159Private Sub Sort(ByRef rngList As Range) 160 161 Set rngList = ThisWorkbook.Worksheets("一覧").Range(Cells(2, 1), Cells(Cells(Rows.Count, 3).End(xlUp).Row, Cells(2, Columns.Count).End(xlToLeft).Column)) 162 163 'ソート 164 With rngList 165 rngList.Sort Key1:=Range("B3"), Order1:=xlAscending, _ 166 Key2:=Range("C3"), Order2:=xlAscending, Header:=xlYes, _ 167 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin 168 End With 169 170End Sub 171 172'項番採番 173Private Sub Reference(ByRef rngList As Range) 174 Dim L, n As Integer 175 176 Set rngList = ThisWorkbook.Worksheets("一覧").Range(Cells(3, 1), Cells(Cells(Rows.Count, 3).End(xlUp).Row, Cells(2, Columns.Count).End(xlToLeft).Column)) 177 178 While rngList.Cells(L, 3).Value <> "" 179 rngList.Cells(L, 1).Value = n 180 L = L + 1 181 n = n + 1 182 Wend 183 184End Sub 185 186