エクセルVBAについて質問します。次の5つのマクロを作成してください。

①IEなどの特定のソフトを起動させるマクロ。
②そのソフトをアクティブにするマクロ。
③他のソフトで①②を行う場合はマクロのどこを変えるか。
④特定のファイルをアクティブを開くマクロ。
⑤ファイルの上で「Enter」を押すマクロ。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/09/22 07:20:51
  • 終了:2006/09/24 15:51:38

回答(3件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/09/22 09:00:39

ポイント30pt

①IEなどの特定のソフトを起動させるマクロ。

http://homepage2.nifty.com/kasayan/vba/vba3.htm

これを 行うには Shell関数を使います。

使い方は、上記HPをご覧ください。

なお、①以外は、ちょっと無理かと思います。

起動させた時点で、それがアクティブになればいいんですが。

id:taroemon

いつもご回答ありがとうございます。

参考にします。

2006/09/22 10:17:30
id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/09/22 10:02:03

ポイント50pt

こちらでいかがでしょうか?

標準モジュールに貼り付ける等して試してみてください。

Option Explicit

'関連付けにあわせて、指定したファイルを開くAPI関数

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const SW_SHOWNORMAL = 1

Private Const SW_SHOW = 5

'デスクトップのハンドルを渡すAPI関数

Private Declare Function GetDesktopWindow Lib "user32" () As Long

'■要望1と2

Public Function Test1()

    '①IEなどの特定のソフトを起動させるマクロ

    '②そのソフトをアクティブにするマクロ。

    'Shell関数を使います。詳しくはヘルプを参照のこと。

    '例:IEを起動。アクティブ(フォーカスをセット)にする。

    Call Shell("C:\Program Files\Internet Explorer\IEXPLORE.EXE", vbNormalFocus)

    'vbHide:フォーカスを持ち、非表示にされるウィンドウ。定数 vbHide は、Macintosh では使用できません。

    'vbNormalFocus:フォーカスを持ち、元のサイズと位置に復元されるウィンドウ

    'vbMinimizedFocus:フォーカスを持ち、最小化表示されるウィンドウ

    'vbMaximizedFocus:フォーカスを持ち、最大化表示されるウィンドウ

    'vbNormalNoFocus:最後にウィンドウを閉じたときのサイズと位置に復元されるフォーカスを持たないウィンドウ。現在アクティブなウィンドウは、アクティブのままです。

    'vbMinimizedNoFocus:最小化表示されるフォーカスを持たないウィンドウ。現在アクティブなウィンドウは、アクティブのままです。

End Function

'■要望3:不要

'■要望4

Public Function Test4()

    '④特定のファイルをアクティブを開くマクロ。

    '拡張子に関連付けされたアプリケーションで開きます

    '例:テキストファイルを開く

    Call AppFileOpen("D:\hoge.txt") '←■ファイルのパス名を指定

End Function

'■要望5

Public Function Test5()

    '⑤ファイルの上で「Enter」を押すマクロ。

    'SendKeys でキーを送信します。詳しくはヘルプを参照のこと。

    '構文 SendKeys string[, wait]

    '引数: 転送するキー コード、キーコードの転送によって行われる処理が終了するまで、実行を一時中断するかどうかを設定

    '例:「Enter」を押す

    SendKeys "{ENTER}"

    

End Function



'----------------------------------------------------------------

'----------------------------------------------------------------

' 拡張子に関連付けされたアプリケーションで実行

'----------------------------------------------------------------

'----------------------------------------------------------------

Public Function AppFileOpen(OpenFilePath As String) As Boolean

    Dim lngAPIReVal As Long

    

        'URLを実行する

    lngAPIReVal = ShellExecute(GetDesktopWindow, "open", OpenFilePath, vbNullString, "", SW_SHOWNORMAL)

    If lngAPIReVal <= 32 Then

        AppFileOpen = False

    Else

        AppFileOpen = True

    End If

End Function


id:taroemon

ご回答ありがとうございます。

ほぼ求めているとおりなのですが、僕にはわからないことも多いです。そこで以下のとおり再質問させていただきます。

質問①について

絶対パスを使用する場合、他のパソコンでは使えません。他に何か良い方法はありますか?

質問②について

プログラムが起動しているが非アクティブの物をアクティブにするというマクロをお願いします。

質問⑤について

非アクティブのファイルの上でEnterを押すというマクロをお願いします。

2006/09/22 13:58:21
id:llusall No.3

llusall回答回数505ベストアンサー獲得回数612006/09/22 16:26:10

ポイント50pt

質問①について

絶対パスを使用する場合

ネットワークパスを設定します。

例:

Call Shell("\\SERVER_NAME\D\CALC.EXE", vbNormalFocus)

※当然、EXEファイルは、ネットワーク上になければなりません。(ローカルは駄目です)



質問②について

プログラムが起動しているが非アクティブの物をアクティブにする

以下にサンプルを記載します。



質問③について

WIN32APIでそのようにメッセージを投げるような事ができるかもしれませんが、

私的には、無理です。

ごめんなさい。



Option Explicit

' クラス名とウィンドウ名が指定された文字列と一致するウィンドウのハンドルを取得する関数の宣言

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _

   (ByVal lpClassName As String, _

    ByVal lpWindowName As String) As Long

' ウィンドウがアイコン化されているかどうかを判断する関数の宣言

Declare Function IsIconic Lib "user32" _

   (ByVal hWnd As Long) As Long

' ウィンドウをウィンドウを復元してアクティブ化する関数の宣言

Declare Function OpenIcon Lib "user32" _

   (ByVal hWnd As Long) As Long


Public Sub メモ帳を起動()

    Dim lngProcessId As Long

    

    ' メモ帳を起動

    lngProcessId = Shell("Notepad.exe", _

                         vbMinimizedFocus)

'    ' プロセスIDを表示

'    Debug.Print "プロセスID:" & Hex(lngProcessId)

'

'    ' クラス名を指定する文字列を表示

'    Debug.Print "クラス名を指定する文字列:" & "Notepad"

'

'    ' ウィンドウの表示方法を表示

'    Debug.Print "復元してアクティブ化"

End Sub

Private Sub アクティブにする()

    Dim lngHandleWindow       As Long

    Dim lngWin32apiResultCode As Long

    Const ACTIVE_APP_CLS_NAME = "Notepad" '■ここのクラス名を設定します

    

    ' クラス名でウィンドウハンドルを取得

    lngHandleWindow = FindWindow(ACTIVE_APP_CLS_NAME, _

                                 vbNullString)

    ' ウィンドウハンドルが取得できた場合は

    If lngHandleWindow <> 0& Then

        ' ウィンドウがアイコン化されている場合は

        If IsIconic(lngHandleWindow) <> False Then

            ' ウィンドウを復元してアクティブ化

            lngWin32apiResultCode = OpenIcon(lngHandleWindow)

        End If

    End If

End Sub

※尚、クラス名が判らない場合は、ClsInfo Windowクラス名・表示位置取得ツールを利用すると良いです

id:taroemon

再度のご回答ありがとうございます。

大変参考になりました。またお願いします。

2006/09/22 18:52:26

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません