Excel VBA質問箱 IV

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

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


2920 / 13644 ツリー ←次へ | 前へ→

【65211】他のbookのユーザーフォーム たか 10/4/27(火) 15:30 質問[未読]
【65220】Re:他のbookのユーザーフォーム ichinose 10/4/28(水) 6:19 発言[未読]
【65222】Re:他のbookのユーザーフォーム たか 10/4/28(水) 9:37 質問[未読]
【65237】Re:他のbookのユーザーフォーム ichinose 10/4/29(木) 0:29 発言[未読]
【65256】Re:他のbookのユーザーフォーム たか 10/5/1(土) 9:14 発言[未読]
【65259】Re:他のbookのユーザーフォーム UO3 10/5/1(土) 21:18 発言[未読]
【65270】Re:他のbookのユーザーフォーム 熊谷隆史 10/5/4(火) 11:43 発言[未読]

【65211】他のbookのユーザーフォーム
質問  たか  - 10/4/27(火) 15:30 -

引用なし
パスワード
   ・book1を開くと自動(Auto_Open)でUserForm1が起動します。
 このUserForm1にはCommandButton1があります。

・book2を開くと自動でUserForm1が起動します。
 このUserForm1にはCommandButton1があります。

book2のCommandButton1を押下するとbook1が開き、
book1のCommandButton1を実行させたいのですが
うまくいきません。どのようにすればよいでしょうか?

【65220】Re:他のbookのユーザーフォーム
発言  ichinose  - 10/4/28(水) 6:19 -

引用なし
パスワード
   ▼たか さん:
おはようございます。

>・book1を開くと自動(Auto_Open)でUserForm1が起動します。
この表現では不十分です。
ユーザーフォームの起動 

表示するですか? 
それとも表示はしないけどLoadだけしたいのか?

更に表示だとして、モーダル、モードレス どちらで表示されたのですか?

ね?、この一行の説明では、こんな疑問を持ってしまいます。
解釈が違えば、コードも違ってきますよね?

上記の文章に加え、例えば

標準モジュールに

sub auto_open()
  userform1.show
end sub

というようにモーダルモードでUserform1を表示しています。

と記述すれば、私が申し上げた疑問はかなり解消されます。

閲覧者のPCには、何も入力されていないExcelが起動している
ここから、想像してみてください。
何を記述しないと質問の意図が伝わらないかを・・・。
私は、プログラミングする上でこれがすこぶる大事なこと思っています。


>book2のCommandButton1を押下するとbook1が開き、
>book1のCommandButton1を実行させたいのですが
>うまくいきません。
これも 「うまくいきません」というやったことを記述してください。

前述したように表示モードによっても方法は違ってくると思いますが、
モーダルモードで表示する という仕様だと仮定して・・・。

以下の例は、実行したいコマンドボタンを持つブック側で
パラメータにより、処理を変える方法です


二つの新規ブックを用意してください。

1 Book1.xls(他ブックから実行したいコマンドボタンを持つブック)

ユーザーフォームを一つ作成してください(UserForm1)
コマンドボタンを一つ配置してください(Commanbutton1)

このUserForm1のモジュールに

'=================================================================
Option Explicit
Public cmdexec As Boolean
'========================================================
Private Sub CommandButton1_Click()
  MsgBox ThisWorkbook.FullName
End Sub
'========================================================
Private Sub UserForm_Activate()
  CommandButton1.Value = cmdexec
End Sub

標準モジュールに

'=======================================================
Option Explicit
Sub auto_open(Optional cmexe As Boolean = False)
  Load UserForm1
  With UserForm1
    .cmdexec = cmexe
    .StartUpPosition = 0
    .Left = 0 '同じ名前のユーザーフォームなので表示位置を変更
    .Top = 0
    .Show
  End With
End Sub


2 Book2.xls(他ブックのコマンドボタン実行するブック)

ユーザーフォームを一つ作成してください(UserForm1)
コマンドボタンを一つ配置してください(Commanbutton1)

このUserForm1のモジュールに

'==========================================================
Option Explicit
Private Sub CommandButton1_Click()
  Dim bk As Workbook
  On Error Resume Next
  Set bk = Workbooks("book1.xls")
  If Err.Number <> 0 Then
    Set bk = Workbooks.Open(ThisWorkbook.Path & "\book1.xls")
  End If
  Application.Run bk.Name & "!auto_open", True
  On Error GoTo 0
End Sub

標準モジュールに

'================================================================
Option Explicit
Sub auto_open()
  UserForm1.Show
End Sub


コードは、以上です。

Book1.xlsとBook2.xlsは、同じフォルダ上に保存してください。
一度、二つのブックを閉じてください。

Book2.Xlsだけを開いてください。マクロが起動されれば、

UserForm1が中央に表示されます。コマンドボタンをクリックしてください。
Book1.Xlsが開いて、Book1.XlsのUserform1が表示されます。

