以下の現状のソースを実行すると、[現状の実行結果]のようになります。
(ファイルごとの月数は同じです)
[現状の実行結果]だとD列以降の月数が以下の点で不正で、[得たい実行結果]のように転記を実行したいのですが、調べてもなかなかうまくいかないので、どのようにソースを修正すれば良いか教えていただきたいです。
・2行目の月数が最後(今回だと2つ目)のファイルの月数で上書きされてしまう。
・次のファイルに切り替わる時に開発A1の上に月数の行が表示されない。([得たい実行結果]の21行目のように表示したい)
よろしくお願いします。
[現状のソース]
Macro
1Sub sample1() 2 3 Dim lngRowsNo As Long ' 書きこむ位置 4 Dim lngSheetIndex As Long ' シートの番号 5 Dim strFile As String ' Excelファイルの場所 6 Dim xlsAcq As New Excel.Application ' 取得側Excel 7 Dim wbAcq As Workbook ' 取得側Excelブック 8 Dim wsAcq As Worksheet ' 取得側Excelシート 9 Dim wsSet As Worksheet ' 設定側Excelシート 10 Const strPath As String = "パスを指定" 11 Set wsSet = ActiveSheet 12 Dim i As Long 13 14 strFile = Dir(strPath & "*.xls") 15 lngRowsNo = 3 16 Do Until strFile = "" 17 '----- Excelブックを開く 18 Set wbAcq = Workbooks.Open(strPath & strFile) 19 20 '----- シートを検索 21 For lngSheetIndex = 1 To wbAcq.Worksheets.Count 22 '----- 「更新」シートを検索 23 If wbAcq.Worksheets(lngSheetIndex).Name = "更新" Then 24 '----- 「更新」シートを変数へ登録 25 26 Set wsAcq = wbAcq.Worksheets(lngSheetIndex) 27 '----- 「更新」シートの内容を現在のシートにコピー(自由に変更して下さい) 28 With wsAcq 29 Dim fname As String 'ファイル名 30 Dim n As Long 'ループで使用します。 31 Dim m As Long 'ループで使用します。 32 Dim ec1 As Long '各開発の一番下の担当者のセルを取得 33 Dim ec2 As Long '各開発の 月の一番右(最後)のセルを取得 34 Dim ColumnNo As Long ' 転記先の列番号(初期値4) 35 Dim ColumnNo2 As Long ' 転記元の列番号(初期値5)+3されていく 36 37 ColumnNo = 4 38 ColumnNo2 = 5 39 40 For i = 1 To .UsedRange.Rows.Count 41 42 If (Left(.Cells(i, 2).Value, 2) = "A1" Or Left(.Cells(i, 2).Value, 2) = "B1" Or Left(.Cells(i, 2).Value, 2) = "C1") And .Cells(i, 2).MergeCells = False Then 43 44 45 46 47 ' ------ 開発〇から一番上の担当者のセル位置を相対的にCells(i + 3, 3)として取得し 48 'データの入っているところまでループさせる (その時、開発名を転記) 49 ec1 = .Cells(i + 3, 2).End(xlDown).Row 50 For n = i + 3 To ec1 51 52 '担当者が空白の時スキップする 53 If Cells(n, 3) = "" Then 54 GoTo NEXT99 55 End If 56 57 'ファイル名 58 fname = ActiveWorkbook.Name 59 wsSet.Cells(lngRowsNo, 1).Value = fname 60 61 '開発 62 wsSet.Cells(lngRowsNo, 2).Value = .Cells(i, 2).Value 63 64 '担当者 65 wsSet.Cells(lngRowsNo, 3).Value = .Cells(n, 3).Value 66 67 '工数 68 wsSet.Cells(lngRowsNo, 4).Value = .Cells(n, 5).Value 69 70 wsSet.Cells(lngRowsNo, 5).Value = .Cells(n, 8).Value 71 72 wsSet.Cells(lngRowsNo, 6).Value = .Cells(n, 11).Value 73 74 wsSet.Cells(lngRowsNo, 7).Value = .Cells(n, 14).Value 75 76 wsSet.Cells(lngRowsNo, 8).Value = .Cells(n, 17).Value 77 78 wsSet.Cells(lngRowsNo, 9).Value = .Cells(n, 20).Value 79 80 wsSet.Cells(lngRowsNo, 10).Value = .Cells(n, 23).Value 81 82 wsSet.Cells(lngRowsNo, 11).Value = .Cells(n, 26).Value 83 84 wsSet.Cells(lngRowsNo, 12).Value = .Cells(n, 29).Value 85 86 wsSet.Cells(lngRowsNo, 13).Value = .Cells(n, 32).Value 87 88 '1行下へ 89 lngRowsNo = lngRowsNo + 1 90 91NEXT99: 92 Next n 93 '月を取得して転記 94 ec2 = .Cells(i + 1, 5).End(xlToRight).Column + 1 95 For col = 5 To ec2 96 97 wsSet.Cells(2, ColumnNo).Value = .Cells(i + 1, ColumnNo2).Value 98 99 ColumnNo = ColumnNo + 1 100 ColumnNo2 = ColumnNo2 + 3 101 102 Next col 103 104 End If 105 Next i 106 End With 107 108 '----- 検索の終了 109 Exit For 110 End If 111 Next lngSheetIndex 112 113 '----- シート参照の解放 114 Set wsAcq = Nothing 115 '----- ブックを閉じる 116 wbAcq.Close Savechanges:=False 117 118 '----- 次のファイルへ 119 strFile = Dir() 120 121 122 Loop 123 124 '----- Excelへの参照の解放 125 Set xlsAcq = Nothing 126 127 Dim maxrow As Long '最終行 128 maxrow = wsSet.Cells(Rows.Count, 3).End(xlUp).Row 'C列で最終行を求める 129 For i = 3 To maxrow 130 131 If wsSet.Cells(i, "C").Value = "担当者" Then 132 wsSet.Cells(i, "A").Value = "" 133 wsSet.Cells(i, "B").Value = "" 134 End If 135 Next 136 137End Sub
Excelには「マクロの記録」という機能があります。
「マクロの記録」を使って一度手作業で自分のしたい作業を行い
どういうときどんな機能を使えば良いか確認されたほうが良いかと思います。
あなたの回答
tips
プレビュー