アドインとして登録して、
そのThisWorkbook内のプロシージャからシートの操作(削除、追加、コピーなど)を行おうとしています。
これを行うにはどうすればいいのでしょうか?
まだXLSファイルの状態の時はうまく動作しましたが、
アドインとして登録すると、
>実行時エラー'91'
>オブジェクト変数またはWithブロック変数が設定されていません。
という旨のエラーメッセージが出て終了してしまいます。
(ActiveSheet.Delete の処理でエラーが起こっています)
昨日質問させていただいたとき、
>また、ThisWorkBook などの記述があるとアドインのブックになってしまうので、
>処理上の不都合が起きないようにする事が大切かと思います。
ということをお聞きしました。
おそらく、今回の問題となっている点にあたるものだと思います。
回避する方法はあるのでしょうか?
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
#4 の訂正:
>ユーザーにエラーに飛び込むなんていうのは
◎ユーザーにエラーに飛び込ませるなんていうのは
-------------------------------------------------------
プログラムの回避で書くと非常に長くなるけれども、On Error トラップの上下の二行だけで済むことが多いです。ただ、On Error トラップの書き方は、いくつかあります。
以下は、私がテンプレートで入れているエラーハンドラーのOn Error トラップです。
On Error GoTo ErrHandler
'コード
On Error GoTo 0
Exit Sub
ErrHandler:
MsgBox "Error " & Err.Number & " (" & Err.Description & ")
No.4
- 回答日時:
こんにちは。
>VBAについて頻繁にやりとりのある掲示板を探した方がいいのかな、と思っていました。
自己矛盾していますが、VBA専門サイトのほうが良い場合があります。最低ラインのVBAの常識は知っていないと質問しないほうがよいと思いますよ。まず、標準モジュールやThisWorkbook モジュールの違いなどは、絶対に教えてくれませんからね。(^^;私がなぜここに書いているかと入ったら、あくまでも、VBAとワークシートの一般的な操作は、表裏一体の関係だから、VBAだけみていると、だんだん一般操作系が鈍ってくることに気が付いたからです。
ただ、レスポンスをお読みしていると、ちょっとアドインは早いかなって思います。基本的なレベルをマスターしていないようにお見受けしています。
>>SheetをDeleteする場合は、On Error トラップが必要です。
>これも同じようです。
>自分で使う分にはいいですが、公開した場合・・・--;
それは、Jokeに近いですよ。ユーザーの使い方によって、避けられないエラーというものがあるのです。それを製作者が見えていないで、ユーザーにエラーに飛び込むなんていうのは、自殺行為です。予想できるユーザーの使用法のエラーについては、アドインには盛り込んでおくべきなのです。そして、ベータ・バージョンでしばらく使ってみるわけです。その時に、On Error で、エラー番号とエラー内容を表示させて、自分にフィードバックさせるようにします。
もう少し、コード自体の目的を明確にしていただければ、また違う案が出るかもしれません。ただし、Office 互換製品はご勘弁ください。
No.3
- 回答日時:
googanさん、こんばんは。
掲示板では、ほとんど、アドインについて詳しく教えてくれる人はいないような気がします。中には、かなりいいかげんな回答もあるようです。諦めなければ、私の知っていることは、継続的にお教えすることはできると思っています。しかし、かなり本格的な内容になると思います。アドインというのは、プロシージャのグローバル化ということです。だから、標準的な書き方にするのと、あらゆる対応が必要です。
まず、アドインのコードのほとんどは、標準モジュールに書く必要があります。
>> Set SWss = Application.ActiveWorkbook.Windows(1).SelectedSheets
変数は、省略しないで、読みやすいものにしてください。
ローカル変数の時は、私は、my をつけています。例、mySheet /mySheets とする場合は、配列やコレクションの場合に使います。
SheetをDeleteする場合は、On Error トラップが必要です。
Sub SheetsDelete()
If ActiveWindow.SelectedSheets.Count = 1 Then Exit Sub
On Error GoTo ErrHandler
With ActiveWindow.SelectedSheets
If MsgBox("削除してよろしいですか?", vbOKCancel) = vbOK Then
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End If
ErrHandler:
If Err.Number > 0 Then
MsgBox Err.Number & ":" & Err.Description
End If
End With
End Sub
ただし、そのようなマクロは、手動で行っても変わりありません。
>VBAでプログラムするものではないので
なお、Wsh でも、VBでも、そこからオートメーションで行う場合にも、基本的には同じです。
この回答への補足
「回答に対するお礼」への訂正です
>(教えて!gooについて)そのようですね。
勉強不足でした。
別カテゴリでも(VBAについては)詳しい方はいらっしゃるようですね。
何度も回答ありがとうございます。
>アドインというのは、プロシージャのグローバル化ということです。
>だから、標準的な書き方にするのと、あらゆる対応が必要です。
「プロシージャのグローバル化」、まったくそのとおりなのですね。
気になってテストをしてみました。
ブックを複数用意している場合や、ブックを新たに作った場合に
今回の処理がうまくいっていないようです^^;
>変数は、省略しないで、読みやすいものにしてください。
>ローカル変数の時は、私は、my をつけています。
>例、mySheet /mySheets とする場合は、配列やコレクションの場合に使います。
急ぎ過ぎているのか、面倒に感じているのか。
さらに昔のクセもでているようです。
>SheetをDeleteする場合は、On Error トラップが必要です。
これも同じようです。
自分で使う分にはいいですが、公開した場合・・・--;
>掲示板では、ほとんど、アドインについて詳しく教えてくれる人はいないような気がします。
(教えて!gooについて)そのようですね。
回答者様はだいぶお詳しいようなので嬉しい限りです。
ほんとのところ、
VBAについて頻繁にやりとりのある掲示板を探した方がいいのかな、と思っていました。
>諦めなければ、私の知っていることは、継続的にお教えすることはできると思っています。
ありがとうございます。
今の段階では別アプリで実現した方がいいのでは?と考えています(可能か調査中です)
しかし、本音ではせっかくなので「使える」段階までいきたいとも思っています。
平行しながら、このマクロももう少し調べてみて、
(少しでも?大まかな?)原因を特定してから質問させて頂きたいと思います。
ここの質問はとりあえず締め切らないでおきます。
ここで再度質問させて頂くか、もしかすると新たに質問させて頂くかもしれません。
勝手でスミマセン^^;
本当にご親切にありがとうございます。
No.2
- 回答日時:
こんばんは。
どこかで、アドインのサンプルを探されたほうがよいかもしれません。
>Excel:アドイン(ThisWorkbook)内のプロシージャからシートの操作は可能なのでしょうか
こういうことは、常識的にはありえません。可能か、といわれれば「Yes」です。しかし、ひとつしかない、ThiwWorkbookモジュールを、それに利用するということは、コードの配分などをまったく考慮していないことになります。
簡単に、Excel VBAのモジュールの説明をすると、標準的に使用されるのが、標準モジュールです。ThisWorkbookモジュールは何かというと、Open , Close イベントなどに主に使われるもので、まさしく、自ブックの制御に用いるのが中心です。これらは、他のOffice製品の場合は、若干、その使い方が変わります。
他には、シートモジュールやユーザーフォームモジュールがありますが、それは、そのシートやユーザーフォームを制御するために、主に用いられます。後、クラスモジュールがありますが、インスタンスを作るためのものです。
回答ありがとうございました。
>ThisWorkbookモジュールは何かというと、Open , Close イベントなどに主に使われるもので、
>まさしく、自ブックの制御に用いるのが中心です。
>これらは、他のOffice製品の場合は、若干、その使い方が変わります。
ありがとうございます。本当に勉強になります。
よく分からずにプログラミングしていたので、
すっかきり分かりました。
今回の件は解決しました。
問題の一番の原因は、私がアドインの仕組みをよく理解していないことでした。
初め、シートの削除で
> ActiveSheet.Delete"
と記述していました。
xlsファイルでテストをしていたときは問題なかったのですが、
アドインとして使用するとアドインのブックへの処理とみなされるので
実行時にエラーとなっていました。
よって、
> Dim SWss As Sheets '選択ワークシート群
> Set SWss = Application.ActiveWorkbook.Windows(1).SelectedSheets
> SWss.Delete
のように記述し、うまく動作しています。
(正直、これで本当にいいのかな?という意識もあります^^;)
今回の質問、
>Excel:アドイン(ThisWorkbook)内のプロシージャからシートの操作は可能なのでしょうか?
は、今回のアドインではどうしてもアドイン(ThisWorkbook)内からイベントが発生、
処理しなければならないために質問しました。
(ThisWorkbook=>標準モジュールでシートの操作でも良かったのですけれど・・・)
まだ良く分かっていなかったためにこのような質問となりました。
みなさんのおかげでなんとか思ったものは出来たのですが、
また新たな問題が・・・。
それは正直、致命的なものでした。
本来、VBAでプログラムするものではないので、仕方ないのですけれども^^;
たぶん解決は無理だと思いますが、ちょっと間を置いて考えてみようと思います。
No.1
- 回答日時:
こんばんは。
Wendy02です。>>また、ThisWorkBook などの記述があるとアドインのブックになってしまうので、
>>処理上の不都合が起きないようにする事が大切かと思います。
>ということをお聞きしました。
これはを私が書いたことではありませんが、実際のコードに当たらなければ分りません。アドインは、自ブックは、あまり変化を求めませんから、自ブック(ThisWorkbook)という指定はしません。前々回のそれを読んだ時に、ThisWorkbook モジュールと混同される可能性があるなって思いました。ただ、私は、前のご質問の、
No.1734243の
>ThisWorkbookオブジェクト内にプロシージャ(Public)を追加して、
>それを標準モジュールから呼び出すことが出来るのでしょうか?
というのは、極めてありえないコードです。また、同時に、ThisWorkbookモジュールに、Public キーワード付きのユーザー定義関数などは、ありえませんし、呼び出しそのものには、Public キーワードは必要がありません、ということを説明したつもりです。
アドインとして登録すると、
>実行時エラー'91'
>オブジェクト変数またはWithブロック変数が設定されていません。
それだけでは、コードを見なければ分りませんが、もしかしたら、それぞれのモジュールのクラスメンバを把握していないのではないか、と思います。
前回のご質問で、私が書いたサンプルは見ただけで、残念ですが、試されなかったようですね。なるべく、スモールサンプルで試しながら、プログラムを構築されることをお勧めします。
回答ありがとうございました。
前々回からの質問への、いろいろと指摘された点について書いてみようと思いましたが、
うまく整理できていないようなので今回は止めておきます。
せっかく回答していただいているのに申し訳ないです。
ただ、説明していただいた内容については理解できていると思います。
プログラム作成の完成を急ぐあまり、
仕組みを良く理解せず、悪く言えば適当にプログラムを組んでいたのかもしれません。
>前回のご質問で、私が書いたサンプルは見ただけで、残念ですが、試されなかったようですね。
サンプルプログラムを試してみました。
全部ではありませんが、どのような動きになるのか分かりました。ありがとうございます。
>なるべく、スモールサンプルで試しながら、プログラムを構築されることをお勧めします。
注意して頂いた点をを念頭に置き、再度、最小構成で確認してみたいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/10 14:24
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/10 11:34
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 12:30
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Visual Basic(VBA) Excelのマクロコードについて教えてください 1 2022/03/27 12:02
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA フォームShowでオ...
-
【Excel】BeforeCloseを毎回呼...
-
エクセルVBAでNumLockキーの状...
-
別シートのマクロを実行する方法
-
Application.Runエラー(1004)
-
エクセルのマクロボタンが編集...
-
特定のシートだけ印刷はマクロ...
-
Access終了時にマクロまたはVBA...
-
マクロ 戻るボタンを押したらシ...
-
エクセル VBA SendKeys ループ...
-
access2010 コマンドまたはアク...
-
ExcelVBAで右クリックメニュー...
-
シート保護を掛けたまま並べ替...
-
アクセスのマクロについて
-
プロシージャが大きすぎます!
-
アクセス起動時にVBAを実行させ...
-
InputBox内の表示について
-
エクセルVBAで、ボタンの文字を...
-
「Access」のフォームを...
-
オートシェイプの黄色いハンド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAでNumLockキーの状...
-
vbaでmsgboxの位置を指定
-
エクセルVBA フォームShowでオ...
-
【Excel】BeforeCloseを毎回呼...
-
VBAが得意な方 助けてください...
-
Excel:アドイン(ThisWorkbook)...
-
VBAに関して、プロシージャが大...
-
HULFT完了コードについて
-
smartvisionで録画失敗が頻発
-
エクセルのダブルクリックで
-
ExcelのVBでタイピングゲームも...
-
ワークシートのコピーVBAでうま...
-
別シートのマクロを実行する方法
-
Application.Runエラー(1004)
-
エクセルのマクロボタンが編集...
-
Access終了時にマクロまたはVBA...
-
access2010 コマンドまたはアク...
-
InputBox内の表示について
-
エクセルVBAで、ボタンの文字を...
-
シート保護を掛けたまま並べ替...
おすすめ情報