プロが教えるわが家の防犯対策術!

いつも参考にしています。まだ、マクロの記録にチョット手を加えて自動化?している程度の腕前ですが?
仕事の都合で下記の問題を解決しなくてはならなくなり、皆様のお知恵をお借りしたいと思い質問させて頂きます。
エクセルのワークシートに空白のセルがランダムに入っているデータがあります。これを、ある列まで(例では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で実現したいのですが、どのような考えで、どのようなコード?を書けばよいのか教えてください。

質問の仕方も用途を得ないで、失礼な質問になっていると思いますが、よろしくお願いします。

A 回答 (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
    • good
    • 1
この回答へのお礼

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

お礼日時:2006/02/16 17:28

>仕事の都合で下記の問題を解決しなくてはならなくなり・・・


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

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

お礼日時:2006/02/16 12:14

取り込み方次第で同一シートで行うことも可能ですが説明しにくい


こと、元データには手を加えない方がよいと思いますので、シート
1つでの解決よりも、データシート、結果シートに分けての考え方
で説明します。

データシート上のA-D列までの各セルをFor文でまわしながら空白
列の判定(ISBLANK)を行い、結果シート上に左詰めになるよう転記
していきます。
(空白行の判定はISBLANKでなく、無効値での判定でも構いません)

データシートE列以降は結果シートE列以降に転記するだけです。
これをデータの入っている行分繰り返すことで可能です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/16 12:04

下記のような感じでもよろしいかと・・・。



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
    • good
    • 0
この回答へのお礼

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

本当にありがとうございました。

お礼日時:2006/02/16 11:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!