アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になります

今、VBScriptでExcelファイルからUserFormを立ち上げてプログラムの実行を考えていますが
エクプローラからダブルクリックでVBSを実行するとUserFormがエクスプローラに隠れてしまいます
UserFormには常に前面に表示するように指示してありますがうまく行きません

前面に出す方法、またはエクプローラをタスクバーに入れる方法等何か良い方法が有りましたら教えてください

... Excel起動
Dim oXlsApp
Dim fso
Dim XlsmName
set fso = createObject("Scripting.FileSystemObject")
XlsmName = fso.getParentFolderName(WScript.ScriptFullName) & "\Arare.xlsm"
'MsgBox XlsmName
'
Set oXlsApp = CreateObject("Excel.Application")
If oXlsApp Is Nothing Then
'... Excel起動失敗
MsgBox "Excel起動失敗"
Else
'... Excel起動成功
' -- Excel表示(Falseにすると非表示に出来る)
oXlsApp.Application.Visible = False
oXlsApp.Application.Workbooks.Open(XlsmName)
'... Excel終了
oXlsApp.Quit
'... Excelオブジェクトクリア
Set oXlsApp = Nothing
End If

以上、よろしくお願い申し上げます

A 回答 (1件)

こんにちは。



この問題を数日ずっと考えていました。
一体、どのような目的で行っているのかは分かりませんが、Excelだけの問題なら、Excel はVBを搭載しているので、難なくできますが、VBScript からだと、どうしても制限されます。
調べてみると、Process ID からでないとうまく行かないとか書かれているサイトがあり、具体的には、ClassName を、GetClassName 関数で取れない、(理由は固定長変数が作れないから-何かの間違いかもとは思うのですが、)、事実取れませんでした。そうすると、恒常的な最前面化は不可能になってしまいます。

だから、開いた時だけのことになってしまいますが、こういうことでしたら、可能です。

'//....
Set oXlsApp = CreateObject("Excel.Application")
If oXlsApp Is Nothing Then
'... Excel起動失敗
MsgBox "Excel起動失敗"
WScript.Quit
Else
'... Excel起動成功
' -- Excel表示(Falseにすると非表示に出来る)
oXlsApp.Visible = True '現行ではTrue で行って、XLのMacroで、
oXlsApp.Workbooks.Open(XlsmName)

WScript.Sleep 500
'------------------ この部分で最前面化
With oXlsApp
h = .ExecuteExcel4Macro("CALL(""user32"", ""FindWindowA"", ""JCJ"", ""ThunderDFrame"", 0)")
If h <>0 Then
.ExecuteExcel4Macro("CALL(""user32"",""SetForegroundWindow"",""J""," & CStr(h) &")")
End If
End With
End If
'----------------------
WScript.Sleep 2000 '待ち時間(こちらは、特に意味はない)
'... Excel終了
oXlsApp.Quit
'... Excelオブジェクトクリア
Set oXlsApp = Nothing
'//

なお、待ち時間に関しては、あえて付けたまでで、最初のWscript.Sleep 500は、ただ、なんとなく不安だからという理由にすぎません。Excel側は、ThisWorkbookモジュール側のWorkbook_Open に、UserForm1.Show False があるという前提になっています。UserForm1.Initialize の中で、 Application.Visible = False しています。
    • good
    • 0
この回答へのお礼

いつもお世話になります
貴重なお時間をありがとうございます

実行してみましたがうまく行きませんでした
Dim oXlsApp
Dim oXlWorkbook
Dim fso
Dim XlsmNam

set fso = createObject("Scripting.FileSystemObject")
XlsmName = fso.getParentFolderName(WScript.ScriptFullName) & "\Arare.xlsm"

 Set oXlsApp = CreateObject("Excel.Application")
  If oXlsApp Is Nothing Then
MsgBox "Excel起動失敗"
  Else
oXlsApp.Application.Visible = False
Set oXlWorkbook = oXlsApp.Application.Workbooks.Open(XlsmName)
'-この部分で最前面化
 With oXlsApp
h = .ExecuteExcel4Macro("CALL(""user32"", ""FindWindowA"", ""JCJ"", ""ThunderDFrame"", 0)")
If h <>0 Then
 .ExecuteExcel4Macro("CALL(""user32"",""SetForegroundWindow"",""J""," & CStr(h) &")")
End If
 End With
'-
oXlWorkbook.Close
oXlsApp.Quit
Set oXlsApp = Nothing
End If

Excel側

Private Sub Workbook_Open()
UserForm1.Show
End Sub

Private Sub UserForm_Initialize()
Application.Visible = False
UserForm1.Top = 100
UserForm1.Left = 300
End Sub

お礼日時:2018/05/12 16:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A