• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:他のフォルダにあるファイルからユーザーフォーム表示)

他のフォルダからユーザーフォームを表示する方法

このQ&Aのポイント
  • デスクトップにある「A処理」フォルダ内のC.xlsmファイルを選択すると、ユーザーフォームが表示されます。
  • デスクトップにある「A処理」フォルダ内のB.xlsmファイルを選択すると、ユーザーフォーム(表紙)が表示され、コマンドボタンを押すとC.xlsmファイルが表示されますが、ユーザーフォームは表示されません。
  • 「A処理」フォルダ内のファイルからユーザーフォームを表示する方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • masnoske
  • ベストアンサー率35% (67/190)
回答No.11

マクロブックを開いた時の扱いが Office365 と Office2010 で異なるのかもしれませんので、C.xlsm をアドインとして組み込んだらうまくゆくかも知れません。 そのためには、C.xlsm を C.xlam と C.xlsx の2つのファイルに分けます。 B.xlsm と C.xlsm は [No.6] の状態にあるとします。 まず C.xlsm を 開いて、C.xlam で保存してください(保存場所は C.xlsm と同じとします)。 次に C.xlsm を C.xlsx で保存して下さい。 これで C.xlsm をアドインとデータブックに分離できました。 次に B.xlsm を開いて CommandButton96_Click() を以下のように修正して、上書き保存してください。 Private Sub CommandButton96_Click() Me.Hide ' データブックを開く Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlsx" ' アドインを開く Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlam" End Sub これでどうでしょうか。 全体の流れは、 B.xlsm を開く。 B.xlsm の Workbook_Open() イベントが発生して A表紙 がロードされる。 B.xlsm の CommandButton96 をクリック。 C.xlsx と C.xlam が開く。 C.xlam の Workbook_Open() イベントが発生して UserForm1 がロードされる。

noname#243225
質問者

お礼

masnoskeさま これまで貴重なお時間を割いていただきありがとうございました。コロナ関係でまだ、マクロ試してませんが、このとおりやれば、必ずうまくいくと信じています。本当に心から感謝申し上げます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (11)

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.12

[No.11] です。 もしもマクロブックの取り扱いの問題であれば、[No.11] の方法よりもこちらのほうが簡単です。 B.xlsm に A表紙モジュールとUserForm1モジュールを入れておく. C.xlsx はデータブックとし,コードは記述しない. B.xlsm の ThisWorkbookモジュールのコード Private WithEvents xlApp As Application Private Sub Workbook_Open() Set xlApp = Application Load A表紙 A表紙.Show End Sub Private Sub xlApp_WorkbookOpen(ByVal Wb As Workbook) If Wb.Name <> "C.xlsx" Then Exit Sub Load UserForm1 UserForm1.Show End Sub A表紙モジュールの CommandButton96_Clickプロシージャのコード Private Sub CommandButton96_Click() Me.Hide Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlsx" End Sub 別のマクロブックを開いても、そこに記述してあるマクロを利用できないのであれば、マクロを B.xlsm だけに記述し、他のブックはデータブックとして運用すれば良いということです。

全文を見る
すると、全ての回答が全文表示されます。
  • masnoske
  • ベストアンサー率35% (67/190)
回答No.10

Office365 のマクロは互換性に問題があったと思います。 B.xlsm で C.xlsm を捉えられたら、UserForm1 を B.xlsm に移してコントロールできるかも知れません。 B.xlsm に標準モジュールを追加して、以下のコードを入力して試してみて下さい。 Public Sub Test() Dim Wb as Workbook Set Wb = Workbooks.Open(Filename:=ThisWorkbook.Path & "\A計算\C.xlsm") MsgBox Wb.Name End Sub メッセージボックスに C.xlsm が表示されたら、B.xlsm から C.xlsm を制御可能です。

noname#243225
質問者

補足

