• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのマクロでデータを左につめていく)

エクセルマクロでデータ左詰め

このQ&Aのポイント
  • エクセルのマクロを使用して、データを左に詰めて表示する方法についてご質問です。
  • 毎回同じ処理をしているため、良いサンプルが欲しいです。
  • 処理前のデータ表と処理後のデータ表のイメージも教えてください。

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.5

一例です。 Sub sample() Dim Wk(5) As Variant With ActiveSheet.UsedRange lastrow = .Cells(.Count).Row End With For i = 2 To lastrow j = 0: Erase Wk For k = 1 To 6 If Cells(i, k) <> "" Then Wk(j) = Cells(i, k) j = j + 1 End If Next k Range(Cells(i, 1), Cells(i, 6)).Value = Wk Next i End Sub

smi
質問者

お礼

回答ありがとうございます。 やりたいことが実現できました。 配列を使って処理する方法は今回のような場合には効率的なのですね。 まだ勉強中なので、自分で教えて頂いたコードを勉強させてもらいたいと思います。 ありがとうございました。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こういう単純なマクロの質問って、結構落とし穴が一杯がありますね。 空白と言いながら、この前の人のように空白値にスペースが入っていることで、本当にブランクセルではないケースがあります。それで、こちらに文句を付けられてしまいました。ダメだったら、無視してくれればよいです。 >※G列以降にもデータが入力されていますが、処理したい列範囲はA列~F列です。 これは、F列までで、それ以降は、詰めたくないというケースですね。 それを読み取らないといけないようです。(マクロよりも、質問を読み取るほうが、何倍も難しいです。) そうすると、1,2は、両方ともダメだということになります。それで考えたのは、3番目のコードです。(1,2は今回は取りやめ)Delete は、セル一つずつ削除せずに、Union などで、まとめて削除するというのが定石です。 以下は、配列を使っています。 処理後のイメージで、 2行目 ***  ***    -    ***   ***   - なぜ、空白値が間に残っているか分かりません。もしかしたら、3行目からかな? もしそうだったら、   Set rng = .Offset(2).Resize(.Rows.Count - 2, iCL) 'F列まで となります。 '// Sub Test3()  Dim rng As Range  Dim i As Long, j As Long  Dim ar As Variant  Dim arBuf() As String  Dim cl As Variant  Dim delRng As Range  Const iCL As Long = 6 '列  With ActiveSheet.UsedRange   Set rng = .Offset(1).Resize(.Rows.Count - 1, iCL) 'F列まで   ReDim arBuf(0, iCL - 1)   For Each cl In rng.Rows    ar = Application.Index(cl.Value, 1, 0) '配列に格納    For i = 1 To UBound(ar)     If Trim(ar(i)) <> "" Then      arBuf(0, j) = ar(i)      j = j + 1     End If    Next    cl.Cells = arBuf    ReDim arBuf(0, iCL - 1)    j = 0   Next  End With End Sub

smi
質問者

お礼

回答ありがとうございます。 質問から色々と読み取って頂いてありがとうございます。 配列の使い方もちょっと興味を持っているのですが、まだ勉強を始めたばかりなので、 少しずつ実例を使っていきながらステップアップさせてもらいたいと思います。 教えて頂いたサンプルさっそく利用させていただきます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! 一例です。 Sub test() Dim i, j As Long For i = 2 To ActiveSheet.UsedRange.Rows.Count For j = 6 To 1 Step -1 If Cells(i, j) = "" Then Cells(i, j).Delete (xlToLeft) End If Next j Next i End Sub こんな感じですかね? 参考になれば良いのですが・・・m(__)m

smi
質問者

お礼

回答ありがとうございます。 データが左に移動できました。 でも、G列、H列の値も左にずれていってしまいました。 あとは、自分で教えて頂いたコードを勉強して完成を目指したいと思います。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.2

例示のデータの2行目が良くわからないのですが、単純に空白セルを左側に詰めるなら以下のコードでどうでしょうか。 Range("A1").CurrentRegion.SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft

smi
質問者

お礼

回答ありがとうございます。 説明不足で申し訳ありません。 実際のデータは、2行目から入力されていて、1行目は表の項目データで、 マクロの対象にしたいセル範囲は、セルA2からです。とコメントを加えるべきでした。 教えて頂いた内容でデータ移動はできたのですが、対象はA列~F列のみにしたいので、 G列以降が移動しないように、自分で勉強して完成させて頂きたいと思います。 ありがとうございました。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

Sub test() Dim r As Long, c1 As Long, c2 As Long For r = 2 To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 For c1 = 1 To 5 If Cells(r, c1).Value = "" Then For c2 = c1 + 1 To 6 If Cells(r, c2).Value <> "" Then Cells(r, c1).Value = Cells(r, c2).Value Cells(r, c2).ClearContents Exit For End If Next c2 End If Next c1 Next r End Sub 結構無駄なことをしているので、もっと時間短縮できるスマートなマクロもあると思います。

smi
質問者

お礼

ありがとうございます。やりたい通りのことが実現できました。 コードの内容はまた自分で勉強させてもらいます。

関連するQ&A