Excel VBA質問箱 IV

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

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


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

【73789】他のブックのUserform 亜矢 13/2/15(金) 11:22 質問[未読]
【73790】Re:他のブックのUserform UO3 13/2/15(金) 11:38 発言[未読]
【73795】Re:他のブックのUserform 亜矢 13/2/15(金) 17:18 お礼[未読]
【73825】Re:他のブックのUserform ichinose 13/2/18(月) 7:13 発言[未読]
【73791】Re:他のブックのUserform UO3 13/2/15(金) 12:08 発言[未読]
【73794】Re:他のブックのUserform UO3 13/2/15(金) 13:04 発言[未読]

【73789】他のブックのUserform
質問  亜矢  - 13/2/15(金) 11:22 -

引用なし
パスワード
   いつもお世話になります。
 他のブックで開いているUserformのCaptionを取得したいとおもいますが、
 方法がわかりません。
  よろしくお願いします。

【73790】Re:他のブックのUserform
発言  UO3  - 13/2/15(金) 11:38 -

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

こんにちは

直接取得するのは、どうでしょう・・・
エキスパートさんなら、何か方策があるかもしれませんが・・

素人レベルとしては

自ブックの標準モジュールにに

Sub test1()
  Dim myCap As String
  
  myCap = Application.Run("別ブック名!Test2")
  MsgBox myCap
  
End Sub

別ブックの標準モジュールに

Function Test2() As String
  Test2 = UserForm1.Caption
End Function

こうすれば、とりあえずは取得できますね。

【73791】Re:他のブックのUserform
発言  UO3  - 13/2/15(金) 12:08 -

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

こんにちは

もし、どうしても直接取得したいんということであれば
私からはフルセットの完全なコードをお届けすることはできませんが
たとえば以下のような力技が考え付きますね。

・まず、自分自身のハンドルを取得し、それをもとに 自分自身が属しているスレッド番号を
 GetWindowThreadProcessId あたりで取得。
・こうしておいて、EnumWindowsあたりでバックグラウンドも含めたWindowを取得して
・そのスレッド番号が、自分自身のスレッド番号であり、かつ、クラス名(GetClassName あたりで取得)が
 "ThunderDFrame" であるもののキャプションをGetClassNameで取得した情報から抽出。

エキスパートさんなら、もっとピンポイントの抽出をされるでしょうけど。

【73794】Re:他のブックのUserform
発言  UO3  - 13/2/15(金) 13:04 -

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

一応、上でつぶやいた力技コードです。
はなはだ、ダサイコードだと思いますが・・・

Option Explicit

'トップレベルのウィンドウの抽出
Private Declare Function EnumWindows Lib "USER32" _
     (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
'キャプション取得
Private Declare Function GetWindowText Lib "USER32" Alias "GetWindowTextA" _
  (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
'ハンドルからクラス名を取得
Private Declare Function GetClassName Lib "user32.dll" _
             Alias "GetClassNameA" _
            (ByVal hWnd As Long, _
             ByVal lpClassName As String, _
             ByVal nMaxCount As Long) As Long
'スレッドIDとプロセスIDを取得する(665)
Private Declare Function GetWindowThreadProcessId Lib "USER32" _
  (ByVal hWnd As Long, lpdwProcessId As Long) As Long
'==========================================================================

Dim myThread As Long
Dim myCaption As String

Sub Test()
  Dim hWnd As Long
  Dim rtn As Boolean
  
  hWnd = ThisWorkbook.Application.hWnd
  myThread = GetWindowThreadProcessId(hWnd, ByVal 0&)
  rtn = EnumWindows(AddressOf GetProc, 0&)
  MsgBox myCaption
End Sub

'コールバック
Public Function GetProc(ByVal hWnd As Long, iParam As Long) As Boolean
Dim myCap As String * 128
Dim ret As Long
Dim myBuff As String * 128
Dim myClass As String
Dim lngRtn As Long

  If GetWindowThreadProcessId(hWnd, ByVal 0&) = myThread Then
    myCap = ""
    ret = GetWindowText(hWnd, myCap, Len(myCap))
    lngRtn = GetClassName(hWnd, _
                 myBuff, _
                 Len(myBuff))
    myClass = Left(myBuff, lngRtn)
    If myClass = "ThunderDFrame" Then myCaption = myCap
  End If
  
  GetProc = True
  
End Function

【73795】Re:他のブックのUserform
お礼  亜矢  - 13/2/15(金) 17:18 -

引用なし
パスワード
   ▼UO3 さん:
>▼亜矢 さん:
>
>こんにちは
>
>直接取得するのは、どうでしょう・・・
>エキスパートさんなら、何か方策があるかもしれませんが・・
>
>素人レベルとしては
>
>自ブックの標準モジュールにに
>
>Sub test1()
>  Dim myCap As String
>  
>  myCap = Application.Run("別ブック名!Test2")
>  MsgBox myCap
>  
>End Sub
>
>別ブックの標準モジュールに
>
>Function Test2() As String
>  Test2 = UserForm1.Caption
>End Function
>
>こうすれば、とりあえずは取得できますね。
ありがとうございました。上記の通りで取得することができました。
お手数をお掛けしました。これからよろしくお願いします。

【73825】Re:他のブックのUserform
発言  ichinose  - 13/2/18(月) 7:13 -

引用なし
パスワード
   おはようございます。
解決後ですが、ちょっと気になったので・・・。

> 他のブックで開いているUserformのCaptionを取得したいとおもいますが、

>>別ブックの標準モジュールに
>>
>>Function Test2() As String
>>  Test2 = UserForm1.Caption
>>End Function
↑これだと、正確には、開いているUserformのCaptionの取得ではありません。

上記のFunctionを呼び出せば、開いていなくても Userform1のCaptionは、取得できてしまいます。又、複数のユーザーフォームが存在する ということもありますよね!!


他のブックで開いているUserformのCaptionを取得したいブックの
Thisworkbookのモジュールに


function usedfrm() as object
  set usedfrm=userforms
end function


として、


呼び出しブックの標準モジュールに


sub test
  dim frm as object
  dim mes as string
  for each frm in workbooks("対象ブックの名前.xls").usedfrm
   if frm.visible then
     mes="表示されている"
    else
     mes="非表示です"
   end if
   msgbox frm.caption & "は、 " & mes
  next
  set frm=nothing
end sub

表示されているユーザーフォームが対象なら、Visibleプロパティのチェックで
いけると思います。

亜矢さんの仕様では、ここまでする必要がないのであれば、
余計なことですが・・・・。

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