A列のコード数字2桁~6桁を元にシートを分ける。(今回の質問)
シート内の特定のセルから値を取得して、CSV形式で保存する。(最終形)
困っていること
現在のコードだと1回で、終了してしまいます。
A列の取引先コードの数は決まっていません。取引先毎に出力するにはどうすればいいのでしょうか?
現在のシート
|||
取引先CD | 請求先郵便番号 | 請求先住所1 |
---|---|---|
20010 | xxx-xxxx | xx県xx市 |
20010 | xxx-xxxx | xx県xx市 |
20022 | xxx-xxxx | xx県xx市 |
20022 | xxx-xxxx | xx県xx市 |
20099 | xxx-xxxx | xx県xx市 |
VBA
1Option Explicit 2 3Sub cutxlsx() 4 5'xlsxファイルが存在するかの確認 6Dim rs As Boolean 7If OpenFileName1 <> "" Then 8 Workbooks.Open OpenFileName1 9 rs = True 10Else 11 MsgBox "Excelファイルを指定してください。" 12 rs = False 13End If 14 15If rs = True Then 'xlsxを開いていれば処理を進める 16 17'WorkBookを開いてActiveにさせる 18Workbooks(Filename1).Activate 19 20'WorkBookに開いたファイルのSheet1を保存、今後【ws】で呼び出せる 21Dim ws As Worksheet 22Dim wsname As String 23Dim wsnumber As Integer 24Set ws = ActiveSheet '現在のシート 25 26'A列を文字列から数値に置換(エラー回避) 27With Intersect(ActiveSheet.UsedRange, Columns("A")) 28 .NumberFormat = "" 29 .Value = .Value 30End With 31 32'Sheet名の決定 33wsname = "Sheet" 34wsnumber = 2 35 36'Sheetの追加 37 Worksheets.Add(After:=Worksheets(Worksheets.Count)) _ 38 .name = (wsname & wsnumber) 'シート名はFor文で回して被らないようする 39 40'ここからFor文で囲う必要あり 41 42Sheets("Sheet1").Rows(1).Copy 'ヘッダーをコピー 43Sheets(wsname & wsnumber).Rows(1).PasteSpecial (xlPasteAll) 'ヘッダーを貼付 44 45ws.Activate 'Sheet1をActivate 46 47Dim i As Integer 48Dim j As Integer 49Dim r As Integer 50Dim lastRow As Long 51 52r = 2 '結果表示の初期値 53i = 2 '現在の比較行 54 55lastRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行までを取得 56 57For j = 2 To lastRow '注目行を2行目からA列最終行まで 58 59 If ws.Cells(i, "A") = ws.Cells(j, "A") Then 'A列の比較元行の値と注目行の値が同じ 60 61 ws.Rows(j).Copy Sheets(wsname & wsnumber).Rows(r) '注目行を"test"シートの結果 62 r = r + 1 '結果表示行+1 63End If 64 65Next 66wsnumber = wsnumber + 1 'Sheet名+1 67End If 'xlsxファイルの存在確認 68 69End Sub 70
コード修正致しました。しかし、このコードでは10あるうち8行で止まってしまいます。
恐らくElseの分がFor rの方でカウントされてしまうからのようで、どのようにすれば総実行回数を割り出せるのでしょうか?この時、取引先は全てで4つで実験しています。
VBA
1For r = 2 To ws.Cells(Rows.Count, "A").End(xlUp).Row '取引先コードの分だけ処理する 2 3 '取引先CDが同じ場合 4 If ws.Cells(o, "A") = CD.Cells(j, "A") Then '1つ下の行と値が同じ場合 5 ws.Rows(o).Copy Sheets(wsname & wsnumber).Rows(k) '一致した場合コピー 6 o = o + 1 'コピー先がひとつ下がる 7 k = k + 1 8 Else 9 '取引先コードが変わった時 10 wsnumber = wsnumber + 1 'Sheetを1足して作成 11 Worksheets.Add(After:=Worksheets(Worksheets.Count)) _ 12 .name = (wsname & wsnumber) 'Sheetの追加 13 Sheets("Sheet1").Rows(1).Copy 'ヘッダーをコピー 14 Sheets(wsname & wsnumber).Rows(1).PasteSpecial (xlPasteAll) 'ヘッダーを貼付 15 j = j + 1 '取引先コードの分だけループなので、ひとつ下がる 16 k = 2 17 End If
回答3件
あなたの回答
tips
プレビュー