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

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

エクセルのマクロでデータを左につめていく

お世話になります。エクセル2002でマクロを作成しようと思っています。 毎回同じ処理をしているので、良いサンプルがあったら教えてください。 やりたいこと  A列からF列にランダムにデータが入力されています。  このデータをA列、B列、C列と、左に詰め表示させたいです。  ※G列以降にもデータが入力されていますが、処理したい列範囲はA列~F列です。  ※行数は、都度変わります。(UsedRange.Rows.Countで値を取得) イメージ(処理前)  -  : 空白セル  *** : データが入力されているセル     A列   B列  C列  D列  E列   F列 1行目 項目1 項目2 項目3 項目4 項目5 項目6 2行目 ***  ***  -   ***  *** - 3行目 - -   -  *** *** *** 4行目 ***  -   -   -   -   -  5行目 *** *** -   *** -   -  イメージ(処理後)     A列  B列  C列   D列  E列  F列 1行目 項目1 項目2 項目3 項目4 項目5 項目6 2行目 ***  ***  -   ***  *** - 3行目 *** *** *** - -   - 4行目 ***  -   -   -   -   -  5行目 *** *** *** -   -  -

  • smi
  • お礼率47% (54/114)

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

  • ベストアンサー
  • 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

  • エクセルデータのカウント

    A1:E5にデータが入力してあります。(空白セルもあり) C列、D列、E列のどれか1つのセルにでもデータ(数値) が入っている行の数をカウントして、A6に表示する 方法を教えてください。 たとえばF列に、=COUNT(C1:E1)を計算する行を入れて、 A8で=COUNTIF(F1:F5,">=1")をすれば、できるのだと思うのですが、 そのために行を増やしたくないのです。

  • エクセルのマクロ記述について

    下記の処理をエクセルのマクロで行いたいのですが、どのように記述したよいか教えてください。 4行目から入力されている行まで下記の処理をマクロで行う。 1.J列のセル入力がCIRCLEの行で、B~E列の数値が同じセル間を結合する。 2.K列のセル入力がCIRCLEの行で、F~I列の数値が同じセル間を結合する。 3.J列のセル入力がOBLONG_XまたはOBLONG_Yの行で、B,D列及びC,E列の数値が同じ場合、B列をB列の数値XC列の数値とし、B~E列のセルを結合する。 4.K列のセル入力がOBLONG_XまたはOBLONG_Yの行で、F,G列及びH,I列の数値が同じ場合、F列をF列の数値XG列の数値とし、F~I列のセルを結合する。 5.J列のセル入力がOBLONG_XまたはOBLONG_Yの行で、B,D列及びC,E列の数値が同じでない場合、B列をB列の数値XC列の数値とし、B,C列のセルを結合する。又、D列をD列の数値XE列の数値とし、D,E列のセルを結合する。 6.K列のセル入力がOBLONG_XまたはOBLONG_Yの行で、F,G列及びH,I列の数値が同じでない場合、F列をF列の数値XG列の数値とし、F,G列のセルを結合する。又、H列をH列の数値XI列の数値とし、H,I列のセルを結合する。 7.J列のセル入力がSHAPEの行で、B~E列は何もしない 8.K列のセル入力がSHAPEの行で、F~I列は何もしない

  • テキストファイルのデータをエクセルへコピーのやり方

    よろしくお願いします。 エクセル2000を使っています。 テキストのデータで A1/B1/C1    /はスペースです。 D1/E1/F1    データの長さは全部違います。 A2/B2/C2     D2/E2/F2 A3/B3/C3     D3/E3/F3      ・    ・(続く) といったものがあります。これをエクセルで    A列 B列 C列 D列 E列 1行 A1 B1 C1 D1 E1 2行 A2 B2 C2 D2 E2  ・・・ 3行 A3 B3 C3 D3 E3  (続く)          ・          ・(続く) という感じで別々のセルにいれて貼り付けしたいのです。 テキストデータを別々のセルに貼り付けする方法は 過去ログで「区切り位置」というのをつかえばいいというのはわかりましたが、この場合の複数行にわたるテキストデータをエクセルの1行に貼り付けする方法がわかりません。また、データの長さが違うために「区切り位置」もうまくいきません。 良い解決法をお願いします。

  • エクセル(excel)の計算式(関数)について

    エクセル(excel)の計算式(関数)でよいアイディアがありましたら教えてください。 1行目は項目行です。 セルA1から右に15列=セルO1まで、 a | b | c | d | e | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 と入っています。 2行目からデータとして、 セルA2から右に5列=セルE2まで、 4 | 2 | 2 | 1 | 1 と入力したとします。(データ例(1)) あるいは、 セルA3から右にセルE3まで、 6 | 3 | 0 | 0 | 0 と入力したとします。(データ例(2)) 1つのデータの5個の数字のルールは2つで、 「合計で10以下である。」 「左から順に小さくなるか、同じ数字となる。」 です。 (目的は、) このとき、F列からO列にかけて、 データ例(1)のケースでは、 a | a | a | a | b | b | c | c | d | e データ例(2)のケースでは、 a | a | a | a | a | a | b | b | b | と表示されるように、 つまり、項目行の下にある数だけ、その列の1行目の記号を 1(F列)から右に向かって順に埋めていくような、 F列からO列までの2行目以下に入れる適当な計算式(関数)は ないでしょうか。 拙い説明で申し訳ありません。どなたかよい考えをお持ちの方がいらっしゃいましたらと存じます。 どうぞよろしくお願い致します。

  • Excelのマクロの組み方を教えてください

    3行と2列のデーターの塊があり、これを 1行のデータに並べ替えるにはどうしたらいいでしょうか? ただし 行方向(縦に) 30件、列方向(横に) 20件ほど入っていて、複雑です。 空白の行や列はないものと考えていただいて結構です。 詳細説明 A1からCB1はタイトルなどが入っていて、無視して、 データーの配列が以下の場合 A2 B2 C2 D2 E2 F2 →CB2まで A3 B3 C3 D3 E3 F3 →CB3まで A4 B4 C4 D4 E4 F4 →CB4まで A5 B5 C5 D5 E5 F5→CB5まで A6 B6 C6 D6 E6 F6→CB6まで A7 B7 C7 D7 E7 F7→CB7まで ↓ ↓ ↓ ↓↓ ↓ A120まで CB120まで を A2 A3 A4 B2 B3 B4 C2 C3 C4 D2 D3 D4 ↓ CA2 CA3 CA4 CB2 CB3 CB4 次に A5 A6 A7 B5 B6 B7 C5 C6 C7 D5 D6 D7 ↓ A118 A119 A120 B118 A119 A120 などと並べかえはどのようにマクロを組めばよいですか?

  • エクセルマクロ、空白行(セル)の挿入

    データがA、B、C、D、E列100行まであります。 このうちD、E列を除き、エクセルのマクロで1行ごとに空白で10行挿入したいです。 (A、B、C、D列のデータに空白セルを10行分挿入し、下にシフトするイメージ。D、E列はそのまま。) ご教授頂きたく、お願いします。

  • エクセルでマクロ作成したい。こんな事できますか?

    AのシートとBのシートがあるとします。Bのシートに A(セル) B C D E F G・・・・ 1      2 3 4 5 6 7 11     5 4 5 3 7 6 とあるとして, Aのシートには BシートのAセルの列を入力規制のリストでプルダウンにしBシートの行のデーターを検索できるようにしたいです。出来ますか?

  • エクセルでの連番の処理

    お世話になります。 1行目に入力されたデータをルールに沿って2行目以下にどんどん追加していきたいと思っています。 まずD1、E1のセルに数字を入れます。 例:D1に3、E1に25 を入れてマクロを実行するとD列の2行目以下に3,4,5,6…25と連番で入力出来るようにしたいのです。 この例ではD列は24行目まで入力されています。そこで2行目から24行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。なおA,B,C列は数字、文字列どちらもあります。空白の場合もあります。 この状態でA~E列の1行目のデータを変更し、仮にD1を2、E1を15としたとします。ここで再度マクロを実行すればD25に2、そして順に連番が入りD38に15が入るようにします。 同時に25行目から38行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。 これの繰り返しです。 つまり2行目以下のD列で空白の行以下にどんどん連番を入れていく具合です。 前提としてD1、E1は整数しか入りません。またE1の数字はD1より大きいです。ただD1,E1に同じ数字が入った場合、その数字の1行分だけが入力されるようにします。 以上の処理が自動化できるマクロはできますか? アドバイス願います。

  • Excelでマクロを使用した削除に関して

    マクロ初心者です。 Excelにて、以下のような表データがあるとします。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50  a   b   c   d 3行  51  e   f    g   h    4行  52  i    j    k   l この表の中で、A列と1行目の値が同じになる交点となるセルの値"以外"を 削除して以下のように表示させたいのですが、 その方法がわかりません。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50      b       3行  51  e          h    4行  52          k    単純な行削除・列削除ではないため、 頓挫しています。お知恵を拝借したく、よろしくおねがいします。

  • 指定した数だけデータをコピペする方法

    VBAの参考例を教えてください。 <シート1> A列に1から順に数字が入力されており、B列からE列まで数値のデータが入力されています。F列にはB列からE列にデータが入力されているセルの数をカウントした関数が入力されています。 <シート2> シート1のB~Eに入力されたデータが縦に入れ替えの上A列にコピぺされています。 ここで、シート1のA列の数値をコピーし、シート1F列に示されたデータ数分だけ、シート2のF列に縦に順々にペーストしていく方法をご教示ください。シート1のA列に入力された数値が最後の行にくるまでこれを繰り返します。 シート1 A B C D E F 1  a b c d 4 2  e d f   3 3  d e     2 ・ ・ ・ シート2 A B C D E F a         1 b         1 c         1 d         1 e         2 d         2 f          2 d         3 e         3 当方、VBAは全くの初心者です。急遽仕事で必要になってしまい、質問しました。 どうぞよろしくお願いします。

専門家に質問してみよう