諦めかけて、これまで作ってきたブックの一つをクリックしたら、なんと!!UserForm1が現れました。 (1)デスクトップにあるA処理フォルダをクリックして出てきた、Bxlsmをクリック (2)すると保護ビューになったので「編集を有効にする」「コンテンツの有効化」をクリックしてUserForm表紙が出たので、その中のコマンドボタン(C.xlsmへ飛ぶボタン)を押すと同時に、C.xlsmとUserFormが現れたのです。ところが、それ以後何度試してもできないのです。つまり、わかったことは、最初の「保護ビュー」が表示されたときだけUserForm1が現れるようになっていたのです。「保護ビュー」しないで、何度やっても現れないということでした。このことに関し、意味がまったくわかりません。どうしたらよろしいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • masnoske
  • ベストアンサー率35% (67/190)
回答No.9

[No.8] です. > CommandButton96_Click するとC.xlsm が間違いなくひらきます おかしいですね. C.xlsm が開いたら,C.xlsm の Workbook_Open() が起動するはずです. なぜなら C.xlsm を単独で開いたら Workbook_Open() が起動するのですよね. どこかで Application.EnableEvents = False を実行していませんか? これをしているとイベント処理は実行されません. ちなみに Excelのバージョンは何でしょうか. Excel2010 では問題なく動作しています.

noname#243225
質問者

補足

どこかで Application.EnableEvents = False を実行していませんか? -----------そのようなことは一切やってません。Office 365 solo です。 僕のために多くの貴重な時間を割いて頂き、本当にもうしわけありません。本当に恐縮しています。残念ですが、いったんこの質問を締めた方がいいのかなとおもっております。

全文を見る
すると、全ての回答が全文表示されます。
  • masnoske
  • ベストアンサー率35% (67/190)
回答No.8

[No.6] です。 > 教えていただいたコード行しましたが、UserForm1が出てきません。 > C.xlsmを単独で開くと即UserForm1が出てきます。 > 僕も正直これでいけると思ったんですが・・。 CommandButton96_Click が正常に動作していないようですね。 クリックしても C.xlsm が開いていないのではありませんか? だとすれば、オブジェクト名を CommandButton96 から別の名前に変えたとか。。。

noname#243225
質問者

補足

CommandButton96_Click するとC.xlsm が間違いなくひらきます

全文を見る
すると、全ての回答が全文表示されます。
  • masnoske
  • ベストアンサー率35% (67/190)
回答No.7

[No.6] です。 C.xlsm を単独で開いた場合には UserForm1 を開きたくないのであれば、 C.xlsm に標準モジュールを追加し、UserForm1 をLoadするSubプロシージャを作成し、B.xlsm から呼び出すと良いでしょう。 B.xlsm の ThisWorkbookモジュールに Private Sub Workbook_Open() Load A表紙 A表紙.Show End Sub B.xlsm の A表紙モジュールに Private Sub CommandButton96_Click() Dim Wb As Workbook Me.Hide Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlsm" ' C.xlsm が開くのを待つ. Do Set Wb = Workbooks("C.xlsm") Loop While Wb Is Nothing ' C.xlsm の LoadUserForm1 を実行する. Application.Run "C.xlsm!LoadUserForm1" Set Wb = Nothing End Sub C.xlsm の標準モジュールに Public Sub LoadUserForm1() Load UserForm1 UserForm1.Show End Sub

noname#243225
質問者

補足

B.xlsm の A表紙モジュールに Private Sub CommandButton96_Click() Dim Wb As Workbook Me.Hide Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlsm" ' C.xlsm が開くのを待つ. Do ↓ここでindexが有効範囲にありませんと出て黄色になり進行しない ----------------------------- Set Wb = Workbooks("C.xlsm") ----------------------------- Loop While Wb Is Nothing ' C.xlsm の LoadUserForm1 を実行する. Application.Run "C.xlsm!LoadUserForm1" Set Wb = Nothing End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • masnoske
  • ベストアンサー率35% (67/190)
回答No.6

B.xlsm に A表紙 があり、A表紙 に CommandButton96 がある。 C.xlsm に UserForm1 がある。 B.xlsm を開いたら A表紙 が開く。 CommandButton96 をクリックしたら、A表紙 を隠して C.xlsm を開く。 C.xlsm が開いたら UserForm1 が表示される。 こういう事ではないのですか? B.xlsm の ThisWorkbookモジュールに Private Sub Workbook_Open() Load A表紙 A表紙.Show End Sub B.xlsm の A表紙モジュールに Private Sub CommandButton96_Click() Me.Hide Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlsm" End Sub. C.xlsm の ThisWorkbookモジュールに Private Sub Workbook_Open() Load UserForm1 UserForm1.Show End Sub

noname#243225
質問者

補足

教えていただいたコード行しましたが、UserForm1が出てきません。C.xlsmを単独で開くと即UserForm1が出てきます。僕も正直これでいけると思ったんですが・・。

全文を見る
すると、全ての回答が全文表示されます。
  • masnoske
  • ベストアンサー率35% (67/190)
回答No.5

CommandButton96 が B.xlsm にあるようなので、UserForm1 が B.xlsm の中にないだけでは? C.xlsm の中にあるとか... C.xlsm の中にあるのなら、Load以降のフォーム制御は C.xlsm に記述します。 C.xlsm が立ち上がった時にフォームを表示したいのなら C.xlsm の ThisWorkbookモジュールの Workbook_Open にLoad以降のフォーム制御を記述すれば良いかと。 Private Sub Workbook_Open() load UserForm1 UserForm1.Show End Sub

noname#243225
質問者

補足

(1)B.xlsm を開いたときに、UserForm表紙が開きます。その表紙フォームの中に、フォルダA計算の中にあるC.xlsmに飛びなさい!というコマンドボタンがあり、ボタンには次のコードがあります。 Private Sub CommandButton96_Click() A表紙.Hide Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlsm" load UserForm1 UserForm1.Show Sheets(1).Select End Sub (2)なので、UserForm1は、C.xlsm の中にあります。 ご教示いただいた「C.xlsm の中にあるのなら、Load以降のフォーム制御は C.xlsm に記述します。」をやってみましたが、UserForm1は出てきません。このフォームの中に、またコマンドボタンを作って他の処理をしたいので、出てこないと困るのです。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2476)
回答No.4

コマンドボタンでC.xlsmを開いたときにUserForm1が開けばいいというだけでしたら C.xlsmの 標準モジュールに Public Sub FormS() UserForm1.Show End Sub として 'Private Sub Workbook_Open() 'UserForm1.Show 'End Sub はコメントアウトにしておいて B.xlsmのユーザーフォーム(表紙)のコマンドボタンに Private Sub CommandButton96_Click() A表紙.Hide Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlsm" Application.Run "C.xlsm!FormS" Sheets(1).Select End Sub としたらUserForm1が表示されると思います。 ただし、個別にC.xlsmを開いてもUserForm1は表示されなくなります。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2476)
回答No.3

試しに Private Sub CommandButton96_Click() Application.EnableEvents = True Workbooks.Open Filename:=ThisWorkbook.Path & "\A計算\C.xlsm" End Sub でやったらどうなりますか。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2476)
回答No.2

