• ベストアンサー

VBA:セルの空白を検索

A列を上から検索して(とりあえず100行まで)最初の空白セルのアドレスを取得したいです。 Dim CellAd As Range Set CellAd = Range("A1:A100").CurrentRegion.Find(What:="ABC") If CellAd Is Nothing Then Exit Sub Else MsgBox CellAd.Address End If 以上のコードで、A列にABCがあればそのアドレスを$A$15のような形で表示できました。 検索したいのは空白なのですが、どのように指定すればよいでしょうか。 What:=""やNullではダメだったので(自分、「Null」を勘違いしてるかもしれません)。 また、ここでは取得したアドレスをmsgboxで表示させているだけですが、 実際は取得したアドレスの行番号のみを取得して変数Add1に入れ、 以降のコードのセル範囲指定として使いたいです。 「1行目からAdd1行目までをコピーする」のように。 私のレベルでは、 ・範囲指定はRange("A1:A100")のように、「""」でくくらなければ使えない ・変数は""の中に入れたら文字列として扱われる との認識があるのですが、 このようなコードは可能でしょうか。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

A1 を選択した状態で [Ctrl]+[↓] キーを押すとデータブロックの最終セル、 つまり、そのひとつ下が最初の空白セルとなります。 ご質問の用途なら、マクロの記録を利用することで End(xlDown) を使えば 良いことがわかります。あとは、それを修正。 Dim r As Range Set r = Range("A1", Range("A1").End(xlDown)) MsgBox r.Address > 範囲指定はRange("A1:A100")のように、「""」でくくらなければ使えない そんなことはありません。 Range("A2", Cells(100,"A").Select のように「文字列」で指定することも可能だし、Range オブジェクトを 使って Range を指定することも可能です。

rem_1982
質問者

お礼

回答ありがとうございます。 「空白を探し出して、その1個上が最終セル」のつもりだったので、 [Ctrl]+[↓] キーの時点で大正解でした! 範囲指定も巧くできました。 意外と融通利きますね、VBA(プログラマから見ると当然かもしれないけど)。

その他の回答 (5)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

補足。A列以外にも空白セルがあるならこんな方法も。 Sub Sample()      Dim rTable As Range   Dim rBlank As Range      Set rTable = Range("A1:A100").CurrentRegion   On Error Resume Next   Set rBlank = rTable.SpecialCells(xlCellTypeBlanks)   On Error Goto 0   If Not rBlank Is Nothing Then     rBlank.Cells(1, 1).Select     ' または rBlank(1).Select   Else     MsgBox "空白セルはありません"   End If      Set rTable = Nothing   Set rBlank = Nothing End Sub

rem_1982
質問者

お礼

回答ありがとうございます。 わざわざ別のソースまで組んでいただいて恐縮です。 まだぱっと見にはわからない部分もありますが、 調べられそうです。

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.5

Set CellAd = Range("A1:A100").CurrentRegion.Find("") じゃダメですか? >・範囲指定はRange("A1:A100")のように、「""」でくくらなければ使えない Range("A1:A100")はRange(cell(1, 1), Cells(1, 100))とも表現できます。 >・変数は""の中に入れたら文字列として扱われる &演算子を使って繋ぐと使えます。 Range("A1:A" & CellAd.Row - 1).Select とすると、空白の1つ前のセルまで選択できます。

rem_1982
質問者

お礼

回答ありがとうございます。 少し範囲指定の仕方の幅を広げることができました。 目的のみに向かって突っ走らないで一から勉強すべきですね。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

#02、03です。度々スミマセン >#01です。誤植がありました は >#02です。誤植がありました の誤りです

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

#01です。誤植がありました  Range("A1:A" & Add1) が正しいです。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

アドレスの取得 MsgBox(Range("A1:A100").SpecialCells(xlCellTypeBlanks).Cells(1, 1).Address) 行番号の取得 MsgBox(Range("A1:A100").SpecialCells(xlCellTypeBlanks).Cells(1, 1).row) 範囲指定 Range("A1:" & Add1) Range(Cells(1,1) , Cells(Add1,1)) などの方法があります

rem_1982
質問者

お礼

回答ありがとうございます。 無事解決しました。

関連するQ&A

  • Excelの質問です。空白のセルを検索し、ダイアログボックスで把握したい。

    こんばんは。 またまたExcelで頭を悩ませています(>_<) 仕事上、大量のデータを扱うことが多いのですが、データがしっかり入力されているのか否かをチェックする必要に迫られまして・・・。 ここ↓ http://d.hatena.ne.jp/Deja/20090124/1232780962 のやり方なども参照してみたのですが、「同じ行の他のセルに空白データがある場合も選択してしまう」ことから、別の方法を探ってみました。 そして、ダイアログボックスで空白セルを探すことを決めたのですが、書いたコードがうまく作動しません(;_;) Sub blanksearch() MsgBox (Range("A1:A1000").SpecialCells(xlCellTypeBlanks).Address) End Sub は、うまく作動し、ダイアログボックスで空白セルの範囲が表示されたのですが、A列の最下行から検索しようと思い、 Sub blanksearch() MsgBox (Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeBlanks).Address) End Sub と書きかえると、「参照が不正または不完全です。」というエラーメッセージが表示されてしまいました(ToT) 2つめのコードはなぜ、うまく動作しないのでしょうか?お暇な時で構いませんので、教えていただければ幸いです。 よろしくお願いします<m(__)m>

  • 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の値で判別しようかと思ったのですがうまく いきません。何が間違っているのでしょうか? また、より効率的な方法があったら教えていただき たいです。お願いします。

  • 【VBA】「同じ文字を含むセルがあるならば」とやりたい

    こんばんは。 エクセル2003を使用しています。 例えば A1→「りんご」 A2→「りんご食べたい」 の場合、 「りんご」は2個以上あります としたいのですがうまくいきません。 Sub 重複() For 行 = 1 To Cells(65536, 1).End(xlUp).Row If Cells.Find(what:=Range("a" & 行), LookAt:=xlPart) Is Nothing Then Else 'あるならば MsgBox Range("a" & 行) & "は2個以上あります" End If Next End Sub これだと取得セルもカウントされてしまうため、必ずMsgBoxが表示されてしまいます。 どうすれば取得セル意外にも取得セルを含むセルがあるかを調べられるのでしょうか? そしてこれは A1→「りんご」 A2→「りんご食べたい」 A3→「みかん」 A4→「みかんはオレンジ」 A5→「バナナ」 ・ ・ ・ と続いており 最終的には →「りんご食べたい」 →「みかんはオレンジ」 →「バナナ」 にしたいのです。 よろしくお願いします。

  • Excel2003で、指定列に空白セルのある行の数をカウントしたいので

    Excel2003で、指定列に空白セルのある行の数をカウントしたいのですが。 下記の様なセルがあり、A列とC列が共に空白の行の数をカウントしたいのですが どの様にすれば良いでしょうか? (3行目と6行目がA列とC列のセルが空白なので、「2」を表示したいのです)  ABC 1あか 2い さ 3 き 4う 5え し 6 く 7 けす 宜しくお願い致します。

  • エクセルのVBAで悩んでいます。

    いつもありがとうございます。 エクセルのVBAで悩んでいます。 セルの範囲指定をVBAで行いたいのです。 ただし、引数に数値変数を使用する為、Cellsプロパティを使います。 すると、離れている範囲の範囲指定が出来ないのです。 例えば、Rangeプロパティだと、 Range("A5:E5,A9:E32").Select こうなるところを、 A9:E32 を変数に置き換えたくて、 Range("A5:E5", Cells(g, 1), Cells(h, 5)).Select と、するとエラーが出ます。 VBAの前文は次の通りです。 Private Sub CommandButton1_Click() a = Me.TextBox1.Value b = Me.TextBox2.Value Set c = Range("a:a").Find(what:=a, LookIn:=xlValues, lookat:=xlWhole) Set d = Range("a:a").Find(what:=b, LookIn:=xlValues, lookat:=xlWhole) 'MsgBox c + d e = c.Address 'MsgBox e f = d.Address 'MsgBox f g = Range(e).Row MsgBox g h = Range(f).Row MsgBox h Range(Cells(g, 1), Cells(h, 5)).Select End sub よろしくお願い致します。

  • マクロを使って最終行を取得して、範囲内の空白セルに

    マクロを使って最終行を取得して、範囲内の空白セルに指定の文字列を表示させたいです。 お世話になります。 要件としてはタイトルの通りです。 Excel2013を利用しています。 A列を参照して最終行を取得し、 B列の1~最終行までの空白セルに対して「未入力」という文字列を入力したいです。 この場合、考え方はいろいろあるのでしょうが どのようにコードを組めば良いでしょうか? 自分では、まったく書けていないというのが正直なところです。 そこで御手数ですが、ご協力をお願いいたします。

  • 空白行を取得し、その次の行から2行ずつセルを結合するVBAコードについて

    例えばA列の空白行を取得し、 その次の行から2列ずつ結合し、 次の文字が入力されている手前まで連続でそれを続ける VBAコードはどのように記述したらよろしいでしょうか?

  • エクセル:セルの検索

    Sheet1のC~G列を検索し、 [AAA]が見つかれば「成功」、見つからなければ「失敗」と表示するコードを作りました。 (実際のコードでは、AAAが見つかったセルBBBの.Addressや.Valueを使いたいので「Set BBB」などという書き方をしています)   Dim AAA As String Dim BBB As Range Set BBB = Worksheets("Sheet1").Range("C:G").CurrentRegion.Find(What:=AAA, LookAt:=xlWhole) If BBB Is Nothing Then MsgBox "検索に失敗" Else MsgBox "検索に成功" End If このコードで、C~D列にAAAがある場合は見つかるのですが、 E~G列にAAAがある場合は見つからず「検索に失敗」とメッセージが出ます。 また、 別のシートでも全く同じコードを使っているのですが、こちらは正常に動作します。 上に挙げたコードと違うところは検索範囲がE~I列だというだけです。 上記コードでとあるシートにおいてのみE~G列にある値が検索に引っかからない理由として、 どのようなことが考えられるでしょうか。 保護はかかっていません。 値が微妙に違うということもありません。 大文字小文字、半角全角の指定はしておりませんが、 C列で検索に引っかかった値をそのままG列に移動しただけで見つからなくなります。 なお、AAAに入れているデータは、 Private Sub Worksheet_Change(ByVal Target As Range) End Sub のTarget.Addressで、「$A$20」のような形で入っています。 Sheet1のC~G列に用意している値も「$A$20」のような形で直接書き込んでいます。

  • セルが何行なのかをVBAで取得したい

    セルが何行なのかをVBAで取得したいのですが どういうコードにすればいいですか? 例えば、A1セルに a b c と入ってる場合、3行ですが それをVBAで取得するにはどうすればいいですか? Sub test() Dim r As Range Set r = Cells(1, 1) If r.Value Like "*" & Chr(10) & "*" Then MsgBox "改行があります" End If End Sub というコードで改行が有ることは取得できたのですが 何行かまでは取得する方法がわかりません。

  • VBA:空白の取得はできる?

    Excel2003で、従業員データを管理する表を作成してます。 1行づつ従業員人のデータがあります。(従業員名、住所、連絡TEL、取引先、取引先担当者、取引先TEL) A列 従業員名、B列 住所、C列 連絡TEL、D列 取引先、E列 取引先担当者、F列 取引先TEL、です。 例えば、4行目の従業員が辞めた時A列からC列を削除します。 D列以降は取引先なので削除しません。 但し、その従業員が辞めた為、取引先とも取引を止めざるを得ない場合はD列以降も削除するので (例えば)4行目は(A4:F4)は空白になります。 空白の場合、以下(例えば5行目以降)のデータを繰上げたいのですが、その為に空白を取得したいのですが? (「A4~F4は空白である 」を取得出来ますか?) 一つのセルが空白か否かは取得出来たのですが・・・・ 複数のセルが空白か否か取得出来るんでしょうか? エクセル関係のサイトは探してみたんですが、わからなくて・・ ご教授願えたら嬉しいです。

専門家に質問してみよう