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

エクセル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の値で判別しようかと思ったのですがうまく
いきません。何が間違っているのでしょうか?

また、より効率的な方法があったら教えていただき
たいです。お願いします。

A 回答 (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が無い…らしい)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

今回は、A列、B列、C列それぞれの列で一番下の行番号を
出し、一番大きい番号を導く、という方法をとりました。

紹介していただいた方法はかなり私には難解なんですが、
また試してみたいと思います。

お礼日時:2001/10/04 22:15

「範囲内の空白セル(空白文字が表示されているセルも含む)の数を返す」


という機能を持つ、
エクセルが用意している関数”countblank”を利用しましょう。

dim a%
a = Application.WorksheetFunction.CountBlank(Range("A2:C65536"))

とします。
これでaが1以上ならデータが入ってるって事で、0なら無いって事ですね。
あとは条件分岐で処理するだけですね。

あとc65536は変数にすれば変更できますよね?
ちなみに空白セルやデータの入っているセル番地を取得するには
別の方法でないといけませんが。
    • good
    • 0

こんにちは。

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列の下の方に関係ないデータが入っていたらダメですけどね。
では。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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

お礼日時:2001/10/04 22:13

すみません。

一部訂正です。

最初にセルA1を選択してください。
Lineの取得時の+2は削除してください。

Lineに使用されているセルの行が返るので「3」以下ならデータ行無しの判断です。

あと一点、LineはLongで宣言してください。

この回答への補足

回答ありがとうございます。

D列以降にA~C列以上にデータが入っている場合が
あるので、ActiveCellが使えない状況です。

何か他の方法はないでしょうか?

補足日時:2001/10/04 02:46
    • good
    • 0

毎回、シートが綺麗に初期化されていることが前提です。



'セルA3を選択する
Range("A3").Select

'使用されている(された)最後のセルまで選択する
Line = Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Rows.Count+2

ではいかがでしょうか?
    • good
    • 0

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