• ベストアンサー

VBAでセルが空白かどうかを調べたい(Excel)

エクセル2000関連でVBAを勉強し始めました。 A1~C3まで列の名前が入っていて、 A2~C2列以下(データを入れるのはA3~C3, A4~C4・・で、どの行までデータが入っているかは 分からない状態)が空白か どうかを調べたい時にはどう書けばよろしいのでしょうか? ・A65536~C65536まで選択し ・上向きにデータが存在するかどうかを調べていって ・最終的にActiveになっている行番号が1であれば A2~C65536までは空白。 1じゃなければ、データがどこかに存在する。 という方法で調べようかと思ったのですが、 Dim Line As Integer Range("A65536:C65536").Select Range(Selection, Selection.End(xlUp)).Select  Line = Selection.Row でLineの値で判別しようかと思ったのですがうまく いきません。何が間違っているのでしょうか? また、より効率的な方法があったら教えていただき たいです。お願いします。

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

  • ベストアンサー
  • monktyan
  • ベストアンサー率30% (3/10)
回答No.5

すみませんさっきの回答って意味不明でした。すみません(汗) 責任とってコード書きます。(って処理多すぎ… ) Sub macro1() '← 一例です。 Dim a$ , a1$ , b$ , b1$ , c$ , c1$ , ln% Dim chk As Boolean chk = True ln% = 65537 Do While chk = True ln% = ln% - 1 If ln% = 0 Then Exit Do a1$ = "a" & Trim$(str$(ln%)) b1$ = "b" & Trim$(str$(ln%)) C1$ = "c" & Trim$(str$(ln%)) a$ = Range(a1$).Value b$ = Range(a2$).Value C$ = Range(a3$).Value chk = LenMbcs(a$) = 0 And LenMbcs(b$) = 0 And LenMbcs(C$) = 0 Loop MsgBox = (ln% & "行目までデータが入力されています。") End Sub Function LenMbcs(ByVal str As String) LenMbcs = LenB(StrConv(str, vbFromUnicode)) End Function として下さい。 下からA列、B列、C列のいずれにもデータが入力されていなければ、 (いずれもバイト数が0であれば) 一つ上の行を調べ、それでも入力されていなければ…  …を繰り返し、いずれかの列に文字が入力されている行を見つけると、 その行番号をメッセージボックスで伝えてくれます。 これでいける……はず。なんせ初心者なもんで。(汗) 不足があれば応用して下さい。 注意:空白文字(" "や" ")が入力されているセルも「入力されているセル」と判断します。    一部、VBのヘルプから引用しています。(LenMbcsの所)    Macでは不都合を起こします。(Unicodeが無い…らしい)

fuyu
質問者

お礼

回答ありがとうございます。 今回は、A列、B列、C列それぞれの列で一番下の行番号を 出し、一番大きい番号を導く、という方法をとりました。 紹介していただいた方法はかなり私には難解なんですが、 また試してみたいと思います。

その他の回答 (4)

  • monktyan
  • ベストアンサー率30% (3/10)
回答No.4

「範囲内の空白セル(空白文字が表示されているセルも含む)の数を返す」 という機能を持つ、 エクセルが用意している関数”countblank”を利用しましょう。 dim a% a = Application.WorksheetFunction.CountBlank(Range("A2:C65536")) とします。 これでaが1以上ならデータが入ってるって事で、0なら無いって事ですね。 あとは条件分岐で処理するだけですね。 あとc65536は変数にすれば変更できますよね? ちなみに空白セルやデータの入っているセル番地を取得するには 別の方法でないといけませんが。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 A~C列は常に同じ行にデータが入っているとしていいですか? そうするとたとえばA列だけ見ればいいと思います。 したがって、 Dim Line As Long Range("A65536").End(xlUp).Select 'Excel2000以外のバージョンでは、総行数が違うことがあるので、 'Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Select Line = Selection.Row If Line > 1 then   MsgBox("データ有り") Else   MsgBox("データ無し") End If これでは出来ませんか。 もちろん、A~C列の下の方に関係ないデータが入っていたらダメですけどね。 では。

fuyu
質問者

お礼

回答ありがとうございます。 今回は一つの列だけデータが入っていたり、 離れたデータも見つけるプログラムを作りたかったので、 A列、B列、C列それぞれの列で一番下の行番号を出し、 一番大きい番号を導く、という方法をとりました。 またよろしくお願いします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

すみません。一部訂正です。 最初にセルA1を選択してください。 Lineの取得時の+2は削除してください。 Lineに使用されているセルの行が返るので「3」以下ならデータ行無しの判断です。 あと一点、LineはLongで宣言してください。

fuyu
質問者

補足

回答ありがとうございます。 D列以降にA~C列以上にデータが入っている場合が あるので、ActiveCellが使えない状況です。 何か他の方法はないでしょうか?

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

毎回、シートが綺麗に初期化されていることが前提です。 'セルA3を選択する Range("A3").Select '使用されている(された)最後のセルまで選択する Line = Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Rows.Count+2 ではいかがでしょうか?

関連するQ&A