- ベストアンサー
エクセルマクロで流し込み書き出しはできますか?
- エクセルでSheet1,2,3に入っている値を加工してSheet3に書き出すマクロを作りたい
- 特にSheet1と2には縦一列にデータが並んでおり、それらを結合したいが個数が不特定のため困っている
- 数値も文字も個数は変動するため、対応可能なマクロを作りたい
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。#1、cj、追加レスです。 コンサバ版を書いてみましたので、説明コメント付きであげておきます。 コツコツとマメに手数の多い書き方ですから、 場合によっては処理が少し遅くなりますが、 技術的には初級のもので揃えましたから、 メンテナンスはより易しいと思います。 "A1"と"A"の箇所だけ見ていけばセル範囲指定の変更も楽にできます。 B列に変更するなら"B1"とか"B"とか、 先頭行を2行めにするなら"A2"とか、、、。 ' ' ============================== ' ' 標準モジュール専用 Sub Re8212645c() Dim r As Range ' ループ用 セル範囲 Dim sBuf1 As String ' Sheet1数値を文字列として流し込みながらカンマ区切り ' "固定文字列1_カンマ区切り文字列_固定文字列2_(" Dim sBuf2 As String ' Sheet2文字列を'文字列'カンマ区切りで整形連結 Dim cnR As Long ' Sheet2文字列の件数をカウント Dim nPRow As Long ' 出力行位置 ' ' ――――――――――――――――――――――――――――― ' ' ――――――――――――――――――――――――――――― ' ' Sheet1 A列に数値がある With Sheets("Sheet1") ' ' A列、1行めから最下行までループ For Each r In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) ' ' 各セル数値を文字列としてsBuf1に流し込みながらカンマ区切り sBuf1 = sBuf1 & "," & r.Text Next r End With ' ' 先頭1文字を半角スペースに置換 Mid(sBuf1, 1) = " " ' ' ――――――――――――――――――――――――――――― ' ' ――――――――――――――――――――――――――――― ' ' Sheet3 A1に固定文字列1、A2に固定文字列2 With Sheets("Sheet3") ' ' 文字列連結 "固定文字列1_カンマ区切り文字列_固定文字列_(" sBuf1 = .Range("A1").Text & sBuf1 & " " & .Range("A2").Text & " (" End With ' ' ――――――――――――――――――――――――――――― ' ' Excel 描画更新中止 Application.ScreenUpdating = False ' ' ――――――――――――――――――――――――――――― ' ' Sheet4 出力先シートを選択 Sheets("Sheet4").Select ' ' ――――――――――――――――――――――――――――― ' ' ――――――――――――――――――――――――――――― ' ' Sheet2 A列に文字列がある With Sheets("Sheet2") ' ' A列、1行めから最下行までループ For Each r In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) ' ' 各セル文字列をsBuf2に流し込みながら整形 ' ' カンマ区切り シングルクォートで括る → ,'文字列' sBuf2 = sBuf2 & ",'" & r.Text & "'" ' ' 流し込む文字列の件数をカウント cnR = cnR + 1 ' ' 100件毎に If cnR Mod 100 = 0 Then ' ' 出力行位置を1増 nPRow = nPRow + 1 ' ' 出力 Cells(nPRow, "A") = sBuf1 & Mid$(sBuf2, 2) & ")" ' ' 流し込む文字列変数を空にする sBuf2 = "" End If Next ' ' 100件毎で、余りがあれば(以下、同上) If cnR Mod 100 > 0 Then nPRow = nPRow + 1 Cells(nPRow, "A") = sBuf1 & Mid$(sBuf2, 2) & ")" End If End With ' ' ――――――――――――――――――――――――――――― ' ' Excel 描画更新再開 Application.ScreenUpdating = True End Sub ' ' ==============================
その他の回答 (1)
- cj_mover
- ベストアンサー率76% (292/381)
Sub Re8212645() Dim v Dim sBuf As String Dim sCsv As String Dim nBtm As Long Dim i As Long With Sheets("Sheet1") For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row sBuf = sBuf & "," & .Cells(i, 1) Next i End With Mid(sBuf, 1) = " " With Sheets("Sheet3") sBuf = .Cells(1, 1) & sBuf & " " & .Cells(2, 1) & " (" End With With Sheets("Sheet2") nBtm = .Cells(Rows.Count, 1).End(xlUp).Row v = .Cells(1, 1).Resize(nBtm).Value End With v = Application.Text(v, "'@'") v = Application.Transpose(v) sCsv = Join(v, ",") For i = 100 To nBtm - 1 Step 100 sCsv = Application.Substitute(sCsv, ",", vbCrLf, i + 1 - i \ 100) Next i v = Split(sCsv, vbCrLf) Application.ScreenUpdating = False Sheets("Sheet4").Select For i = 0 To UBound(v) Cells(i + 1, 1) = sBuf & v(i) & ")" Next i Application.ScreenUpdating = True End Sub 説明がない部分は勝手に補っていますから、 実際のシートデザインに合わせて修正してください。 例示が正しいという前提で半角スペースを挟んでいます。 セル範囲はすべてA列1行めから下へ、という仮の設定で書いています。 修正が手に余るようでしたら、具体的に補足してみて下さい。 迷わず書ける説明でしたら再レスします。
お礼
ありがとうございます。 週末か遅くとも月曜日には確認し、コメントしさせていただきます。
お礼
貴重なお時間を割いていただいてありがとうございます。 参考となるソースだけでありがたいのに、 ご親切に分かりやすくしていただいたので、 カスタマイズ、微調整しやすく完璧です。 ありがとうございました。