次いで 「Book1.Xlsのフルパスがメッセージボックスで表示されます。」
これが、Book1.xls側のUserform1のコマンドボタンクリックの処理です。

Excel2002 SP3で確認しました。

【65222】Re:他のbookのユーザーフォーム
質問  たか  - 10/4/28(水) 9:37 -

引用なし
パスワード
   ichinose さま

どのように記載すればよいかすら分からず
教えていただきたいことに的を絞り
記載したつもりでしたが簡略すぎました。
それにも関わらずアドバイスありがとうございます。

教えていただいたとおりやりましたら
素敵な感じに動いてくれました!!!!!
ありがとうございます!!!
これを大切に使わせていただきます。


大変申し訳ございませんがもう少し教えてください。
実際には
Book1.xls(他ブックから実行したいコマンドボタンを持つブック)
にはボタンが3つありまして
ボタン1 → ボタン2 → ボタン3 と流れて処理させたいのです。
更にボタン2、3は前ボタンのマクロの終了を受けて
走行させなければなりません。

・ボタン1は、新規にbook3を作成するマクロが記載されています。
・ボタン2は、book3を編集して更新するマクロが記載されています。
・ボタン3は、book3を更に編集して更新するマクロが記載されています。

度々の質問ですが、よろしくお願いします。

【65237】Re:他のbookのユーザーフォーム
発言  ichinose  - 10/4/29(木) 0:29 -

引用なし
パスワード
   こんばんは。


>実際には
>Book1.xls(他ブックから実行したいコマンドボタンを持つブック)
>にはボタンが3つありまして
>ボタン1 → ボタン2 → ボタン3 と流れて処理させたいのです。
>更にボタン2、3は前ボタンのマクロの終了を受けて
>走行させなければなりません。


これ、本当にBook2.Xlsから、Book1.Xlsのユーザーフォームを表示する必要があるのですか?
Book1.Xlsのユーザーフォームが表示したいのではなく、

>・ボタン1は、新規にbook3を作成するマクロが記載されています。
>・ボタン2は、book3を編集して更新するマクロが記載されています。
>・ボタン3は、book3を更に編集して更新するマクロが記載されています。

この処理をしたいのなら、他の方法もあると思いますが、いかがですか?

【65256】Re:他のbookのユーザーフォーム
発言  たか  - 10/5/1(土) 9:14 -

引用なし
パスワード
   色々ありがとうございます。
仕事で他人の作ったプログラムを活用しなければならず
しかし新規の作成は本部が認めず
今のプログラム使用が前提条件
さらにそのプログラムはパスワードが掛けられていまして
解除は許可されず
コードの書き換えも出来ず困っています^^;

自分が作ったプログラムから
既存のプログラムを展開することはできます。
しかし既存のプログラムのユーザーフォームが展開中は
そのユーザーフォームしかクリックできず
当たり前ですが?自分が作ったプログラムのユーザーフォームは
クリックできず困っています。
何か良い案があれば良いのですが・・・。

【65259】Re:他のbookのユーザーフォーム
発言  UO3  - 10/5/1(土) 21:18 -

引用なし
パスワード
   ▼たか さん:
こんばんは。
横から失礼します。
ご希望のことは、不可能だと思います。(たぶん)
すでに回答がありますが、ユーザフォームの操作は、そのユーザフォームが
属しているブックからしかできません。(通常は)
もちろん、ユーザーフォーム上のボタンも、一種の小さなウィンドウですから
Window関係のAPIを使って捕捉することはできるはずですし、それにある種の
メッセージ(クリックの信号)を送ることも、エキスパートならできるかも。
でも、それにより、そのブックで実行される処理が終わったかどうかの判定は
困難だと思います。
ご自分のブック内のマクロを追加書いてするのはOKのようですので
別ブックで実行していることをご自分のブック内に書くか、あるいは
立ち上がったブックのフォームのボタンを順番に押すしかないでしょうね。
言い方を変えれば、ボタンを3つ押せば解決することではないでしょうか?
自動で、さっさっとできればいいなぁというお気持ちはわかりますが。

もし・・・別ブックのボタンのクリックイベントで単純に標準モジュールの
プロシジャに引数無しで飛ばしているだけで、kつ、そのプロシジャ名がわかれば
なんとかなるとは思いますが。

【65270】Re:他のbookのユーザーフォーム
発言  熊谷隆史  - 10/5/4(火) 11:43 -

引用なし
パスワード
   ▼たか さん:
押したければ押せますが、どうなんでしょう。
手順的には、FindWindow APIでUserFormのウィンドウハンドルを取得して、
AccessibleObjectFromWindowでIAccessibleオブジェクトを得て、
後は子孫要素を辿って、accDoDefaultActionメソッドでクリック。
参考)
ht tp://moug.net/faq/viewtopic.php?t=50279
ht tp://moug.net/faq/viewtopic.php?t=51030

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