• ベストアンサー

EXCELのVBAで空白列を削除して左づめにできますか?

いつも参考にしています。まだ、マクロの記録にチョット手を加えて自動化?している程度の腕前ですが? 仕事の都合で下記の問題を解決しなくてはならなくなり、皆様のお知恵をお借りしたいと思い質問させて頂きます。 エクセルのワークシートに空白のセルがランダムに入っているデータがあります。これを、ある列まで(例ではD列までの左の空白セルをなくして左づめのデータとしたいのです。 (例)  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|   |BBB|CCC|DDD|EEE| 3|AAA|   |CCC|DDD|EEE| 4|AAA|   |CCC|   |EEE| 5|   |   |   |DDD|EEE|     ↓  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|BBB|CCC|DDD|   |EEE| 3|AAA|CCC|DDD|   |EEE| 4|AAA|CCC|   |   |EEE| 5|DDD|   |   |   |EEE| ここで、E列以降は詰めないでほしいのです。 できれば、VBAで実現したいのですが、どのような考えで、どのようなコード?を書けばよいのか教えてください。 質問の仕方も用途を得ないで、失礼な質問になっていると思いますが、よろしくお願いします。

  • kazh
  • お礼率89% (60/67)

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

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

こんにちは。 VBAの方法もいろいろあると思いますから、以下もちょって見てください。ただし、定数に限ります。 Sub Value2Left() Dim myAr As Variant Dim myAr2() As Variant Dim i As Long, j As Long, k As Long With Range("A1").CurrentRegion.Resize(, 4) 'D列まで  myAr = .Value  '    .ClearContents ReDim myAr2(1 To UBound(myAr, 1), 1 To UBound(myAr, 2)) For i = 1 To UBound(myAr, 1)   For j = 1 To UBound(myAr, 2)    If myAr(i, j) <> "" Then     k = k + 1     myAr2(i, k) = myAr(i, j)    End If   Next j   k = 0 Next i Application.ScreenUpdating = False  .Value = myAr2 Application.ScreenUpdating = True End With End Sub

kazh
質問者

お礼

丁寧な回答ありがとうございます。 VBAってホントに色々な考え方があるのですね。 内容が分からないまま、単純に貼り付けて実行しましたら、できました。しかも、早い!感激&涙!きっと説明して頂いても現在の私の知識レベルでは理解できないような気がします。 今後、VBAの勉強に精進してみます。 こんな気持ちにして頂けた皆様に感謝いたします。 本当にありがとうございました。 また、何かとご厄介になると思いますが暖かく見守ってください。よろしくお願いします。

その他の回答 (3)

  • cockerel
  • ベストアンサー率46% (253/548)
回答No.3

>仕事の都合で下記の問題を解決しなくてはならなくなり・・・ >VBAで実現したい VBA自体の回答を求めているのであれば以下を無視してください。 E列先頭にアクティブセルの領域の最大行数(この場合であれば5つ)のセルを挿入します。 元のアクティブセルの領域(この場合であればA1:E5)またはE列を除いた領域(A1:D5)を選択して編集>ジャンプから空白セルを選択します。 編集>削除を選択して「左に詰める」を行った後、E列を元に戻します〔5つのセルを削除して上に詰める)。 VBAでも簡単に作れると思います(ただし、簡単な操作はVBAにしなくても操作できるような小技を身につけておくと何かと役立ちます)。

kazh
質問者

お礼

早速の回答ありがとうございました。 今回は、これ以外の処理もある都合から、VBAで行う事を考えました。 たしかに、簡単な操作をVBAで行うより小技で処理するのが正解だと思います。今回は、私だけじゃなく他の人も操作する可能性があるので、こんな事を考えました。説明不足でごめんなさい。 でも、この小技は凄く参考になりました。別の機会に使いたいと思います。 また、色々とご指導ください。本当にありがとうございました。

  • dr2006
  • ベストアンサー率31% (5/16)
回答No.2

取り込み方次第で同一シートで行うことも可能ですが説明しにくい こと、元データには手を加えない方がよいと思いますので、シート 1つでの解決よりも、データシート、結果シートに分けての考え方 で説明します。 データシート上のA-D列までの各セルをFor文でまわしながら空白 列の判定(ISBLANK)を行い、結果シート上に左詰めになるよう転記 していきます。 (空白行の判定はISBLANKでなく、無効値での判定でも構いません) データシートE列以降は結果シートE列以降に転記するだけです。 これをデータの入っている行分繰り返すことで可能です。

