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.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
No.2
- 回答日時:
こんにちは
通常、存在しないシートを指定したような場合は「インデックスが有効範囲にありません」というエラーになります。
ですので、ご提示のエラーメッセージからすると、myWS.Nameでエラーが発生しているのではないかと推測します。
>存在するシート名を、変数myWSに順番に入れながら~
とありますが、myWSはどのような型宣言で、実際には何が入っているのでしょうか?
myWS.Name という記述からすれば、Worksheetオブジェクトのようにも見えますが、それならわざわざ
>Worksheets(myWS.Name)
などという、まわりくどい記述をする必要はないはずです。
想像するところ、その行の前に
MsgBox myWS.Name
などと入れてみても、エラーになるのではないでしょうか?
もしそうなら、シート名にはなっていないということで、もっと別のところに原因はあると考えられます。
これ以上は、変数 myWS が一体どうなっているのかがご質問文の情報からではわからないので、はっきりとはしません。
ありがとうございます。
また、伝わりにくくて申し訳ありません。
複数のシートの中から探したいシートが「目的シート」だとします。
MsgBox myWS.Name
と入れてみたところ「目的シート」と表示されました。
その次の行は
Sheets(myWS.Name).Select
です。
確かにそのシートが表示されますが、続く処理がされずに終了してしまうのです。
分かりにくいですよね。補足に続きのソースを書きます。
No.3
- 回答日時:
>>Sheets(myWS.Name).Select とするとダメだった
シート名の中に.が有るからでは?
Dim myWS As Worksheet
Set myWS = Worksheets("実際のシート名")
・
・
myWS.Select
ありがとうございます。
試してみたところ、
Sheets(myWS.Name).Select
myWS.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.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.6
- 回答日時:
こんばんは #5です。
精通した方から見るとこんな事を書いたら叱られるかもしれませんが、
なんとなくでもつかめたなら良かったです。
より深く探求される場合は、set オブジェクト変数 = オブジェクト
のような書き方と読解性や処理速度など比べると良いかも知れませんね
QAサイトの場合、説明のし易さや改造時明示的に分かるので
Set の方が多いかも知れませんね。
1つだけ、気になる点がありますので、一応コメントさせて頂きます。
>結局「Sheets(2).Activate」が無視されてるんだなと感じました。
表現による私の受け取り方の誤解とは思いますが、VBAでも他の言語でも
プログラムコードは命令語なので無視をする事はありません。(当たり前ですけれど結構大事)
例の場合、単に同じシートを選択した結果、実行されなかったの如く見えるのです。 まぁ、すでに選択されていますみたいなエラーが出ても良さそうですがね・・・
回答べたで上から見たいな表現をしてしまうかも知れませんが、
出来るだけローカルでデバッグして回答するようにしています。
(私の回答はデバッグしないといけないレベルなので)
結果や疑問点は補足を頂くと私もスッキリしますね。
長い処理を構築されているとの事で頑張ってください。
ありがとうございます。
本当に有り難い限りです。
>>結局「Sheets(2).Activate」が無視されてるんだなと感じました。
>
>表現による私の受け取り方の誤解とは思いますが、VBAでも他の言語でも
>プログラムコードは命令語なので無視をする事はありません。
私の表現が拙くてすみません。
無視する事はないのは承知です。本当に無視するのは、注釈行だけです。
あっても無くても影響がなく、あまり意味のない記述だなぁという事を言いたかっただけです。
ほぼ完成したと思ったら詰めの部分でまたつまづいてしまいました(涙)
新しく挙げさせていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ちょっと先の未来クイズ第2問
9月9日(月)に発表される「第3回子どもマネー川柳」に入賞する川柳を考えてこちらに投稿してください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
-
4
実行時エラー 438 の解決策をおしえてください。
Visual Basic(VBA)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
7
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
8
【Excel VBA】シートの中から特定の文字列のセル位置を取得するには?
Visual Basic(VBA)
-
9
別のシートから値を取得するとき
Visual Basic(VBA)
-
10
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
11
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
12
Worksheets メソッドは失敗しました。のエラー処理のやり方
Visual Basic(VBA)
-
13
Rangeメソッドは失敗しました。globalオブジェクトについて
Excel(エクセル)
-
14
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
15
「Columns(A:C")」の列文字を数字にして表記したい"
Excel(エクセル)
-
16
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
-
17
実行時エラー1004「Select メソッドが失敗しました。」エラーの回避方法
Visual Basic(VBA)
-
18
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
19
エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか
Visual Basic(VBA)
-
20
VBA 存在しないシートを選択した時にエラーメッセージを表示するには?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelのマクロで該当処理できな...
-
【ExcelVBA】全シートのセルの...
-
別のシートから値を取得するとき
-
Excelマクロのエラーを解決した...
-
エクセル・マクロ シートの非...
-
実行時エラー1004「Select メソ...
-
特定の文字を含むシートだけマ...
-
実行時エラー'1004': WorkSheet...
-
Worksheet_Changeの内容を標準...
-
XL:BeforeDoubleClickが動かない
-
VBAで同じシート名のコピー時は...
-
ユーザーフォームに入力したデ...
-
ExcelのVBAのマクロで他のシー...
-
ExcelVBA シート名を複数セルか...
-
エクセルのマクロで対象ごとに...
-
Excel VBAでの全ワークシート...
-
シート名の一部を変更する方法...
-
EXCEL(VBA)でシート保護がかか...
-
エクセルのひとつのシートへの...
-
シート名一致すれば印刷、一致...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
excelのマクロで該当処理できな...
-
【ExcelVBA】全シートのセルの...
-
ユーザーフォームに入力したデ...
-
別のシートから値を取得するとき
-
ブック名、シート名を他のモジ...
-
実行時エラー'1004': WorkSheet...
-
Excelマクロのエラーを解決した...
-
XL:BeforeDoubleClickが動かない
-
シートが保護されている状態で...
-
エクセルのシート名変更で重複...
-
実行時エラー1004「Select メソ...
-
VBAで同じシート名のコピー時は...
-
エクセルで通し番号を入れてチ...
-
同じ作業を複数のシートに実行...
-
Excel VBA リンク先をシート...
-
ExcelのVBAのマクロで他のシー...
-
Vba UserformからExcelシートの...
-
【Excel VBA】Worksheets().Act...
-
VBA 存在しないシートを選...
おすすめ情報
まず、目的のシートを探した後、そのシートを表示(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))