エクセル2000です。
DATAと名づけた表の値を変換し、最大値から端数をプラマイするマクロなのですが、途中で「実行時エラー91 オブジェクト変数またはWithブロック変数が設定されていません。」となってしまいます。
なぜ出るかわからないので別なBookに同じ名前のRange
をつくり同様の表でためしたらエラーにならずちゃんと作動します。
本番用のBookでのみエラーがでます。なぜなのでしょうか?
実行時エラーのでる
With Range("DATA").Find(mx, LookIn:=xlValues)
.Value = .Value + dff '
End With
を、Withブロックをつかわず
Range("DATA").Find(mx, LookIn:=xlValues).Select
で試しても本番のBookではエラーになります。ほんとに困っています。
Sub 調整()
Dim r As Double
Dim c As Range
Dim dff As Integer, mx As Long
r = 25000 / Range("初期").Value
With Sheets("内訳")
Range("DATA").Value = .Range("F57:L73").Value '初期値複写
'MsgBox "初期値転写完了"
For Each c In Range("DATA")
If c.Value <> "" Then
c.Value = Application.WorksheetFunction.Round(c.Value * r, -1)
End If
Next
'MsgBox "初期変換完了"
dff = 25000 - Range("変換後")
If dff <> 0 Then
'MsgBox dff
mx = Application.WorksheetFunction.Max(Range("DATA"))
'MsgBox mx
With Range("DATA").Find(mx, LookIn:=xlValues)
.Value = .Value + dff 'ここで実行時エラー!
End With
End If
End With
End Sub
No.5ベストアンサー
- 回答日時:
こんにちは。
Wendy02です。
いずれにしても、Find 自体が問題が発生しているとなると、一度、ワークシートのメニューから、検索を試してみることですね。
必ずしも、これが通っても、マクロで通るとは限りません。例としては、検索値を手で入れた場合ではうまくいくけれども、変数で入れた場合や、また、ワークシートの書式の違いによって、検索できないことがあります。Findは、その点がひじょうにややこしくて、一般の数字は問題ない「はず」ですが、いくつかトライアルをしてみるしかありません。
何か別のトラブルが含まれていて、それが表に出てきているかもしれません。
Find メソッドで行っているときと、実際の検索のシート・オブジェクトなどに整合性がなくなっている可能性もあります。それから、こういう場合に、私は、全体で試さずに、一部のコードを取り出して、スモールサンプルで、検査します。
例:
LookAt:=xlWhole → xlPart にしたら?
LookIn:=xlValues → xlFormulas にしたら?
Sub Test()
Dim mx As Long
dff = 10
mx = Application.WorksheetFunction.Max(Range("DATA"))
'Worksheets("内訳").Activate
With Worksheets("内訳").Range("F100:L116").Find(What:=mx, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
'.Select
.Value = .Value + dff 'ここで実行時エラー!
End With
End Sub
念のため、標準モジュールに書いていますよね。
なんと、驚いたことに、手動でメニューの「編集」、「検索」でやってみても、範囲内から数値を検索することが出来ませんでした!最大、最少にかかわらず、表内の数値はどれも検索できないのです。
ワークシート関数で=MAX(範囲)ではちゃんと出るのですが・・・。
これはどういうことなのでしょう?
No.7
- 回答日時:
merlionXX さん、Wendy02です。
とりあえず、解決してよかったです。
私は、たぶん、今日のことは、深く記憶に留めておくことにします。時間・日にちの検索は、マクロではうまくできないのは知っていたので、おもに、Match 関数を使っていましたが、「会計」もそうだったのですか。なんとなく、「書式」が関係していることがあるのは知っていたのですが、難しいですね。
ありがとうございました。
わたしも今日は印象に残る一日でした。
Wendy02さんのアドバイスがなかったら土日もなくなっていたところです。
有難うございました。
No.4
- 回答日時:
merlionXX さん、こんにちは。
実際には、最初のご質問のコードでは、読み取れないのですが、もしかして、それは、Findを使うシートはActiveではないのではありませんか?(^^;
明示的に、シート名を入れても、シートを Activate しないと、Findが通らないときがあります。それは、一種のバグのようなものだと思います。(違うかもしれませんが)
まだ、新しいコードは、別のブックで、Find が、最後まで一度も通っていませんね。
たぶん、一度、Find が通れば、Activeでなくても通るようなのですが、そういう偶然性(?)があるようなのです。
たぶん、Find の前に、検索させるシートを.Activeとか. Select とかすればよいのですが……。
ちょっとコードとして、格好が悪いですね。そういうようですと、Find 自体が失敗かもしれないなって思っています。一般論なのですが、Excelのワークシート上のコマンドを使用する時、その状況に左右されることがあり、必ずしもマクロではうまくいかないものがいくつかある、ということです。(私の配慮が足らなかったようで、申し訳ないです! )
何度も何度もすみません、恐縮です。
わたしもテストではうまくいき、本番でだめ、別ファイルに転記した同一コードはうまくいき、再度本番がだめで、パニクってます。
アクティブじゃないせいかとも思い、本番シートをアクティブにして試してもみましたが同じなんです。参りました。
No.3
- 回答日時:
merlionXX さん、こんにちは。
Wendy02です。
後、私も良く失敗する例としては、Find の引数の省略による失敗です。
今回も、私は省略してしまいましたが、Find は、前回使った設定を残していることがあって、時々失敗しますので、私の VB Editor には、Find のテンプレートをいれています。そうしないと、つい忘れてしまいます。
With Find ( _
What := mx , _
LookIn := xlValues , _
LookAt := xlWhole , _
SearchOrder:= xlByColumns , _
SearchDirection:= xlNext)
これは、一行にしてしまってよいです。通常、AfterとMatchCase MAtchByte は抜いてよいですが、人によっては、引数の名称を用いず、引数を全て入れる代わりに「,」だけで数字のみだけで済ませてしまう人もいます。ただ、それは、コツがあるようで、組み込み定数ではないようなので、私は詳しくありません。
何度もお手数をおかけします。
With .Range("F100:L116").Find(What:=mx, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
.Value = .Value + dff
End With
としてみましたが、やはり同じ.Value = .Value + dff
でエラーになってしまいます。
No.2
- 回答日時:
こんにちは。
Wendy02です。かなり、余談が含まれていますが、ご勘弁ください。
mx = Application.WorksheetFunction.Max(Range("DATA"))
Find の手前の値から見てみるとよいです。
領域に数値がある限りは、論理的に、エラーにはなるはずがありません。しかし、エラーになるというのは、mx 値が取れていないからです。
見つからない場合でも、必ず、値 0 が入りますね。mx 値は、Long型ですから、避けようがありません。それで、Find で探せば、見つからないので、エラーになりますね。
そこで、もう1つ気になっているのは、前回見て気が付いたのは、Range("DATA")ということです。
VBAでは、通常、そのような書き方はしません。その理由は、変えられてもコードからでは気が付かない、ということです。暗黙的な領域だということですね。もう1つは、名前定義というのは、VBA側からだと、意外に使いにくいという面があります。名前定義を使う場合は、VBAの場合、その都度削除しなければならない時があるくらいです。
ですから、最初から、領域のキメウチが出来ないときは、Range("A1").CurrentRegion などで、領域を確保するか、Application.InputBox で、対話型入力するか、どちらかだということになりますね。
いつもありがとうございます。
mx = Application.WorksheetFunction.Max(Range("DATA"))
MsgBox mx
でmxの値がちゃんと返るのでmx 値が取れているのではないでしょうか?
ご指摘のRange("DATA")をすべて、Range("F100:L116")に変えてみましたが同様でした。(泣)
No.1
- 回答日時:
まぁ、一番考えられることは、Findで見つかっていないことでしょうね。
エラーが出るデータで、 .Value = .Value + dff の行にブレークポイントを設定し、
コードを実行し、イミディエイトウィンドウに
? Range("DATA").Find(mx, LookIn:=xlValues).Address <Enter> や、
? Range("DATA").Find(mx, LookIn:=xlValues) Is Nothing <Enter> で何と返りますか?
この回答への補足
今、Value = .Value + dff の行にブレークポイントを設定し、コードを実行し、イミディエイトウィンドウに
? Range("DATA").Find(mx, LookIn:=xlValues) Is Nothing とコピペしてエンターキーしたら
Trueと返りました。
xlValuesのところにカーソルがふれたらxlValues=-4163と表示されました。???
早速ありがとうございます。
大変申し訳ありませんが、イミディエイトウィンドウの使い方がわかりません。
.Value = .Value + dff の行にブレークポイントを設定するにはクリックして茶色い●を出せばいいのですよね?
? Range("DATA").Find(mx, LookIn:=xlValues).Address <Enter> は
? Range("DATA").Find(mx, LookIn:=xlValues).Addressをコピペしてエンターキーですか?
そうやったら実行時エラーの同じメッセージがでましたが・・・。(泣)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) vba userformで漢字を全角カタカナに 2 2022/07/24 15:38
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- Excel(エクセル) マクロで列を加えたら上手くいかなくなりました。 2 2022/05/23 17:59
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
実行時エラー3001「引数が間違...
-
EXCEL VBAマクロ中断でデバッグ...
-
なぜこんな初歩的なVBAのIf文で...
-
プロシージャ名の取得
-
VBS実行時エラー オブジェクト...
-
アクセス 実行時エラー3265
-
マクロでオートシェイプ内の文...
-
ExcelVBA Range クラスの Page...
-
「実行時エラー3001」のポップ...
-
SQL文をVBAで流すと「型...
-
EXCEL/VBAで、自分のPCだけエラ...
-
VBAのコードがエラーになっ...
-
「コンパイルエラー:プロシー...
-
VBAでのMATCH関数の使用
-
ゴールシーク関数で、エラーを...
-
ADODB.Streamを使用してUTF-8を...
-
Application.ActiveInspectorで...
-
VBAがブレークモードになっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
【Excel VBA】マクロをボタンに...
-
VBAでのエラー
-
マクロについて教えてください...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAがブレークモードになっ...
-
実行時エラー3001「引数が間違...
-
ExcelVBA Range クラスの Page...
-
VBS実行時エラー オブジェクト...
-
EXCEL VBAマクロ中断でデバッグ...
-
Outlook.ApplicationをCreateOb...
-
VBSで変数の宣言はできないので...
-
VBAのコードがエラーになっ...
-
実行時エラー -'-2147417848
-
ADODB.Streamを使用してUTF-8を...
-
EXCEL/VBAで、自分のPCだけエラ...
-
OLEDB.NETで接続できない
-
プロシージャ名の取得
-
VB6+SQL サーバー 2000 で 実行...
おすすめ情報