あとたぶん「変数の宣言を強制する」という設定にしていないと思うので以下のサイトを読んで設定してください。 変数って宣言しなくちゃいけないの? http://officetanaka.net/excel/vba/beginner/06.htm

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 他のブックが開くと同時にユーザーフォームを表したい

    Aブックから他のブックが開いた時、ユーザーフォームを表示したいので 次のコードでやってみたが、なぜか表示されません。ご教示お願いします。 AブックのThisworkbookに入力しました。 (1)Private Sub Workbook_Open() A表紙.Show End Sub A表紙にコマンドボタンをつけました。 (2)Private Sub CommandButton96_Click() A表紙.Hide Workbooks.Open Filename:=ThisWorkbook.Path & "\2年施設\計算プログラム.xlsm" Sheets(1).Select End Sub 開いた”改善プログラム”のThisworkbookに入力しました。 Private Sub Workbook_Open() UserForm1.Show End Sub

  • 隠していたユーザーフォームを再び表示したい

    ExcelVBA をExcel2007で苦戦している初心者です。 マクロ記載のAブックとBブックを使っています。 Aブックのユーザーフォーム「表紙」にあるボタンをクリックして Private Sub CommandButton11_Click() 表紙.Hide Workbooks.Open Filename:=ThisWorkbook.Path & "\改善案.xlsm" Sheets(1).Select End Sub Bブック(改善案)に飛び、作業後これを閉じ、Aブックに戻したいです。 Aブックは、まだ閉じてはいません。 同時に、ユーザーフォーム「表紙」を再表示したいです。 Private Sub CommandButton2_Click() Unload UserForm1 Application.DisplayAlerts = False ThisWorkbook.Close Application.DisplayAlerts = True 表紙.show End Sub すると次のエラーが表示され 「コンパイルエラー 変数が定義されていません」 表紙.showの表紙が反転表示されます。 Aブックに戻ったときにユーザーフォーム「表紙」を表示するには どうしたらよろしいでしょうか。よろしくお願いします。

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • 窓からファイルを開くときフォームも表示したい

    Excel365solo,windows10を使っています。VBA超初心者です。 現在以下のコードで作業しています。 マクロ記述ブックAに、ユーザーフォームBをつくりコマンドボタンCを設置しました。 Private Sub 基礎データCボタン_Click() Unload Me Workbooks.Open Filename:=ThisWorkbook.Path & "\2年度\計算5月.xlsm"  ’このブックが開いた時に、自動で開いた複数のコマンドボタンDで処理 End Sub これを窓から選んでブックを選ぶ方式にしたいです。 Private Sub testボタン_Click() Dim OpenFileName As String ChDir Application.ThisWorkbook.Path & "\2年度" OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xlsm") If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub でも、ブック\2年度\計算5月.xlsmは開きますが、ブックが開いた時「複数のコマンドボタンD」が表示されず困っています。これを表示させるようにしたいです。ご教示よろしくお願いします

  • ユーザーフォームの切り替えについて・・・

    UserForm1とUserForm2の2つのユーザーフォームがあります。 UserForm1の中にあるcommandButton1をクリックすると、UserForm2が表示される仕組みになっています。 (ちなみに、UserForm2にもコマンドボタンがあり、クリックするとUserForm1に戻るようになっています) UserForm1の方に、 Private Sub CommandButton1_Click() UserForm2.Show 0 Unload UserForm1 End Sub UserForm2の方に、 Private Sub CommandButton1_Click() UserForm1.Show 0 Unload UserForm2 End Sub と記述してあります。 ところが、それぞれのユーザーフォームには、閉じると同時にブックが閉じるように Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ActiveWorkbook.Save 'ブックを保存 ActiveWorkbook.Close 'ブックを閉じる Application.Quit 'excelを終了 End If End Sub というコードを記述しているため、UserForm1からUserForm2へ移るときにブックが閉じてしまいます。 右上の「×」を押したときだけブックを閉じるようにしたいのですが、どういうコードを書いたらいいのですか? 宜しくお願いします。(*´Д`人)

  • マクロ ユーザーフォームが表示されない

    いつも回答して頂き、ありがとうございます。 Sub UserForm1() UserForm1.Show End Sub と記述しましたが、エラーが発生し、ユーザーフォームが表示してくれません。 コンパイルエラー:Functionまたは変数が必要です フォームはコマンドボタンを一つ配置し、 Private Sub CommandButton1_Click() Unload UserForm1 End Sub と記述してあるだけです。何が悪いのでしょうか?御教授の程宜しくお願い致します。

  • ユーザーフォームの描画が遅れるのは?

    ExcelのVBAで簡単な処理をしているのですが、困っています。 ユーザーフォームにラベル1つとコマンドボタンを2つ用意しました。 ラベルには「・・・よろしいですか?」と質問形式の文章を 表示し、コマンドボタンにはそれぞれ「OK」と「キャンセル」を 表示してあります。 「OK」のコマンドボタンをクリックされたら、2つのコマンドボタン のvisibleプロパティをfalseにして隠し、ラベルには 「しばらくお待ちください。」と表示してセルの計算をさせます。 私の考えでは、コマンドボタンが消えラベルに「しばらく・・」が 表示されてから計算が行われセル上に計算結果が 表示されるはずなのですが、何故か計算結果が全て表示されてから コマンドボタンが消え、ラベルに「しばらく・・」と表示され 次の命令を実行してしまいます。 何がいけないのかが分かりません。 宜しくお願いいたします。 Private Sub CommandButton1_Click()  UserForm1.CommandButton1.Visible=False  UserForm1.CommandButton2.Visible=False  UserForm1.Label1.Caption="しばらくお待ちください。" '計算のsubへ飛ぶ  Call Keisan  UserForm1.Label1.Caption="終了しました。" End Sub

  • ファイルを開くと同時にユーザフォームを表示させたい

    Excelでファイルを開いたとき、自動的にユーザフォームを表示させるにはどのようにするのでしょう。下のコードを標準モジュールに書きました。「オブジェクトが必要です」のエラーメッセージが出てしまいます。 何を変えればいいのかお教えください。(Excel2002) Sub Auto_Open() UserForm1.Show End Sub

  • ユーザーフォームを表示されないようにしたい

    Vista excel2007 でマクロ作成中の超初心者です。 A、B、Cのブックがあります。Bブックのみマクロをワークシートに貼り付けています。 1)Aブック(マクロ記録用)の中にある、Aコマンドボタンを押すと  BブックのBシートにジャンプします。ジャンプと同時に、Bユーザーフォームを 表示しています。 2)そしてBシートには、フォームコントロールを貼り付けており、ここをクリックするとCブックCシートに飛びます。 3)ところが、CシートにはBユーザーフォームが残ったままです。このフォームを  表示されないようにしたいのです。 4)Bシートのフォームコントロールには、次のコード記述をしてあります。       Sub Cブック Cシートへ() Dim wb As Workbook Dim ws As Worksheet Dim sh As Worksheet Dim i As Long ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path On Error Resume Next '開いて作業中の場合。 Set wb = Workbooks("CCC.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\CCC.xls") End If Worksheets(1).Select End Sub どうかよろしくお願いします。 

  • ユーザーフォームをWorksheet上で表示

    数日前、このカテゴリで相談した事の続きです。 以前の相談は、次の通りです。 http://okwave.jp/qa/q8892460.html この相談の中で出来たことは 1 ユーザーフォームを保存終了 2 Worksheet上にボタンを作成、そのボタンをクリックでユーザーフォームを表示 以上のことはできました。 作成したコードは次のとおりです。   '// Private Sub UserForm_Initialize() With Worksheets("Sheet1")  TextBox1 = .Cells(1, 1).Value  TextBox2 = .Cells(2, 1).Value TextBox3 = .Cells(3, 1).Value TextBox4 = .Cells(4, 1).Value TextBox5 = .Cells(5, 1).Value ).Value End With End Sub Private Sub UserForm_Terminate() With Worksheets("Sheet1")  .Cells(1, 1).Value = TextBox1  .Cells(2, 1).Value = TextBox2 .Cells(3, 1).Value = TextBox3 .Cells(4, 1).Value = TextBox4 .Cells(5, 1).Value = TextBox5 End With End Sub '// Private Sub cmdsyuuryo_Click() Unload Me End Sub Private Sub UserForm_Click() Myform.Show vbModeless End Sub そこで質問です。 現在Worksheet上にボタンを作成、クリックしてユーザーフォームを表示しているの を、WorksheetのセルA1(名前を記述してある)をクリックするだけでユーザーフォー ムを表示する方法はありませんか? ユーザーフォームの保存先は「Sheet1」のA1からA5までです。 できれば、この設定で具体的なコードの記述をお願いします。 Excel2013です。 よろしくお願いします。