• ベストアンサー

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>

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

>#2です 「"A1:A"」にはimogasiさん独自の意図があるのではないかと 何もありません。ふつうVBAでセル範囲は Range(”A1:A3")のように使います。一方 セル範囲をVBAで表すときRange(Cells(),Cells())を使う例は多いようだが、A,Bなどの列番号が見えるほうが(コードを見たとき、直感的にどの列か判って)好きなので、こちらを気に入ってます。 >違和感を感じ、 は使ったことが無い、知らなかったなどだからと思います。 関数のINDIRECTのようなことが、Rangeの()内で出来ることを いつの日か知って使っている。いつもこういう文字列を加工したものが引数的な指定に、使えるわけではないから手探り。 ーーー 使う変数名を減らす(私の例ではdを使わない)ことは出来るのですが、私は 式の中に長い表現の塊をネスト式に入れるより、一旦1変数に値を 保持し、次の行で変数の方を使うのが好きです。 一旦d=で考え方が整理されるように思います。私はMsgBox dなどで 値がおかしくないか確認して前に進んでいるのでMsgBoxを頻出させてます。そのとき便利です。 また以下で同じdのような値を使うことがたまにあり、今度は変数を使ったほうがすっきりすると思うからです。 例 Mid(Celld(i,"A"),1,1)に対し x=cells(i,"A")   Mid(x,1,1)のようなもの、Xを再度付近で使いたいときあり。 私は一時的な変数、直ぐ下の行で使う変数は、1文字変数が好きですが、「列の最終行=」なんて、良くわかると言って使う人も多い。

dj-s
質問者

お礼

なるほどです、Mid(Cells(i,"A"),1,1)ってのがネスト式ですよね、関数の中に関数があるという・・・確かにそうですよね! x=cells(i,"A")と、一旦1変数に値を保持した方が頭が整理された気分になります! 再三ご回答いただきありがとうございます(>_<)

その他の回答 (3)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

n-junです。 >・シートを指定するWithステートメントを使用する場合は、ピリオド>を付けなければならないからですか? 私はその目的で使用してます。 それ以外にあるかどうかは不明ですけど。

dj-s
質問者

お礼

りょうかいです! ありがとうございました(>_<)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

質問のコードを捻じ曲げたかもしれないが Sub blanksearch() MsgBox Rows.Count d = Range("A" & Rows.Count).End(xlUp).Row MsgBox d Range("A1:A" & d).SpecialCells(xlCellTypeBlanks).Select MsgBox Selection.Address End Sub で 例データA1:A10 a b c d ー空白 f 1 ー空白 ー空白 4 で実行して $A5,$A$8:$A$9のように表示されました。 一歩一歩コード化したほうがわかりやすいですね。 === 質問のコードに近いのは Sub test01() With ActiveSheet .Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeBlanks).Select End With End Sub かな。

dj-s
質問者

お礼

すごいです、「1048576」「10」「$A5,$A$8:$A$9」と、段階的にメッセージボックスが出てきました! 最初の「MsgBox Rows.Count」で1048576(最下行)、 「d = Range("A" & Rows.Count).End(xlUp).Row MsgBox d」が「10」、「Range("A1:A" & d).SpecialCells(xlCellTypeBlanks).Select MsgBox Selection.Address」 が「$A5,$A$8:$A$9」に対応しているみたいですね(^_^;) 2つめのコードもすごいです、空白のセルを選択してくれました! ありがとうございます(>_<) あと、すいません、図々しいのですが・・・imogasiさんが書いてくださったコードの、 Range("A1:A" & d).SpecialCells(xlCellTypeBlanks).Select における「"A1:A"」に違和感を感じ、 Range("A1" & d).SpecialCells(xlCellTypeBlanks).Select に書き換えたところ、とりあえず問題なく作動し、同じ結果を得ることができたのですが、もしかして「"A1:A"」にはimogasiさん独自の意図があるのではないかと思いまして・・・別にただの「A1」でもよいのでしたら、無視してくださって構わないのですが、もし「"A1:A"」にすることに何らかの狙いがあるようでしたら、ご教授いただきたいです(>_<) よろしくお願いします<m(__)m>

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Range の前の . が余計なんでしょうね。

dj-s
質問者

お礼

n-junさんのおっしゃる通りに、 Sub blanksearch() MsgBox (Range(Range("A1"), Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeBlanks).Address) End Sub に書きかえると、うまくいきました! ありがとうございます(^_^;) でもどうしてなのでしょうか?以前質問した際↓ http://okwave.jp/qa5059517.html は、 MsgBox "dj-sさんの範囲は、" & .Range("A:A").End(xlUp).Address のように、Rangeの前に「.(ピリオド)」を付けていたのに、ちゃんとマクロは作動したのですが・・・シートを指定するWithステートメントを使用する場合は、ピリオド↓ http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell_value.html を付けなければならないからですか? もし他に、Rangeの前にピリオドが必要な状況等をご存知でしたら、教えていただけないでしょうか? ずうずうしくてすいません・・・(>_<)

関連するQ&A