こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAを勉強中の者です。

エクセルVBAを勉強中の者です。

今、あるソースを書いていて、それなりに上手くいったので、仮で、これまで、

dim e as string

と宣言していたのを、eをdataaddress1に変更して、ソース中のeも全て、dataaddress1に変更しました。以下は途中のソースです。変更まではソースは正常に作動していました。

Range("B2:B" & Rows.count).Interior.ColorIndex = xlColorIndexNone

'初めての検索処理
Set data1 = .Find(What:=myKey, After:=.Cells(.count), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns)

'最初の検索で見つからなければ、
If data1 Is Nothing Then
MsgBox "データは見つかりません", vbExclamation
Exit Sub

'最初の検索で見つかれば
Else
dataaddress1 = data1.Address
TextBox1.Value = Range(dataaddress1).Value
TextBox2.Value = Range(dataaddress1).Offset(0, 1).Value
分類.Value = Range(dataaddress1).Offset(0, 2).Value
データ番号.Value = Range(dataaddress1).Offset(0, -1).Value

dataaddress1に変更したとたんに、実行時エラー1004 Rangeメソッドは失敗しました'Globalオブジェルト"というメッセージがでました。

何か、stringでの変数の宣言の仕方に問題があるのでしょうか、ご存知の方教えて下さい、よろしくお願いします。

投稿日時 - 2010-03-22 00:07:27

QNo.5769683

すぐに回答ほしいです

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

暗黙のオブジェクトを使用するのは避けるべきです。
例えば、Range(dataaddress1)とありますが、
とのブックのどのシート?という目的物(語)が
ありません。これを省略すると、「現在カレントに
なっているブックとシート」になります。これが
意図したものを示している保証はあるのですか?
さすがに、Applicationまで書けとは言いませんが、
ブックとシートは必ず明示的に指定すべきです。

Dim 目的シート As WorkSheet
Set 目的シート = ThisWorkbook.WorkSheets(1)
TextBox1.Value = 目的シート.Range(dataaddress1).Value

尚、細かいことですが、Range(dataaddress1)が
何度も出てきます。こういう場合は変数に取得して
おく方が効率的です。
Dim 領域 As Range
Set 領域 = 目的シート.Range(dataaddress1)
()の付く動作は内部的にサブルーチンコールが発生する
ので、変数参照より時間がかかります。まぁ、今時は
CPUが高速なので、無神経にやっても大差はないのですが、
昔の遅いマシンで仕事してきたジジイSEとしてはチョット
気になる所です。

投稿日時 - 2010-03-23 09:55:04

お礼

詳細なコメントありがとうございます。実は、元データのコピーを利用してやり直したら、上手くいきました。おそらくタイプミスではないかと思われます、只今検証中ですが、多分そう思われます。検証を丁寧にしてみます、ありがとうございました。

また、いくつかの視点からご指摘をいただきありがとうございました、参考にさせていただきます。

投稿日時 - 2010-03-23 19:14:06

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

よく解りませんが

例えばfind結果のrangeを見つけると
rangeには、シート情報が入っています。

その後、range.addressの文字情報にすると
シート情報が消えます。

その後は、rangeオブジェクトは、アクティブな
シートのシート情報で、動作しますので、
その辺の事を考慮して、コードを書いているのでしょうか?

コードの全体像が見えないと、はっきりした
回答はないかもしれません。


例えば
以下のコードを実行すると

Dim ad As String
Dim data1 As Range

Set data1 = Sheet1.Range("A1")

Debug.Print data1.Worksheet.Name

ad = data1.Address

Sheet2.Activate

Debug.Print Range(ad).Worksheet.Name

Debug.Print data1.Worksheet.Name


UserForm1.Show

実行結果は、

Sheet1
Sheet2
Sheet1

になります。
シート1が、シート2に変化しても、
最初につかんだ、rangeのシート情報は、
シート1のままです。

findでつかんだ、情報には、シート情報が含まれていますよね

その辺を考慮すると、上手くいくかもしれません。

投稿日時 - 2010-03-22 11:32:40

お礼

詳細なコメントありがとうございます。実は、元データのコピーを利用してやり直したら、上手くいきました。おそらくタイプミスではないかと思われます、只今検証中ですが、多分そう思われます。検証を丁寧にしてみます、ありがとうございました。

字数の関係で全てのソースを書くことができず、ご迷惑をおかけしました。またいくつかの視点でのご指摘をいただきありがとうございました。参考にさせていただきます。

投稿日時 - 2010-03-23 19:16:29

あなたにオススメの質問