Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

何の話か

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)だけ持ってくればエラーにはならないよ、と。

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

FireFoxCorp
趣味はアウトドア、仕事はプログラミングちょっとできる(できない)事務方。GASとKintoneとExcelの間で悶絶している。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away