
Worksheets(myWS.Name).Active のところで、
「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というエラーになる理由がわからなくて困っています。
存在するシート名を、変数myWSに順番に入れながら、探しているシート名と一致することを検査し、
なかったら Exit Subで終了
シートがあれば次の処理に進もうと思っています。
次の処理は、見つかったシート内で目的のセルを探したいため、
まずはActive化が必要と思って、
Worksheets(myWS.Name).Active としました。
(Sheets(myWS.Name).Select とするとダメだったからです)
最初から、目的のシートを表示している状態で上記マクロを実行すると、
ちゃんとシート名を検知したうえで、そのシート内のセル探しの処理までしてくれるのですが、
別のシートを表示した状態で、上記マクロを実行すると、シート名を検知し、シートが移動しただけで
次の処理を実行してくれません。
見つけたシートが表示されたところで終わってしまい、
そのまま再度同じマクロを実行するとやっと次の処理に進んでくれるという具合です・・・
更に
Worksheets(myWS.Name).Active
Sheets(myWS.Name).Select の違いが解ってません。
よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
#1です
多分、私が書いた https://oshiete.goo.ne.jp/qa/12655633.html コードの改造なので、あたりを付けて回答しますが
Set target = .UsedRange.Find(What:="■明細", LookAt:=xlWhole)
If target Is Nothing Then Exit Sub
の実行は先に記載されている With ActiveSheetシートが対象です。
なので
MsgBox myWS.Name
Sheets(myWS.Name).Select
をWith ActiveSheetの上に書いてください。
又は、対象シートをmyWSシートにしたい場合は、簡単な方法として
myWS.UsedRange.Find の様に書くと対象になります。
ありがとうございます。
仰る通りです。
そこそこ長い処理(自分にとっては)を地道に構築しており、
部分部分でつまづきながら質問させて頂いてます。
「With ActiveSheetの上に」というのは自己解決できなかったと思います・・・
おかげさまでエラーが出なくなりました!
理由を解説していただけると勉強になります。
No.6
- 回答日時:
こんばんは #5です。
精通した方から見るとこんな事を書いたら叱られるかもしれませんが、
なんとなくでもつかめたなら良かったです。
より深く探求される場合は、set オブジェクト変数 = オブジェクト
のような書き方と読解性や処理速度など比べると良いかも知れませんね
QAサイトの場合、説明のし易さや改造時明示的に分かるので
Set の方が多いかも知れませんね。
1つだけ、気になる点がありますので、一応コメントさせて頂きます。
>結局「Sheets(2).Activate」が無視されてるんだなと感じました。
表現による私の受け取り方の誤解とは思いますが、VBAでも他の言語でも
プログラムコードは命令語なので無視をする事はありません。(当たり前ですけれど結構大事)
例の場合、単に同じシートを選択した結果、実行されなかったの如く見えるのです。 まぁ、すでに選択されていますみたいなエラーが出ても良さそうですがね・・・
回答べたで上から見たいな表現をしてしまうかも知れませんが、
出来るだけローカルでデバッグして回答するようにしています。
(私の回答はデバッグしないといけないレベルなので)
結果や疑問点は補足を頂くと私もスッキリしますね。
長い処理を構築されているとの事で頑張ってください。
ありがとうございます。
本当に有り難い限りです。
>>結局「Sheets(2).Activate」が無視されてるんだなと感じました。
>
>表現による私の受け取り方の誤解とは思いますが、VBAでも他の言語でも
>プログラムコードは命令語なので無視をする事はありません。
私の表現が拙くてすみません。
無視する事はないのは承知です。本当に無視するのは、注釈行だけです。
あっても無くても影響がなく、あまり意味のない記述だなぁという事を言いたかっただけです。
ほぼ完成したと思ったら詰めの部分でまたつまづいてしまいました(涙)
新しく挙げさせていただきます。
No.5
- 回答日時:
こんにちは
>理由を解説していただけると勉強になります。
独学の範疇でしっかり習った訳でないので(なんとなく理解している程度)役に立つかはわかりませんが、
常識的なところから、プログラムコードは、条件分岐やgotoなどがない限り上から下に処理をされて行きます。
ActiveSheetは その行が実行された時 のシートオブジェクトが返ります
実験してみましょう。
sheets(1)がアクティブな(表示された)状態でステップ実行で確認してみてください。
sub test()
With ActiveSheet 'sheets(1)
.cells(1,1).value=1 'sheets(1)のA1セルに1が入力される
sheets(2).activate
.cells(1,2).value=2 'sheets(1)のB1セルに2が入力される
end With
end sub
sheets(2)はシートが選択されますが、
セルは元の選択セル、入力はありません。(実行されません)
.select で実験しないのは、sheets(2).activateでシートが変わる為
.cells(1,2).select を実行すると1004エラーが返るはずなので混乱しない為
(アクティブでないシートのセルを選択できない為)
つまり、With ActiveSheet で指定したオブジェクトがEnd Withまで
.の前にオブジェクトなどが省略された形になります。
つたない説明なのでわかりますかね。。
ありがとうございます!
実験してみました。
初めは「Sheets(2).Activate」でエラーが出ました。
新規で開いたブックがSheet1しかなかったので当然ですね。
(+)でSheet2を作ってから、再度実行してみました。
Sheet2が表示されたけどB1に「2」は入りませんでしたが、
Sheet1に1と2が入ってました。
なるほど、どのシートに対しての処理か固定してるんだなとぼんやりの理解程度です。
でもこのルールがどうして必要なのか、どんな時に必要になるのかは、経験が少ないためまだ分かりません。これから徐々にですね。
余談ですが、
このマクロを、Sheet2を表示した状態で実行すると、
Sheet2内に1と2が入りました。
結局「Sheets(2).Activate」が無視されてるんだなと感じました。
No.2
- 回答日時:
こんにちは
通常、存在しないシートを指定したような場合は「インデックスが有効範囲にありません」というエラーになります。
ですので、ご提示のエラーメッセージからすると、myWS.Nameでエラーが発生しているのではないかと推測します。
>存在するシート名を、変数myWSに順番に入れながら~
とありますが、myWSはどのような型宣言で、実際には何が入っているのでしょうか?
myWS.Name という記述からすれば、Worksheetオブジェクトのようにも見えますが、それならわざわざ
>Worksheets(myWS.Name)
などという、まわりくどい記述をする必要はないはずです。
想像するところ、その行の前に
MsgBox myWS.Name
などと入れてみても、エラーになるのではないでしょうか?
もしそうなら、シート名にはなっていないということで、もっと別のところに原因はあると考えられます。
これ以上は、変数 myWS が一体どうなっているのかがご質問文の情報からではわからないので、はっきりとはしません。
ありがとうございます。
また、伝わりにくくて申し訳ありません。
複数のシートの中から探したいシートが「目的シート」だとします。
MsgBox myWS.Name
と入れてみたところ「目的シート」と表示されました。
その次の行は
Sheets(myWS.Name).Select
です。
確かにそのシートが表示されますが、続く処理がされずに終了してしまうのです。
分かりにくいですよね。補足に続きのソースを書きます。
No.1
- 回答日時:
こんばんは
>「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
表示の通り、.Activeはサポートしていない為です。
アクティブシートにする場合は、Worksheet.Activate メソッドを使います
https://docs.microsoft.com/ja-jp/office/vba/api/ …
>Worksheets(myWS.Name).Active
Sheets(myWS.Name).Select の違いが解ってません。
Selectは選択であって必ずActiveにする訳では無いと思います。
自動記録で複数シートを選択するコードで分かるかな?
Sub Macro1()
Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
Sheets("Sheet1").Activate
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Excel(エクセル) Excelのマクロについて教えてください。 4 2022/05/31 14:07
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Excel(エクセル) 複数のブックをひとつのブック(複数のシートにまとめる)場合にシートとの順番について 5 2022/12/28 20:47
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2023/01/20 14:36
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
このQ&Aを見た人はこんなQ&Aも見ています
-
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
-
4
Worksheets メソッドは失敗しました。のエラー処理のやり方
Visual Basic(VBA)
-
5
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
6
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
7
EXCELのVBAでシートコピーをしたとき元のマクロを削除するには?
Excel(エクセル)
-
8
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
9
マクロの「Rangeメソッドは失敗しました’Globalオブジェクト」エラーの解決方法について
Excel(エクセル)
-
10
実行時エラー1004「Select メソッドが失敗しました。」エラーの回避方法
Visual Basic(VBA)
-
11
VBAでワークシートを引数としてサンプル関数に渡したい
Visual Basic(VBA)
-
12
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
13
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
14
VBAでEmpty値って何ですか?
Excel(エクセル)
-
15
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
16
EXCEL VBA 指定したファイルが存在しない場合メッセージボックスを表示させる
Access(アクセス)
-
17
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
18
ExcelVBAで質問です。Workbook_openイベントが発生し
その他(Microsoft Office)
-
19
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
20
「選択範囲を解除してアクティブセルを選択」をマクロで行うにはどうすればよいでしょうか
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームに入力したデ...
-
XL:BeforeDoubleClickが動かない
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
実行時エラー'1004': WorkSheet...
-
特定の文字を含むシートだけマ...
-
VBA 存在しないシートを選...
-
Excel VBA で自然対数の関数Ln...
-
Access エクセルシート名変更
-
Excel チェックボックスにチェ...
-
VBAで指定シート以外の選択
-
【VBA】全ての複数シートから指...
-
VBA 検索して一致したセル...
-
エクセルVBA 別シートからのコ...
-
【エクセルVBA】「Protect User...
-
ブック名、シート名を他のモジ...
-
VBA ThisWorkbookはSheet*で記...
-
userFormに貼り付けたLabelを変...
-
マクロを使って、シート印刷完...
-
Excel VBA リンク先をシート...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
実行時エラー'1004': WorkSheet...
-
XL:BeforeDoubleClickが動かない
-
エクセルVBA Ifでシート名が合...
-
実行時エラー1004「Select メソ...
-
エクセルのシート名変更で重複...
-
【ExcelVBA】全シートのセルの...
-
VBA 存在しないシートを選...
-
ブック名、シート名を他のモジ...
-
Excel チェックボックスにチェ...
-
VBA 検索して一致したセル...
-
エクセルで通し番号を入れてチ...
-
シートが保護されている状態で...
-
【VBA】特定の文字で改行(次の...
-
ExcelのVBAのマクロで他のシー...
-
Worksheet_Changeの内容を標準...
-
EXCELVBAを使ってシートを一定...
おすすめ情報
まず、目的のシートを探した後、そのシートを表示(Active?選択?)させ、
目的シート中から、「■明細」というセルを探してセル番地を表示させるマクロです。
次のソースです。
最初から目的シートがActiveな状態で実行すればセル検索まで進みます。
わざと別シートをActiveにして実行すると、目的シートを表示して終了してしまいます。
※ここに書きながら思ったのですが、Exit Subに行っちゃってるのでしょうか?
ソース:
MsgBox myWS.Name
Sheets(myWS.Name).Select
Set target = .UsedRange.Find(What:="■明細", LookAt:=xlWhole)
If target Is Nothing Then Exit Sub '見つからなければ、終了
Set r1 = target.Offset(1)
Range(r1.Address(0, 0)).Select
MsgBox "開始セル(" & target & " の1つ下)は " & (r1.Address(0, 0))