• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルマクロで流し込み書き出しはできますか?)

エクセルマクロで流し込み書き出しはできますか?

このQ&Aのポイント
  • エクセルでSheet1,2,3に入っている値を加工してSheet3に書き出すマクロを作りたい
  • 特にSheet1と2には縦一列にデータが並んでおり、それらを結合したいが個数が不特定のため困っている
  • 数値も文字も個数は変動するため、対応可能なマクロを作りたい

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.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 ' ' ==============================

tanapyondai
質問者

お礼

貴重なお時間を割いていただいてありがとうございます。 参考となるソースだけでありがたいのに、 ご親切に分かりやすくしていただいたので、 カスタマイズ、微調整しやすく完璧です。 ありがとうございました。

その他の回答 (1)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

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行めから下へ、という仮の設定で書いています。 修正が手に余るようでしたら、具体的に補足してみて下さい。 迷わず書ける説明でしたら再レスします。

tanapyondai
質問者

お礼

ありがとうございます。 週末か遅くとも月曜日には確認し、コメントしさせていただきます。

関連するQ&A

専門家に質問してみよう