LoginSignup
1
4

More than 5 years have passed since last update.

ExcelVBAでfindで見つけたセルをそのままrangeに代入するとエラーが出る

Last updated at Posted at 2018-07-26

何の話か

ExcelVBAでfind使って検索した結果を使おうとしたのに1004エラーが出て使えない。
どうすりゃええねん、をさんざん調べてとりあえず解決したのでメモを残しておく、という話

エラー概要

問題のコードがこれ。

samplecode.bas
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()で囲わず、直接オブジェクトからプロパティを指定する。

test.bas
Sub getOrgNameCell()
    dim orgnamecell as range

    Set orgnamecell = Cells.Find(what:="組織名")
    test = orgnamecell.Column
    MsgBox test

End Sub

宣言したオブジェクト自体がプロパティを持ってるので、わざわざrange(range)ってやらなくてもいい。

修正前(.addressで無理やり解決する)

.addressつければ意図通りに動く。

test.bas
Sub getOrgNameCell()
    dim orgnamecell as range

    Set orgnamecell = Cells.Find(what:="組織名")
    test = Range(orgnamecell.Address).Column
    MsgBox test

End Sub

セルを参照しようとして「どのシートやねん」ってなるからエラーを吐くので、
どのシートだかわからんけどセル番地はわかってるorgnamecellから、番地(.address)だけ持ってくればエラーにはならないよ、と。

詳しい、きちんとした説明はできないけど解決したのでよしとする。

1
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4