何の話か
ExcelVBAでfind使って検索した結果を使おうとしたのに1004エラーが出て使えない。
どうすりゃええねん、をさんざん調べてとりあえず解決したのでメモを残しておく、という話
エラー概要
問題のコードがこれ。
Sub getOrgNameCell()
dim orgnamecell as range
Set orgnamecell = Cells.Find(what:="組織名")
test = Range(orgnamecell).Column
MsgBox test
End Sub
これを実行すると、
実行時エラー '1004':
'Range'メソッドは失敗しました: '_Global' オブジェクト
と返ってきてエラーになる。
エラーの原因
range(orgnamecell)を実行するときに、findで見つけてきたセルorgnamecellが、「どのシートのセルなのか」がわかっていないのが原因。らしい。
以下のURLを見ると、丁寧に説明されている。
Yahoo知恵袋:エクセルマクロでRange(Cells(w, x), Cells(y,z)).Selectがうまくいきません
教えてgoo:VBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー
だがよくわからん。
言われた通りいろいろ弄っても結果は変わらず、何がいけないのよ?となって、
最終的に「とりあえずこうしておけば解決するっぽい」方法がわかった。ので書く。
解決方法
range()で囲わず、直接オブジェクトからプロパティを指定する。
Sub getOrgNameCell()
dim orgnamecell as range
Set orgnamecell = Cells.Find(what:="組織名")
test = orgnamecell.Column
MsgBox test
End Sub
宣言したオブジェクト自体がプロパティを持ってるので、わざわざrange(range)ってやらなくてもいい。
修正前(.addressで無理やり解決する)
.addressつければ意図通りに動く。
Sub getOrgNameCell()
dim orgnamecell as range
Set orgnamecell = Cells.Find(what:="組織名")
test = Range(orgnamecell.Address).Column
MsgBox test
End Sub
セルを参照しようとして「どのシートやねん」ってなるからエラーを吐くので、
どのシートだかわからんけどセル番地はわかってるorgnamecellから、番地(.address)だけ持ってくればエラーにはならないよ、と。
詳しい、きちんとした説明はできないけど解決したのでよしとする。