dポイントプレゼントキャンペーン実施中!

アドインとして登録して、
そのThisWorkbook内のプロシージャからシートの操作(削除、追加、コピーなど)を行おうとしています。
これを行うにはどうすればいいのでしょうか?

まだXLSファイルの状態の時はうまく動作しましたが、
アドインとして登録すると、
>実行時エラー'91'
>オブジェクト変数またはWithブロック変数が設定されていません。
という旨のエラーメッセージが出て終了してしまいます。
(ActiveSheet.Delete の処理でエラーが起こっています)

昨日質問させていただいたとき、
>また、ThisWorkBook などの記述があるとアドインのブックになってしまうので、
>処理上の不都合が起きないようにする事が大切かと思います。
ということをお聞きしました。
おそらく、今回の問題となっている点にあたるものだと思います。
回避する方法はあるのでしょうか?

A 回答 (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 & ")
    • good
    • 0

こんにちは。



>VBAについて頻繁にやりとりのある掲示板を探した方がいいのかな、と思っていました。

自己矛盾していますが、VBA専門サイトのほうが良い場合があります。最低ラインのVBAの常識は知っていないと質問しないほうがよいと思いますよ。まず、標準モジュールやThisWorkbook モジュールの違いなどは、絶対に教えてくれませんからね。(^^;私がなぜここに書いているかと入ったら、あくまでも、VBAとワークシートの一般的な操作は、表裏一体の関係だから、VBAだけみていると、だんだん一般操作系が鈍ってくることに気が付いたからです。

ただ、レスポンスをお読みしていると、ちょっとアドインは早いかなって思います。基本的なレベルをマスターしていないようにお見受けしています。

>>SheetをDeleteする場合は、On Error トラップが必要です。
>これも同じようです。
>自分で使う分にはいいですが、公開した場合・・・--;

それは、Jokeに近いですよ。ユーザーの使い方によって、避けられないエラーというものがあるのです。それを製作者が見えていないで、ユーザーにエラーに飛び込むなんていうのは、自殺行為です。予想できるユーザーの使用法のエラーについては、アドインには盛り込んでおくべきなのです。そして、ベータ・バージョンでしばらく使ってみるわけです。その時に、On Error で、エラー番号とエラー内容を表示させて、自分にフィードバックさせるようにします。

もう少し、コード自体の目的を明確にしていただければ、また違う案が出るかもしれません。ただし、Office 互換製品はご勘弁ください。
    • good
    • 0

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については)詳しい方はいらっしゃるようですね。

補足日時:2005/10/27 09:34
    • good
    • 0
この回答へのお礼

何度も回答ありがとうございます。


>アドインというのは、プロシージャのグローバル化ということです。
>だから、標準的な書き方にするのと、あらゆる対応が必要です。
「プロシージャのグローバル化」、まったくそのとおりなのですね。
気になってテストをしてみました。
ブックを複数用意している場合や、ブックを新たに作った場合に
今回の処理がうまくいっていないようです^^;

>変数は、省略しないで、読みやすいものにしてください。
>ローカル変数の時は、私は、my をつけています。
>例、mySheet /mySheets とする場合は、配列やコレクションの場合に使います。
急ぎ過ぎているのか、面倒に感じているのか。
さらに昔のクセもでているようです。

>SheetをDeleteする場合は、On Error トラップが必要です。
これも同じようです。
自分で使う分にはいいですが、公開した場合・・・--;

>掲示板では、ほとんど、アドインについて詳しく教えてくれる人はいないような気がします。
(教えて!gooについて)そのようですね。
回答者様はだいぶお詳しいようなので嬉しい限りです。
ほんとのところ、
VBAについて頻繁にやりとりのある掲示板を探した方がいいのかな、と思っていました。

>諦めなければ、私の知っていることは、継続的にお教えすることはできると思っています。
ありがとうございます。
今の段階では別アプリで実現した方がいいのでは?と考えています(可能か調査中です)
しかし、本音ではせっかくなので「使える」段階までいきたいとも思っています。
平行しながら、このマクロももう少し調べてみて、
(少しでも?大まかな?)原因を特定してから質問させて頂きたいと思います。
ここの質問はとりあえず締め切らないでおきます。
ここで再度質問させて頂くか、もしかすると新たに質問させて頂くかもしれません。
勝手でスミマセン^^;


本当にご親切にありがとうございます。

お礼日時:2005/10/27 01:45

こんばんは。



どこかで、アドインのサンプルを探されたほうがよいかもしれません。

>Excel:アドイン(ThisWorkbook)内のプロシージャからシートの操作は可能なのでしょうか

こういうことは、常識的にはありえません。可能か、といわれれば「Yes」です。しかし、ひとつしかない、ThiwWorkbookモジュールを、それに利用するということは、コードの配分などをまったく考慮していないことになります。

簡単に、Excel VBAのモジュールの説明をすると、標準的に使用されるのが、標準モジュールです。ThisWorkbookモジュールは何かというと、Open , Close イベントなどに主に使われるもので、まさしく、自ブックの制御に用いるのが中心です。これらは、他のOffice製品の場合は、若干、その使い方が変わります。

他には、シートモジュールやユーザーフォームモジュールがありますが、それは、そのシートやユーザーフォームを制御するために、主に用いられます。後、クラスモジュールがありますが、インスタンスを作るためのものです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

>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でプログラムするものではないので、仕方ないのですけれども^^;
たぶん解決は無理だと思いますが、ちょっと間を置いて考えてみようと思います。

お礼日時:2005/10/26 23:39

こんばんは。

Wendy02です。

>>また、ThisWorkBook などの記述があるとアドインのブックになってしまうので、
>>処理上の不都合が起きないようにする事が大切かと思います。
>ということをお聞きしました。

これはを私が書いたことではありませんが、実際のコードに当たらなければ分りません。アドインは、自ブックは、あまり変化を求めませんから、自ブック(ThisWorkbook)という指定はしません。前々回のそれを読んだ時に、ThisWorkbook モジュールと混同される可能性があるなって思いました。ただ、私は、前のご質問の、

No.1734243の
>ThisWorkbookオブジェクト内にプロシージャ(Public)を追加して、
>それを標準モジュールから呼び出すことが出来るのでしょうか?

というのは、極めてありえないコードです。また、同時に、ThisWorkbookモジュールに、Public キーワード付きのユーザー定義関数などは、ありえませんし、呼び出しそのものには、Public キーワードは必要がありません、ということを説明したつもりです。

アドインとして登録すると、
>実行時エラー'91'
>オブジェクト変数またはWithブロック変数が設定されていません。

それだけでは、コードを見なければ分りませんが、もしかしたら、それぞれのモジュールのクラスメンバを把握していないのではないか、と思います。

前回のご質問で、私が書いたサンプルは見ただけで、残念ですが、試されなかったようですね。なるべく、スモールサンプルで試しながら、プログラムを構築されることをお勧めします。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

前々回からの質問への、いろいろと指摘された点について書いてみようと思いましたが、
うまく整理できていないようなので今回は止めておきます。
せっかく回答していただいているのに申し訳ないです。
ただ、説明していただいた内容については理解できていると思います。


プログラム作成の完成を急ぐあまり、
仕組みを良く理解せず、悪く言えば適当にプログラムを組んでいたのかもしれません。

>前回のご質問で、私が書いたサンプルは見ただけで、残念ですが、試されなかったようですね。
サンプルプログラムを試してみました。
全部ではありませんが、どのような動きになるのか分かりました。ありがとうございます。
>なるべく、スモールサンプルで試しながら、プログラムを構築されることをお勧めします。
注意して頂いた点をを念頭に置き、再度、最小構成で確認してみたいと思います。

ありがとうございました。

お礼日時:2005/10/25 22:00

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