教えて! goo のコンテンツに対する取り組みについて

Worksheets(myWS.Name).Active のところで、

「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というエラーになる理由がわからなくて困っています。

存在するシート名を、変数myWSに順番に入れながら、探しているシート名と一致することを検査し、
なかったら Exit Subで終了

シートがあれば次の処理に進もうと思っています。

次の処理は、見つかったシート内で目的のセルを探したいため、
まずはActive化が必要と思って、
Worksheets(myWS.Name).Active としました。

(Sheets(myWS.Name).Select とするとダメだったからです)


最初から、目的のシートを表示している状態で上記マクロを実行すると、
ちゃんとシート名を検知したうえで、そのシート内のセル探しの処理までしてくれるのですが、

別のシートを表示した状態で、上記マクロを実行すると、シート名を検知し、シートが移動しただけで
次の処理を実行してくれません。
見つけたシートが表示されたところで終わってしまい、
そのまま再度同じマクロを実行するとやっと次の処理に進んでくれるという具合です・・・

更に
Worksheets(myWS.Name).Active
Sheets(myWS.Name).Select の違いが解ってません。

よろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    まず、目的のシートを探した後、そのシートを表示(Active?選択?)させ、
    目的シート中から、「■明細」というセルを探してセル番地を表示させるマクロです。
    次のソースです。
    最初から目的シートがActiveな状態で実行すればセル検索まで進みます。
    わざと別シートをActiveにして実行すると、目的シートを表示して終了してしまいます。
    ※ここに書きながら思ったのですが、Exit Subに行っちゃってるのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/11/09 00:31
  • うーん・・・

    ソース:
    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))

      補足日時:2021/11/09 00:31
gooドクター

A 回答 (6件)

#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 の様に書くと対象になります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
仰る通りです。
そこそこ長い処理(自分にとっては)を地道に構築しており、
部分部分でつまづきながら質問させて頂いてます。

「With ActiveSheetの上に」というのは自己解決できなかったと思います・・・
おかげさまでエラーが出なくなりました!
理由を解説していただけると勉強になります。

お礼日時:2021/11/09 11:59

こんばんは #5です。


精通した方から見るとこんな事を書いたら叱られるかもしれませんが、
なんとなくでもつかめたなら良かったです。
より深く探求される場合は、set オブジェクト変数 = オブジェクト
のような書き方と読解性や処理速度など比べると良いかも知れませんね

QAサイトの場合、説明のし易さや改造時明示的に分かるので
Set の方が多いかも知れませんね。

1つだけ、気になる点がありますので、一応コメントさせて頂きます。

>結局「Sheets(2).Activate」が無視されてるんだなと感じました。

表現による私の受け取り方の誤解とは思いますが、VBAでも他の言語でも
プログラムコードは命令語なので無視をする事はありません。(当たり前ですけれど結構大事)
例の場合、単に同じシートを選択した結果、実行されなかったの如く見えるのです。 まぁ、すでに選択されていますみたいなエラーが出ても良さそうですがね・・・

回答べたで上から見たいな表現をしてしまうかも知れませんが、
出来るだけローカルでデバッグして回答するようにしています。
(私の回答はデバッグしないといけないレベルなので)
結果や疑問点は補足を頂くと私もスッキリしますね。

長い処理を構築されているとの事で頑張ってください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
本当に有り難い限りです。

>>結局「Sheets(2).Activate」が無視されてるんだなと感じました。

>表現による私の受け取り方の誤解とは思いますが、VBAでも他の言語でも
>プログラムコードは命令語なので無視をする事はありません。

私の表現が拙くてすみません。
無視する事はないのは承知です。本当に無視するのは、注釈行だけです。
あっても無くても影響がなく、あまり意味のない記述だなぁという事を言いたかっただけです。

ほぼ完成したと思ったら詰めの部分でまたつまづいてしまいました(涙)
新しく挙げさせていただきます。

お礼日時:2021/11/09 23:42

こんにちは


>理由を解説していただけると勉強になります。
独学の範疇でしっかり習った訳でないので(なんとなく理解している程度)役に立つかはわかりませんが、
常識的なところから、プログラムコードは、条件分岐や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まで
.の前にオブジェクトなどが省略された形になります。

つたない説明なのでわかりますかね。。
    • good
    • 0
この回答へのお礼

ありがとうございます!
実験してみました。
初めは「Sheets(2).Activate」でエラーが出ました。
新規で開いたブックがSheet1しかなかったので当然ですね。
(+)でSheet2を作ってから、再度実行してみました。
Sheet2が表示されたけどB1に「2」は入りませんでしたが、
Sheet1に1と2が入ってました。
なるほど、どのシートに対しての処理か固定してるんだなとぼんやりの理解程度です。
でもこのルールがどうして必要なのか、どんな時に必要になるのかは、経験が少ないためまだ分かりません。これから徐々にですね。

余談ですが、
このマクロを、Sheet2を表示した状態で実行すると、
Sheet2内に1と2が入りました。
結局「Sheets(2).Activate」が無視されてるんだなと感じました。

お礼日時:2021/11/09 21:03

>>Sheets(myWS.Name).Select とするとダメだった



シート名の中に.が有るからでは?

Dim myWS As Worksheet
Set myWS = Worksheets("実際のシート名")


myWS.Select
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみたところ、
Sheets(myWS.Name).Select
myWS.Select
いずれも同じ結果が返ってきました。
(目的のシート名が表示されました)

お礼日時:2021/11/09 00:33

こんにちは



通常、存在しないシートを指定したような場合は「インデックスが有効範囲にありません」というエラーになります。
ですので、ご提示のエラーメッセージからすると、myWS.Nameでエラーが発生しているのではないかと推測します。

>存在するシート名を、変数myWSに順番に入れながら~
とありますが、myWSはどのような型宣言で、実際には何が入っているのでしょうか?
myWS.Name という記述からすれば、Worksheetオブジェクトのようにも見えますが、それならわざわざ
>Worksheets(myWS.Name)
などという、まわりくどい記述をする必要はないはずです。

想像するところ、その行の前に
 MsgBox myWS.Name
などと入れてみても、エラーになるのではないでしょうか?
もしそうなら、シート名にはなっていないということで、もっと別のところに原因はあると考えられます。

これ以上は、変数 myWS が一体どうなっているのかがご質問文の情報からではわからないので、はっきりとはしません。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。
また、伝わりにくくて申し訳ありません。

複数のシートの中から探したいシートが「目的シート」だとします。

MsgBox myWS.Name
と入れてみたところ「目的シート」と表示されました。
その次の行は
Sheets(myWS.Name).Select
です。
確かにそのシートが表示されますが、続く処理がされずに終了してしまうのです。
分かりにくいですよね。補足に続きのソースを書きます。

お礼日時:2021/11/09 00:27

こんばんは


>「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
表示の通り、.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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング