Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


793 / 13645 ツリー ←次へ | 前へ→

【78272】ブックAのマクロによってブックBでアドインファイルのマクロを実行する方法 kamikaya 16/6/15(水) 16:45 質問[未読]
【78276】Re:ブックAのマクロによってブックBでアド... β 16/6/15(水) 17:27 発言[未読]
【78278】Re:ブックAのマクロによってブックBでアド... kamikaya 16/6/15(水) 21:56 お礼[未読]

【78272】ブックAのマクロによってブックBでアドイ...
質問  kamikaya  - 16/6/15(水) 16:45 -

引用なし
パスワード
   初投稿なので失礼があるかもしれませんが宜しくお願いいたします。

【開発環境】
Excel 2016

【目的】
 開かれているすべてのブックのシートの一覧リストが表示されるユーザーフォームを作成しています(アドインファイル)。最終的にはリスト上のシート名をクリックすると,そのシートに移動するようなものを作りたいと考えております。

【問題点】
 今,ブックAとブックBが開かれており,ブックA上でアドインファイルのユーザーフォームを起動します。ブックA内のシート間の移動は簡単なのですが,ブックBのシートに移動する際に問題があります。というのも,ブックB上の対象シートのアクティブは容易なのですが,ユーザーフォームはブックAで開かれているため,ブックBがアクティブになった時点でユーザーフォームが隠れてしまします。

【質問】
ブックAで起動したユーザーフォームをブックBに引継くないし,ブックBで再起動したいのですが,何か方法はありますでしょうか。
なおブックAおよびブックBには何もマクロは記述せず,すべてアドインファイルのモジュールに記述しなくてはなりません。

助言のほど宜しくお願いいたします。


現在のコードを簡単にすると以下のようになります。参考になれば幸いです。

アドインファイル
【標準モジュール】

  Sub Callback_QuickSheetAccess(Control As IRibbonControl)
    UserForm1.Show vbModeless
    'アドインファイルがインストールされた時点ですでに新規タブにリボンが作成されている。
  End Sub

【ユーザーフォーム】

  Private Sub UserForm_Initialize()
    dim ws, wb
    With Listbox1
      .Clear
      For Each wb In Workbooks
        .AddItem wb.Name    
        For Each ws In wb.WorkSheets
          .AddItem " " & ws.Name
          '1マス開けることでツリービューを再現しているつもり
        Next
      Next
    End With
  End Sub

  Private Sub Listbox1_Click()
    Dim Cnt, BookName, SheetName
    With Listbox1    
      'シート名以外がクリックされていた場合は終了
      If Left(.Value, 1) <> " " Then Exit Sub
     
      'ブック名の取得
      Cnt = .ListIndex
      Do While Left(.List(Cnt), 1) = " "
        Cnt = Cnt - 1
      Loop
      BookName = .List(Cnt)
      
      'シート名の取得(先頭の" "を除外するため次のようになる)
      SheetName = Right(.Value, Len(.Value) - 1)
      
      '移動
      Workbooks(BookName).Activate
      Workbooks(BookName).Worksheets(SheetName).Activate

      'このままでは移動はできるがユーザーフォームが別ブックに引き継げない…
      'Application.Run ブック名!プロシージャ名ではブックAからアドインファイルのマクロを呼ぶだけなので目的が果たせませんでした

    End With
  End Sub

【78276】Re:ブックAのマクロによってブックBでア...
発言  β  - 16/6/15(水) 17:27 -

引用なし
パスワード
   ▼kamikaya さん:

xl2013以降、エクセルが MDI から SDI に変わって、もっとも不都合に感じるのは
ここですよね!!

MSは、【念願の改訂を行った】といっているようですが迷惑千万。
というか、SDI可はいいのですが、ユーザーフォームが どのブックがActiveの時に
表示されようが、一番上の階層に表示する、そこを(これは SDIの思想からはずれますけど)
特別に対応することを忘れたバグだと思っています。

なので、当面の対策としては、おっしゃられるように、いったん UNLOAD して
新しいブックで、あらためて SHOW。

情報の継承は、継承すべき値を、UNLOAD前に、どこか(複数のブックから参照可能などこかのシート等)に書きこんでおいて
Initialize で、そこに書き込みがあれば、各コントロールの値としてセット。

こういう構えでしょうかね。

【78278】Re:ブックAのマクロによってブックBでア...
お礼  kamikaya  - 16/6/15(水) 21:56 -

引用なし
パスワード
   ▼β さん:

ご回答有り難うございます。

なるほど、2013からこのような仕様になっていたのですね。
自宅PCはExcel2010なので色々面倒なことになってしまいました…。

とりあえずはそちらの提案された方向でやってみようかと思います。
何か進展があったらここにその方法を書き込もうかと思います。

この度は有り難うございました。

>▼kamikaya さん:
>
>xl2013以降、エクセルが MDI から SDI に変わって、もっとも不都合に感じるのは
>ここですよね!!
>
>MSは、【念願の改訂を行った】といっているようですが迷惑千万。
>というか、SDI可はいいのですが、ユーザーフォームが どのブックがActiveの時に
>表示されようが、一番上の階層に表示する、そこを(これは SDIの思想からはずれますけど)
>特別に対応することを忘れたバグだと思っています。
>
>なので、当面の対策としては、おっしゃられるように、いったん UNLOAD して
>新しいブックで、あらためて SHOW。
>
>情報の継承は、継承すべき値を、UNLOAD前に、どこか(複数のブックから参照可能などこかのシート等)に書きこんでおいて
>Initialize で、そこに書き込みがあれば、各コントロールの値としてセット。
>
>こういう構えでしょうかね。

793 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free