• 締切済み

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

アドインとして登録して、 そのThisWorkbook内のプロシージャからシートの操作(削除、追加、コピーなど)を行おうとしています。 これを行うにはどうすればいいのでしょうか? まだXLSファイルの状態の時はうまく動作しましたが、 アドインとして登録すると、 >実行時エラー'91' >オブジェクト変数またはWithブロック変数が設定されていません。 という旨のエラーメッセージが出て終了してしまいます。 (ActiveSheet.Delete の処理でエラーが起こっています) 昨日質問させていただいたとき、 >また、ThisWorkBook などの記述があるとアドインのブックになってしまうので、 >処理上の不都合が起きないようにする事が大切かと思います。 ということをお聞きしました。 おそらく、今回の問題となっている点にあたるものだと思います。 回避する方法はあるのでしょうか?

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 & ")

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 >VBAについて頻繁にやりとりのある掲示板を探した方がいいのかな、と思っていました。 自己矛盾していますが、VBA専門サイトのほうが良い場合があります。最低ラインのVBAの常識は知っていないと質問しないほうがよいと思いますよ。まず、標準モジュールやThisWorkbook モジュールの違いなどは、絶対に教えてくれませんからね。(^^;私がなぜここに書いているかと入ったら、あくまでも、VBAとワークシートの一般的な操作は、表裏一体の関係だから、VBAだけみていると、だんだん一般操作系が鈍ってくることに気が付いたからです。 ただ、レスポンスをお読みしていると、ちょっとアドインは早いかなって思います。基本的なレベルをマスターしていないようにお見受けしています。 >>SheetをDeleteする場合は、On Error トラップが必要です。 >これも同じようです。 >自分で使う分にはいいですが、公開した場合・・・--; それは、Jokeに近いですよ。ユーザーの使い方によって、避けられないエラーというものがあるのです。それを製作者が見えていないで、ユーザーにエラーに飛び込むなんていうのは、自殺行為です。予想できるユーザーの使用法のエラーについては、アドインには盛り込んでおくべきなのです。そして、ベータ・バージョンでしばらく使ってみるわけです。その時に、On Error で、エラー番号とエラー内容を表示させて、自分にフィードバックさせるようにします。 もう少し、コード自体の目的を明確にしていただければ、また違う案が出るかもしれません。ただし、Office 互換製品はご勘弁ください。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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でも、そこからオートメーションで行う場合にも、基本的には同じです。

googan
質問者

お礼

何度も回答ありがとうございます。 >アドインというのは、プロシージャのグローバル化ということです。 >だから、標準的な書き方にするのと、あらゆる対応が必要です。 「プロシージャのグローバル化」、まったくそのとおりなのですね。 気になってテストをしてみました。 ブックを複数用意している場合や、ブックを新たに作った場合に 今回の処理がうまくいっていないようです^^; >変数は、省略しないで、読みやすいものにしてください。 >ローカル変数の時は、私は、my をつけています。 >例、mySheet /mySheets とする場合は、配列やコレクションの場合に使います。 急ぎ過ぎているのか、面倒に感じているのか。 さらに昔のクセもでているようです。 >SheetをDeleteする場合は、On Error トラップが必要です。 これも同じようです。 自分で使う分にはいいですが、公開した場合・・・--; >掲示板では、ほとんど、アドインについて詳しく教えてくれる人はいないような気がします。 (教えて!gooについて)そのようですね。 回答者様はだいぶお詳しいようなので嬉しい限りです。 ほんとのところ、 VBAについて頻繁にやりとりのある掲示板を探した方がいいのかな、と思っていました。 >諦めなければ、私の知っていることは、継続的にお教えすることはできると思っています。 ありがとうございます。 今の段階では別アプリで実現した方がいいのでは?と考えています(可能か調査中です) しかし、本音ではせっかくなので「使える」段階までいきたいとも思っています。 平行しながら、このマクロももう少し調べてみて、 (少しでも?大まかな?)原因を特定してから質問させて頂きたいと思います。 ここの質問はとりあえず締め切らないでおきます。 ここで再度質問させて頂くか、もしかすると新たに質問させて頂くかもしれません。 勝手でスミマセン^^; 本当にご親切にありがとうございます。

googan
質問者

補足

「回答に対するお礼」への訂正です >(教えて!gooについて)そのようですね。 勉強不足でした。 別カテゴリでも(VBAについては)詳しい方はいらっしゃるようですね。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 どこかで、アドインのサンプルを探されたほうがよいかもしれません。 >Excel:アドイン(ThisWorkbook)内のプロシージャからシートの操作は可能なのでしょうか こういうことは、常識的にはありえません。可能か、といわれれば「Yes」です。しかし、ひとつしかない、ThiwWorkbookモジュールを、それに利用するということは、コードの配分などをまったく考慮していないことになります。 簡単に、Excel VBAのモジュールの説明をすると、標準的に使用されるのが、標準モジュールです。ThisWorkbookモジュールは何かというと、Open , Close イベントなどに主に使われるもので、まさしく、自ブックの制御に用いるのが中心です。これらは、他のOffice製品の場合は、若干、その使い方が変わります。 他には、シートモジュールやユーザーフォームモジュールがありますが、それは、そのシートやユーザーフォームを制御するために、主に用いられます。後、クラスモジュールがありますが、インスタンスを作るためのものです。

googan
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。Wendy02です。 >>また、ThisWorkBook などの記述があるとアドインのブックになってしまうので、 >>処理上の不都合が起きないようにする事が大切かと思います。 >ということをお聞きしました。 これはを私が書いたことではありませんが、実際のコードに当たらなければ分りません。アドインは、自ブックは、あまり変化を求めませんから、自ブック(ThisWorkbook)という指定はしません。前々回のそれを読んだ時に、ThisWorkbook モジュールと混同される可能性があるなって思いました。ただ、私は、前のご質問の、 No.1734243の >ThisWorkbookオブジェクト内にプロシージャ(Public)を追加して、 >それを標準モジュールから呼び出すことが出来るのでしょうか? というのは、極めてありえないコードです。また、同時に、ThisWorkbookモジュールに、Public キーワード付きのユーザー定義関数などは、ありえませんし、呼び出しそのものには、Public キーワードは必要がありません、ということを説明したつもりです。 アドインとして登録すると、 >実行時エラー'91' >オブジェクト変数またはWithブロック変数が設定されていません。 それだけでは、コードを見なければ分りませんが、もしかしたら、それぞれのモジュールのクラスメンバを把握していないのではないか、と思います。 前回のご質問で、私が書いたサンプルは見ただけで、残念ですが、試されなかったようですね。なるべく、スモールサンプルで試しながら、プログラムを構築されることをお勧めします。

googan
質問者

お礼

回答ありがとうございました。 前々回からの質問への、いろいろと指摘された点について書いてみようと思いましたが、 うまく整理できていないようなので今回は止めておきます。 せっかく回答していただいているのに申し訳ないです。 ただ、説明していただいた内容については理解できていると思います。 プログラム作成の完成を急ぐあまり、 仕組みを良く理解せず、悪く言えば適当にプログラムを組んでいたのかもしれません。 >前回のご質問で、私が書いたサンプルは見ただけで、残念ですが、試されなかったようですね。 サンプルプログラムを試してみました。 全部ではありませんが、どのような動きになるのか分かりました。ありがとうございます。 >なるべく、スモールサンプルで試しながら、プログラムを構築されることをお勧めします。 注意して頂いた点をを念頭に置き、再度、最小構成で確認してみたいと思います。 ありがとうございました。

関連するQ&A

  • アドインの組込みとブックが開くタイミングがずれる

    全てのブックで使用するアドインを作成しました(AddIn.xlaとします)。 Excelの起動時にアドインが自動で組み込まれるように、アドインファイルをXLSTARフォルダに入れました。 あるブック(Book.xlsとします)の Workbook_Openイベントで AddIn.xlaに含まれるプロシージャを実行する時に、次のような問題が出ました。 エクスプローラから Book.xls をダブルクリックして開くと、AddIn.xlaに含まれるプロシージャを実行するところでエラーが出ます。 Excelを起動して、メニューバーから Book.xls を開くと、問題ありません。 この症状は、PCによって出るものと出ないものがあります。 エラーの状況から見ると、AddIn,xla が組み込まれるタイミングと Book.xla の Workbook_Openイベントが実行されるタイミングにずれがあるように見えます。 AddIn.xla が組み込まれるまで Book.xls を開かないようにすることは可能でしょうか。

  • アドイン内部のシートのコピーと移動

    Excel VBAで、アドインについて質問させていただきます。 他のブックを開いている時に、アドイン自身にあるシートを、 アドイン内で移動及びコピーをしたいのですが以下のコードではエラーとなってしまいます。 移動(アドイン自身の変数 i 番目のシートを、左へ移動) ThisWorkbook.Sheets(i).Move before:=ThisWorkbook.Sheets(i).Previous コピー(アドイン自身の変数 i 番目のシートを、アドイン自身の末尾にコピー) ThisWorkbook.Sheets(i).Copy after:=ThisWorkbook.Sheets(Thisworkbook.Sheets.Count) MoveやCopyメソッドの引数を指定せず新規ブックにコピー及び移動なら可能なのですが、引数の指定に誤りがあるでしょうか?ちなみにアドイン自身の内部でシートを追加、シート削除、名前の変更は可能なようです。 どなたかご教示いただきたく、よろしくお願いいたします。

  • EXCEL VBAアドイン:シートの右クリックメニューへの追加方法その2

    下記「シートの右クリックメニュー追加」+BBBマクロをアドインへ組み込み、皆さんへ配布して、自動的に右クリックメニューに組み込んでBBBマクロを動作させたいのですが、やり方を教えて下さい。 PERSONAL.XLSのThisWorkbookにAddinstallイベントプロシージャーで下記のように記述しましたがエラーが出ます。 どのように修正すれば良いか、教えて下さい。 また、やり方はこれでOKでしょうか。 なお、標準モジュールに登録して実行すると動きます。 宜しく、お願いします。 「エラー内容」 実行時エラー’91’ オブジェクト変数またはWithプロック変数が設定されていません。 Sub シートの右クリックメニュー追加()  With CommandBars("Cell").Controls.Add   .Caption = "AAA(メニューの表示文字)"   .OnAction = "BBB(実行するマクロ名)"   .BeginGroup = True  End With End Sub

  • Book(.xls)→アドイン(.xla)に関する質問

    現在Excelにて、様々なメニューを作成したBook(.xls)があります。これをアドイン(.xla)にしようと思っています。 元Bookの「様々なメニュー」の中に、イベントプロシージャを使用したマクロも登録されていますが、アドイン化した後も使用出来る様にするには、 Private Sub Workbook_AddinInstall() Private Sub Workbook_AddinUninstall() にて、どのような記述が必要なんでしょうか? 教えて頂ければと思います。

  • Excel:「フォーム」のボタンで引数を渡すプロシージャは呼べないですか?

    Win2K、Excel97-2000-2002を使用しています。 Book1.xlsに固定文字列のメッセージボックスを表示するプロシージャ "A" を作成しました。 Book2.xlsのSheet1上に「フォーム」コントロールボックスのボタンを貼り付けました。 マクロの登録でBook1.xls!Aを指定しました。 ボタンを押下すると、固定長文字列のメッセージボックスが表示されます。 このプロシージャ "A" に引数を持たせ、 任意のセルの値を渡したいと思っているのですが、 「フォーム」コントロールのボタンでは、引数を渡すことは不可なのでしょうか。 御教授、御鞭撻の程、何卒宜しくお願い致します。

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

  • エクセルVBAでワークシートのコメントを全部削除

    以下のコードを走らせると実行時エラー91[オブジェクト変数またはwithブロック変数が設定されていません]となってしまいます。 On Error Resume Nextで回避出来るのですが、理由がわかりません。On Error Resume Nextで回避しなくともいいようにするにはどう直せばいいのでしょうか? Sub Del_Comment() Dim MyR As Range, C As Range Set MyR = Cells.SpecialCells(xlCellTypeComments) For Each C In MyR C.Comment.Delete Next End Sub

  • 相対パスでExcel Bookのオープン

    こんにちわ。 相対パスでブックをオープンしようとすると、 「オブジェクト変数、またはwithブロック変数が設定されていません。」というエラーが表示されてしまいます。 絶対パス指定だと、正常にオープンできますし、同じ相対パス指定で、ブックのコピー&ペーストもできています。 なぜなのでしょうか?

  • マクロ シートの選択

    いつも回答して頂き、とても感謝しています。 マクロを実行したブックを指定する時はTHISWORKBOOKですよね。マクロを実行したシートを指定する時にもTHISWORKBOOKみたいな記述方法があるのでしょうか? あるのであれば教えて下さい。 今、作成中のマクロで解決出来ない問題が発生しています。FINDを使う記述の箇所で一回目はすんなり最後までいくのですが、続けて同じマクロを実行すると、エラーが発生してしまいます。 たぶん、2回目の時違うシートを見てるからだと思います。どのシートを見てるか分かりませんが。 で、FINDで検索するシート名を変数をとって指定しています。 Dim ws1 as WorkSheet Set ws1 = ThisWorkBook.ActiveSheet これが悪いのかな?と思い質問しました。よろしくお願いします。

  • Excel→Accessのプロシージャを実行させるには?

    http://oshiete1.goo.ne.jp/qa4071588.htmlを参考に Excel→Accessのプロシージャを実行させることはできるのですが、 Access→Excelができません。 回答者:KenKen_SPさまの方法を 逆にしてVBEコードに記載してみたのですが エラーになってしまいます。 ●アクセス側に● Sub Excelのプロシージャを呼び出す() Dim ExApp As Object Set ExApp = GetObject("D:\up\エクセルファイル名.xls") If Not ExApp Is Nothing Then ExApp.Run "TestProcedure" End If Set ExApp = Nothing End Sub ●エクセル側に● Sub TestProcedure() MsgBox "Call されました" End Sub で、実行すると、 「ExApp.Run "TestProcedure"」 の部分で 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)」 というエラーになります。 Excel→Accessなら問題はないのに、 Access→Excelだとエラーになるのはなぜでしょう? (2003です。)

専門家に質問してみよう