kazh
質問者

お礼

早速の回答ありがとうございました。 確かに、元データを変えてしまうのは良くありませんよね。 今回は、システムの都合上(システムってほどのものじゃないのですが・・・)転記をするよりワークシート内で詰めていった方が都合がよいのです。説明が悪くて済みませんでした。 また、色々とご指導ください。 本当にありがとうございました。

noname#123709
noname#123709
回答No.1

下記のような感じでもよろしいかと・・・。 Sub test() Dim i As Long Dim j As Long For i = Range("E65536").End(xlUp).Row To 1 Step -1 For j = Range("D1").End(xlToRight).Column To 1 Step -1 If Cells(i, j).Value = "" Then Cells(i, j).Delete Shift:=xlToLeft Range("D" & i).Insert Shift:=xlToRight End If Next j Next i End Sub

kazh
質問者

お礼

早速の回答、ありがとうございました。 ”すっ”凄~い!感激です。VBAって奥が深いんですね。自分には無理と諦めていたんですが、再度勉強してみようかな!なんて思ってしまいました。 本当にありがとうございました。

関連するQ&A

  • EXCEL VBA 行列操作

    どなたか教えてください。 下記の様にA1からH5までの範囲に値がある行とない行があります。 空白セルを無視しA10に行列を操作し(行列入れ替え?)、さらに上詰め でコピーしたいのです(上にある行から列順に)。 よろしくお願いします。 例です  A   B   C   D   E   F  G   H 1 2                   aaa bbb 3 ccc ddd eee fff ggg 4 5 hhh ~ 10 aaa 11 bbb 12 ccc 13 ddd 14 eee 15 fff 16 ggg 17 hhh

  • 抽出して並べ替えたい

    初めまして 非常に悩んでいます。 エクセルシートの列に下記のようにデータが並んでいます。(文字列) AAA bbb ccc (空白) BBB ddd eee (空白) AAA bbb ccc (空白) AAA eee ggg 並べ替え後 AAA AAA BBB bbb eee ddd ccc ggg eee 尚、列上でセル位置は任意で、空白行も任意です。(1つ以上です) できれば関数でお願いします。 VBAの場合、使用したことがないので詳しくお願いします。

  • Excel VBAでのテキスト出力について

    excel vbaでの文字列出力について エクセルからテキスト(メモ帳とか)に出力したいのですが 下記のように出力できなくて困っております。 どなたか教えてほしいです。 ●入力エクセル AAA BBB CCC DDD EEE セル(1,1)~(1,5)にそれぞれ文字列が入っている状況です。 これを下記のように出力したいのです。 ●テキスト出力 "AAA","BBB",CCC,"DDD",EEE CCCとEEEをダブルクォーテーションを付けないで出力したいのです。 出力の方法でwriteとprintがありますが writeで Write #1, Cells(1,1),Cells(1,2),Cells(1,3),Cells(1,4),Cells(1,5) やると、自動で全ての文字がダブルクォーテーションで囲まれて、カンマが自動でつき "AAA","BBB","CCC","DDD","EEE" のようになってしまします。CCCとEEEのダブルクォーテーションが不要です。 printで Print #1, CStr(Cells(1,1)), & "," CStr(Cells(1,2)), & "," Cells(1,3), & "," CStr(Cells(1,4)), & "," Cells(1,5) とすると "AAA", "BBB", CCC, "DDD", EEE となり、カンマの後ろに空白が何個か入った状態になります。 (ブラウザでは空白が分かりづらいですが、テキストですと入っております。) Trim関数でTrim(",")とか色々試しましたが上手くいきません。 どうしたら望み通りの出力ができるでしょうか。 ぜひ教えて頂きたいです。 よろしくお願いします。

  • エクセルで列にあるユニークなデータの個数が知りたい

    おはようございます。 エクセルでA列に以下のようなデータがあるとします。 この中で何種類のデータがあるのかを知りたいのです。 この場合は、AAA,BBB,CCC,DDD,EEEの5種類なので5という答えが欲しいのです。 ただし、A列に入るデータは非常に多岐(800種類以上)に渡ります。 また、印刷を前提としてるためソートなどはできません。 さらに1枚のシートにこのようなデータがいくつかあるので、その決まった範囲内で個数を抽出する必要があります。 なにとぞ皆様のお知恵をお貸しくださいませ。 よろしくお願いします。 AAA AAA BBB CCC AAA DDD DDD BBB DDD DDD EEE EEE

  • エクセルVBAでの文字列抽出

    エクセルVBAで文字列を検索して、検索した文字列を他のセルへ出力する方法がわかる方法を探しております。状況を図で説明すると、 A1セル:aaa\bbb\item1\ddd A2セル:aaa\bbb\ccc\item2\ddd A3セル:aaa\bbb\ccc\ddd\item3\eee このような状態からitemを検索して、B1セルに B1セル:item1 B2セル:item2 B3セル:item3 と表示させたいです。エクセルVBA初心者な者でRegExpを使うのかな、というところまではたどり着きましたが、そこから先にすすめません。 何か良い方法をご存知の方、教えていただきたいです。よろしくお願いいたします。

  • 一覧表よりデータ条件抽出

    教えてください。 下記データ表があります。    A     B      C 1  12/1  AAA  94.1% 2  12/2  BBB  95.6% 3  12/2  BBB  (空白) 4  12/3  CCC  97.3% 5  12/4  DDD  98.4% 6  12/5  EEE  97.3% ・したいこと条件説明 12/2~12/4のデータのみを抽出 %の(空白)セル(行)は抽出しない 日付(A列)は表示しない ・表示結果    A    B 1  BBB  95.6% 2  CCC  97.3% 3  DDD  98.4% としたいのですが・・・ いろいろ試してみましたが、うまくいきません。 よろしく、ご教授のほどお願いします。

  • エクセルVBAでの文字列抽出とセルへの出力

    エクセルVBAで文字列を検索して、検索した文字列を他のセルへ出力する方法を探しております。状況を図で説明すると、 A1セル:aaa\bbb\item1\ddd A2セル:aaa\bbb\ccc\item2\ddd A3セル:aaa\bbb\ccc\ddd\item3\eee このような状態からitemを検索して、B1セルに B1セル:item1 B2セル:item2 B3セル:item3 と表示させたいです。エクセルVBA初心者なものでRegExpを使うのかな、というところまではたどり着きましたが、そこから先にすすめません。 何か良い方法をご存知の方、教えていただきたいです。よろしくお願いいたします。

  • Excelの関数に詳しい方、お願いします。

    わかりづらい説明かもしれませんが、よろしくお願いします。 例として、 AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF ・ ・ ・ といった文字列がエクセルの先頭列A1~A100までずらりと並んでいるとします。 各アルファベットには任意の数字(日付など)が入るとして、この並んだ百件のデータからCCCの部分の最大値を表示するための適切な関数があれば教えていただけないでしょうか? 現在少々急いでいるため言葉足らずで申し訳ありませんが、よろしくお願いいたします.

  • エクセルのマクロについて教えて下さい。

    エクセルのマクロについて教えて下さい。 Sub Ref() Dim ax As String Dim num As Integer, i As Integer Dim arr As Variant Dim tex As String Range("A1").Select ax = ActiveCell.Formula arr = Split(ax, ",") For i = 0 To UBound(arr) num = i + 1 Cells(num, 1).Value = arr(i) Next i For i = 1 To 10 ActiveCell.Offset(, 1).Select tex = ActiveCell.Formula Selection.Resize(num, 1).Select Selection.Formula = tex Selection.Resize(1, 1).Select Next i End Sub このマクロを10行ほどまで対応させたいです。 例として2行の表ですが、           A         B   C  D   E  F 1 C100,C101,C102,C103 aaa bbb ccc ddd eee 2 C104,C105,C106,C107 とうい表を、     A B  C  D   E   F 1 C100 aaa bbb ccc ddd eee 2 C101 aaa bbb ccc ddd eee 3 C102 aaa bbb ccc ddd eee 4 C103 aaa bbb ccc ddd eee 5 C104 aaa bbb ccc ddd eee 6 C105 aaa bbb ccc ddd eee 7 C106 aaa bbb ccc ddd eee 8 C107 aaa bbb ccc ddd eee という表にしたいです。 結合してから展開しようと考えたのですが 1列目の文字列の最後にカンマが無い場合、ある場合がありまして、 対応する事が出来ませんでした。 マクロ初心者なので教えてください。 よろしくお願いします。

  • Excelで空白セルだけを削除したい

    Excel(2002 SP3)で、以下のようなデータがあります。 これを、並び順を変えることなく、空白のセルだけを削除することはできますでしょうか? aaa     ←空白のセル zzz ddd     ←空白のセル bbb eee

専門家に質問してみよう