Acrobat のアクション、バッチ処理を実行する (Acrobat 6~10)

TOP > サンプル/関数 > *


概要

 

Acrobat アプリケーションのアクション処理(バッチ処理)をプログラムで実行します。

実行から終了までをプログラムで監視し、結果はログテキストでファイル出力します。

 

Acrobat X アクション処理をVBAで操作する

 

  • 通常ではAcrobat の全バージョン( 5 ~ 11 )はAcrobat OLE を使ってもアクションやバッチ処理を起動する事すら出来ないです。
    そこで、当サンプルは Acrobat OLE と自動化ソフトの AutoItX3 OLE を連携させて全てをプログラミング操作で行います。
      
  • 自動化ソフト AutoIt は商用利用も含めてフリーでの使用が可能になっています。
    VBA のSendKeys ステートメントより安定、高機能な仕様になっています。 
      

 

動作環境

 

当サイトが出した結果です。
必ず自分の環境で動作確認をしてください。

Acrobat 動作 備考
4
X
Acrobat 4.0 ※Windows 98SE + Excel 2000
※バッチ処理自体が未サポート
5
X
Acrobat 5.0.5 + Excel 2003
※当サンプルでは対応しません。予定も無し
6
OK
Acrobat 6.0.6 Pro + Excel 2003
7
OK
Acrobat 7.1.4 Pro + Excel 2003
8
OK
Acrobat 8.3.1 Pro + Excel 2003
9
OK
Acrobat 9.5.5 Extended + Excel 2003
10
OK
Acrobat X (10.1.9) Extended + Excel 2003
11
X
Acrobat XI (11.0.06) Extended+ Excel 2003
※当サンプルでは対応出来ません。
注意事項を参照
  • OK : 正常終了する。
  • NO : 動作しない。 又は実行時にエラーになる。
  • X  : 未対応。詳細は下の 注意 を参照ください。
  • -  : 未確認

 






事前準備と環境作成

 

1. 以下の環境が有るパソコンを準備

 

  • Windows 7 以上
    ※Windows XPでもOK
      
  • 上記の動作環境に書いてある Acrobat アプリケーション
      
  • Excel 2003 以上
    Excel 2000 でも動くかもしれませんが、動作未確認。
    Excel が64bit版の場合は、VBAコードの一部修正が必要。
      

 

2. Autoit のインストール

 

自動化ソフトのAutoit インストールが必要です。

Autoit のフルインストールが可能な場合は、以下を参照。

必要なDLL のみのインストールなら

 

3. Acrobat の環境設定を変更

 

Acrobat の環境設定でアクションウイザードを開いて

(Acrobat 9 以下はバッチ処理)

  • 「アクション実行の確認ダイアログを表示」 をオン
      
  • 「警告とエラーをログ・ファイルに保存」 をオン
      
  • 「場所の選択」 で保存フォルダを指定
      

を事前に設定しておきます。 (必須)

  
Acrobat 10 の環境設定でアクションウイザードを設定

 

4. Acrobat にアクション(バッチ処理)を事前登録

 

起動するアクション(バッチシーケンス)を事前に登録しておく必要が有ります。

アクション名(バッチシーケンス名)は日本語も使えますが、当サンプルのプログラム仕様上の問題で半角英数字でお願いします。

 

 

5. サンプルのダウンロード

 

ダウンロードしたら、解凍して AutoRun_Acrobat_Action_100.xls ファイルを取り出します。

 


 

サンプルの実行

 

AutoRun_Acrobat_Action_100.xls ファイルを実行します。

 

1. 最初に以下のシートが表示されます。

読んでください。

Acrobat のアクション、バッチ処理を実行する (Acrobat 6~10)

 

2. MAIN シートを開きます。

  1. 上記で登録したアクション名(バッチのシーケンス名)
      
  2. Acrobat が処理する時の予想タイムアウト時間(秒)

をシート上に入力します。

最後に「実行」ボタンをマウスでクリックします

Acrobat のアクション、バッチ処理を実行する (Acrobat 6~10)

 

3. 良ければ、「OK」ボタンをマウスでクリックします。

Acrobat のアクション、バッチ処理を実行する (Acrobat 6~10)

この後で、プログラム内部で各種の事前チェックが行われます。

問題が有れば、以下の様なエラーが表示されます。

Acrobat のアクション、バッチ処理を実行する (Acrobat 6~10)

 

4. Acrobat のアクション処理(バッチ処理)が終了するまで待ちます。

終了すると以下の様な終了ダイアログ画面が表示されます。

同時にAcrobat の環境設定の「場所の選択」 で指定したフォルダにログファイルを出力します。

Acrobat のアクション、バッチ処理を実行する (Acrobat 6~10)

 


備考

  

  1. Acrobat XI (v11) バージョンに関してはユーザーインターフェースが全く変わってしまうので、別サンプルで対応したいと考えています。
    但し、AutoItX3 の全く別の機能を使う必要があると思われるので、もう少し慣れてから考えたいです。
      
  2. サンプルはExcel VBA で提供してます。
    VBAは歴史の古いBASIC言語なので他のプログラミングに移行しやすいと考えている。
     
  3. VBAにはSendKeysステートメントが有ります。
    しかし、キーボード操作を簡単にシミュレーションは出来るが、安定性に欠けます。
    アプリケーションの操作には向いてない。
      
  4. ソース内部に大量のコメントが開発時のメモとして有ります。
    使用時は注意し削除してください。
     
  5. 不具合は出来るだけ対応したいと思いますが、時間日数等の保証は全く出来ません。
      
  6. 活用できた場合は、どの様な使い方をしたかのコメントを頂けると助かります。
    またカスタマイズした箇所等の情報も頂けると嬉しいです。
    今後に活かしたいと思ってますのでよろしくお願い致します。
      
  7. 自動化ソフト AutoItX3 に関する技術的な質問に返答できる知識を当サイト管理者はまだ持っていません。
    その前提でコメント投稿を開放します。
     

 

注意事項

 

  1. アクション名、又はバッチ名は半角の英数字で登録してください。
    それ以外の文字種を使うとAutoItX3 操作が失敗するかもしれません。
      
  2. Acrobat 5 , Acrobat XI は当サンプルでは対応しません。
    理由 Acrobat 5 :古いソフトで有り、サポート・メンテナンスに無理が有る。
    理由 Acrobat XI :画面UIが変更になって、当サンプルでは全く対応不可。
     
  3. AcrobatInfo.exe がバックグランドで勝手に動いて当サンプルの動作に支障を出るかもしれません。
    当サンプルを元に作ったアクション処理(バッチ処理)プログラムを使う時は、このAcrobatInfo.exe一時停止するような措置を考えて下さい。
    ※当サイトでは自己責任で AcrobatInfo.exe をリネームして、一時的に停止させました。
      
  4. VBAのSendKeysステートメントよりは自動化ソフト AutoItX3 OLE の方が、安定して使えます。
    但し、自動化ソフト AutoItX3 は基本が画面操作になるので非常にデリケートなプログラミングが必要になります。
    動作環境の影響も少なからず受け、操作失敗につながることもありますので、問題が出たと思われる時は、まずは Windowsの再起動をお勧めします。 
       
  5. Acrobat X (v10) の以下のアクション実行確認画面に「このアクションには、以後表示しない」が表示されていますが、決してオンにしないで下さい。
    動作を正確に監視する上で以下の画面表示は絶対に必要です。
    間違ってオンした場合は、一旦アクションを削除して、再度登録し直してください。
      
    Acrobat X (v10) のアクション実行確認画面
      

 

動作確認環境

 

  • Acrobat 5.0.5 + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 6.0.6 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 7.1.4 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP2 + WindowsUpdate)
  • Acrobat 8.3.1 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 8.3.1 Pro + Office 2007( + SP3)
    +  Windows 7 64bit( + SP1 + WindowsUpdate)
  • Acrobat 9.5.2 Extended + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat X (10.1.4) Extended + Office 2003( + SP3) 
    + WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat XI (11.0.06) Extended + Office 2003( + SP3)
    + WindowsXP Pro( + SP3 + WindowsUpdate)

     

     


     

    サンプルソース:Excel VBA

     

    1. F8キーでステップ実行するとAutoItX3ステートメントが失敗する場合が有るので、Debug.Printでトレースを取るようにしてください。
       
    2. Acrobatの参照設定 をしています。
       
    3. AutoItX3 の参照設定 をしています。
       

      
     

     

    Option Explicit

    'Test Mode
    Public Const CON_TEST = False    'True:Test Mode / False:No Test Mode

    '▼以下は全体で使うグローバル変数&定数▼
    'バッチ処理の「進捗状況」画面のタイムアウト時間(秒)
    Dim glTimeOut           As Long
    '動作Acrobatのバージョン番号 6~10
    '※当サンプルで動作するのは Acrobat 6 , 7 , 8 , 9 , 10 です
    Public glAcrobatVersion As Long
    'ログの保存先フォルダ ※最後は\
    Public gstrLogSavePath As String
    '処理内部でのプログラミング・エラーのメッセージ
    Private gstrErrorMsg    As String
    'AutoItX3 オブジェクト
    Public gobjAutoItX3     As New AutoItX3Lib.AutoItX3

    '処理中でのAutoItX3.Sleep のデフォルト値
    '※画面等が切り替わる所はSleepを入れないと失敗する場合が有る
    Public Const CON_SLEEP = 100
    '起動するアクション名(バッチシーケンス名)
    Private gstrRunBatchName    As String

    '*********************************************************
    '
    ' Test Main sub
    '
    '*********************************************************

    Public Sub Main_test()
        
        'メッセージボックスを表示する
        If MsgBox("処理を開始しますか?", _
            vbOKCancel + vbDefaultButton2 + vbQuestion, "確認") _
            = vbCancel Then
            Exit Sub
        End If
        
        Dim lRet                As Long     '戻り値
        Dim bRet                As Boolean  '戻り値
        Dim strMenuBatchName    As String   'メニュー上の[バッチ処理]名
        
        '----------------------------------------------------------
        'Acrobatの環境設定のチェック&事前確認のチェック
        If bCheckAcrobatBatch = False Then Exit Sub
        
        'Acrobatオブジェクトの定義&作成
        'Acrobat 4,5,6 の時
        '※CreateObject実行後にAcrobatがメモリにロードされる
    '   Dim objAcroApp   As Acrobat.CAcroApp
    '   Set objAcroApp = CreateObject("AcroExch.App")
        'Acrobat 7,8,9,10,11 の時
        Dim objAcroApp          As New Acrobat.AcroApp
        
        '----------------------------------------------------------
        'Acrobatの起動
        lRet = objAcroApp.Show
        '開いていた不要なドキュメントを閉じる
        lRet = objAcroApp.CloseAllDocs
        
        '----------------------------------------------------------
        'Acrobatのバッチシーケンス画面を表示
        
        '[バッチ処理]メニューが有るか(使えるか)チェックする
        strMenuBatchName = "BatchEdit"
        lRet = objAcroApp.MenuItemIsEnabled(strMenuBatchName)
        If lRet = 0 Then
            '実行可能でない
            gstrErrorMsg = "[E01] Acrobatのバッチ処理:バッチシーケンス画面が" & _
                vbCrLf & "表示出来ませんでした" & _
                vbCrLf & vbCrLf & "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "プログラム・エラー"
            GoTo Skip_Main_test:
        End If
        
        '実行可能なので、メニューを実行
        lRet = objAcroApp.MenuItemExecute(strMenuBatchName)
        '※バッチシーケンス画面が表示されると次の命令へ行く
        
        '----------------------------------------------------------
        'Acrobatのバッチ処理をAutoItで監視&操作する
        Call subRun_Acrobat_Batch(gstrRunBatchName)
        
    Skip_Main_test:
        '----------------------------------------------------------
        'アプリケーションの終了
        objAcroApp.CloseAllDocs
        lRet = objAcroApp.Hide
        lRet = objAcroApp.Exit
        
        'オブジェクトの強制開放
        Set objAcroApp = Nothing

        'ログファイルの出力と 終了メッセージの表示
        Call subPutMessage
        
    End Sub

    '*********************************************************
    '
    ' Acrobat の環境設定/バッチ処理(アクションウイザード)のチェック
    '
    ' Create  : 2014/03/22
    ' Update  : 2014/03/22
    ' Vertion : 1.0.0
    '
    ' 備考    :
    ' URL     : http://pdf-file.nnn2.com/?p=786
    ' その他  : 著作権等は主張しません。
    '          上記URLにコメントを頂けると嬉しいです。
    '
    '*********************************************************

    Function bCheckAcrobatBatch() As Boolean

        Dim strAcrobatPath  As String   'Acrobatのパス
        Dim strVersion      As String   'Acrobatのバージョン
        Dim strMsg          As String   '処理後のエラーメッセージ
        Dim lRet            As Long     '戻り値
        Dim strAcrobatClass As String   'AcrobatクラスID
        Dim strAcrobatTitle As String   'Acrobatタイトル
        
        gstrErrorMsg = ""
        
        '------------------------------------------------------
        
        'Acrobatのバージョンを取得
        Call Get_Adobe_App_Info_nnn2("Acrobat", _
            strAcrobatPath, strVersion, strMsg)
        
        If CON_TEST Then Debug.Print _
            "AcrobatPath    ='" & strAcrobatPath & "'" & vbCrLf & _
            "Acrobat Version='" & strVersion & "'" & vbCrLf & _
            "Message        ='" & strMsg & "'"
        
        If strVersion = vbNullString Then
            gstrErrorMsg = _
                "[E10] Acrobat がインストールされて無い環境では" _
                & "動作しません。" & vbCrLf & vbCrLf & _
                "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "環境エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If
        
        '取得したAcrobatのバージョン
        glAcrobatVersion = strVersion
        
        '使用出来るAcrobatのバージョンかチェック
        If glAcrobatVersion > 10 Or _
            glAcrobatVersion < 6 Then
            '定数のエラー
            gstrErrorMsg = "[E11] 当プログラムは Acrobat " & _
                glAcrobatVersion & " では動作しません。" & _
                vbCrLf & "動作するのはAcrobat 6, 7, 8, 9, X(10) のみです。" _
                & vbCrLf & vbCrLf & "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "環境エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If
        
        'Acrobatが起動されているかをチェック
        '※このチェックは絶対に必要!
        ' FindWindow
        ' http://msdn.microsoft.com/ja-jp/library/cc364634.aspx
        '※注意:AcrobatInfo.exeもヒットする
        Select Case glAcrobatVersion
        Case 5
            '※クラスは変動するのでタイトルで検索
            strAcrobatClass = vbNullString
            strAcrobatTitle = "Adobe Acrobat"
        Case 6, 7
            strAcrobatClass = "AdobeAcrobat"
            strAcrobatTitle = vbNullString
        Case 8, 9, 10
            strAcrobatClass = "AcrobatSDIWindow"
            strAcrobatTitle = vbNullString
        End Select
        lRet = FindWindow(strAcrobatClass, strAcrobatTitle)
        If lRet > 0 Then
            gstrErrorMsg = "[E12] Acrobatが起動しています。" & _
                vbCrLf & "Acrobatを終了して下さい。" & _
                vbCrLf & "またはAcrobatが終了するまで待って下さい。" & _
                vbCrLf & vbCrLf & "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "環境エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If
        
        '------------------------------------------------------
        'シート上の入力データをチェック
        Dim strKeyName      As String
        Dim strKeyNameK     As String
        
        Select Case glAcrobatVersion
        Case 5, 6, 7, 8, 9
            strKeyName = "シーケンス"
            strKeyNameK = "バッチ処理"
        Case Else
            strKeyName = "アクション"
            strKeyNameK = "アクションウイザード"
        End Select
        
        Dim lRow            As Long     '行
        Dim lCol            As Long     '列
        Const CON_TOP_SHHET = "MAIN"     'シート名
        
        With Worksheets(CON_TOP_SHHET)
            lRow = 7
            lCol = 7
            If Trim$(.Cells(lRow, lCol)) = "" Then
                gstrErrorMsg = "[IE01] " & strKeyName & "名が" _
                    & "未入力です。" & vbCrLf & vbCrLf & _
                    "処理は開始できませんでした。"
                MsgBox gstrErrorMsg, _
                    vbOKOnly + vbCritical + vbSystemModal, "環境エラー"
                bCheckAcrobatBatch = False
                Exit Function
            End If
            gstrRunBatchName = Trim$(.Cells(lRow, lCol))  '"PrEdit"
        
            lRow = 11
            lCol = 7
            If Trim$(.Cells(lRow, lCol)) = "" Then
                gstrErrorMsg = "[IE02] タイムアウト時間(秒)が" _
                    & "未入力です。" & vbCrLf & vbCrLf & _
                    "処理は開始できませんでした。"
                MsgBox gstrErrorMsg, _
                    vbOKOnly + vbCritical + vbSystemModal, "環境エラー"
                bCheckAcrobatBatch = False
                Exit Function
            ElseIf Not IsNumeric(Trim$(.Cells(lRow, lCol))) Then
                gstrErrorMsg = "[IE02] タイムアウト時間(秒)が" _
                    & "未入力です。" & vbCrLf & vbCrLf & _
                    "処理は開始できませんでした。"
                MsgBox gstrErrorMsg, _
                    vbOKOnly + vbCritical + vbSystemModal, "環境エラー"
                bCheckAcrobatBatch = False
                Exit Function
            End If
            glTimeOut = Trim$(.Cells(lRow, lCol))
        
        End With
        
        '------------------------------------------------------
        
        Dim strSubKey   As String   'サブキー
        Dim strRegType  As String   'レジストリ格納タイプ
        Dim vValue      As Variant  'レジストリの値
        Dim strValue    As String   'レジストリの値(文字列)
        Dim i           As Long     '添字
        
        Const CON_KAKU_1 = "[シーケンス実行の確認ダイアログボックスを表示(S)]"
        Const CON_KAKU_2 = "[アクション実行の確認ダイアログを表示(S)]"
        Const CON_KEI_1 = "[警告とエラーをログファイルに保存(A)]"
        
        strSubKey = "Software\Adobe\Adobe Acrobat\" & _
            strVersion & ".0\Batch"
        lRet = GetRegistryValue(HKEY_CURRENT_USER, strSubKey, _
            "bConfirmRun", strRegType, strMsg, vValue)
        '※レジストリが存在しない場合はデフォルトで 1 の扱い
        If lRet = 2 Then vValue = 1
        If vValue = 0 Then
            gstrErrorMsg = _
                "[E13] Acroba/環境設定/" & strKeyNameK & _
                 vbCrLf & CON_KAKU_2 & vbCrLf & _
                 "チェックをオンにしてください。" & _
                 vbCrLf & vbCrLf & "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, _
                "Acrobat 環境設定エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If
        
        lRet = GetRegistryValue(HKEY_CURRENT_USER, strSubKey, _
            "bSaveLog", strRegType, strMsg, vValue)
        '※レジストリが存在しない場合はデフォルトで 0 の扱い
        If lRet = 2 Then vValue = 0
        If vValue = 0 Then
            gstrErrorMsg = _
                "[E14] Acroba/環境設定/アクションウイザード" & strKeyNameK _
                & vbCrLf & CON_KEI_1 & vbCrLf & _
                "チェックをオンにしてください。" & _
                vbCrLf & vbCrLf & "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, _
                "Acrobat 環境設定エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If
        
        If vValue = 1 Then
            strSubKey = "Software\Adobe\Adobe Acrobat\" & _
                strVersion & ".0\Batch\cLogLocation"
            lRet = GetRegistryValue(HKEY_CURRENT_USER, strSubKey, _
                "sDI", strRegType, strMsg, vValue)
            If lRet = 2 Then
                gstrErrorMsg = "[E15] Acroba/環境設定/" & strKeyNameK _
                    & vbCrLf & CON_KEI_1 & vbCrLf & _
                    "[場所の選択(C)]ボタンで保存先フォルダを設定してください。" _
                    & vbCrLf & vbCrLf & "処理は開始できませんでした。"
                MsgBox gstrErrorMsg, _
                    vbOKOnly + vbCritical + vbSystemModal, _
                    "Acrobat 環境設定エラー"
                bCheckAcrobatBatch = False
                Exit Function
            End If
            If strRegType = "REG_BINARY" Then
                'バイナリーを文字に変換
                strValue = ""
                For i = 0 To UBound(vValue) - 1
                    strValue = strValue & Chr(vValue(i))
                Next i
            Else
                strValue = vValue
            End If
            
            'レジストリからログ保存先フォルダを取得
            strValue = Replace(strValue, "/", "\")
            If Len(strValue) > 3 Then
                gstrLogSavePath = Mid$(strValue, 2, 1) & ":\" & _
                    Mid$(strValue, 4, Len(strValue) - 1) & "\"
            Else
                gstrLogSavePath = Mid$(strValue, 2, 1) & ":\"
            End If
            If CON_TEST Then Debug.Print _
                "gstrLogSavePath= '" & gstrLogSavePath & "'"
        
        Else
            '※このケースの発生は考えられないが。
            gstrErrorMsg = _
                "[E16] Acroba/環境設定/" & strKeyNameK & _
                vbCrLf & CON_KEI_1 & vbCrLf & _
                "[場所の選択(C)]のレジストリ値が不正です。" & _
                vbCrLf & vbCrLf & "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, _
                "Acrobat 環境設定エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If

        '------------------------------------------------------
        
        'ログの保存先フォルダをチェック
        '※内容が古い場合が有るので再チェック
        If Dir$(gstrLogSavePath, vbDirectory) = "" Then
            '定数のエラー
            gstrErrorMsg = "[E17] ログファイルの保存先フォルダ [" & _
                gstrLogSavePath & "] が存在しません。" & vbCrLf & _
                "事前に作成ておいてください。" & vbCrLf & vbCrLf & _
                "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "Acrobat 環境設定エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If

        '------------------------------------------------------
        Dim strCheck    As String
        
        'アクション名、バッチ名のチェック
        If Len(gstrRunBatchName) <> _
            LenB(StrConv(gstrRunBatchName, vbFromUnicode)) Then
            'エラー:全角文字が含まれている
            gstrErrorMsg = "[E18] " & strKeyName & "名のチェック " & _
                vbCrLf & "[" & gstrRunBatchName & "]" & vbCrLf & _
                "に半角英数字以外は使えません。" & vbCrLf & vbCrLf & _
                "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "入力エラー"
            bCheckAcrobatBatch = False
            Exit Function
        Else
            '英数字以外の文字が含まれていないかのチェック
            For i = 0 To Len(gstrRunBatchName) - 1
                strCheck = Mid(gstrRunBatchName, i + 1, 1)
                If ("0" <= strCheck And _
                    strCheck <= "9") Or _
                    ("A" <= StrConv(strCheck, vbUpperCase) And _
                    StrConv(strCheck, vbUpperCase) <= "Z") Then
                Else
                    gstrErrorMsg = "[E18] " & strKeyName & "名" & _
                        vbCrLf & "[" & gstrRunBatchName & "]" & vbCrLf & _
                        "半角英数字以外は使えません。" & vbCrLf & vbCrLf & _
                        "処理は開始できませんでした。"
                    MsgBox gstrErrorMsg, _
                        vbOKOnly + vbCritical + vbSystemModal, "入力エラー"
                    bCheckAcrobatBatch = False
                    Exit Function
                End If
            Next i
        End If

        'アクション名、バッチ名と同じファイルの登録チェック
        '参照:http://acrobat-reader.nnn2.com/?p=123
        Dim strEnvVariable      As String   '環境変数
        Dim strSequencesPath    As String   'アクション、バッチ保存フォルダ
        Dim strSequencesFile    As String   'アクション、バッチのファイル名
        Dim strSequencesFileH   As String   'アクション、バッチのファイル名の拡張子無し
        
        strEnvVariable = Environ("APPDATA")
        strSequencesPath = strEnvVariable & "\Adobe\Acrobat\" & _
            strVersion & ".0\Sequences\" & gstrRunBatchName & ".sequ"
        '※Dir関数は大文字小文字関係無い
        strSequencesFile = Dir$(strSequencesPath, vbNormal)
        If strSequencesFile = "" Then
            gstrErrorMsg = "[E19] " & strKeyName & "名" & _
                vbCrLf & "[" & gstrRunBatchName & "]" & vbCrLf & _
                "が未登録です。" & vbCrLf & _
                "再度確認してください。" & vbCrLf & vbCrLf & _
                "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "入力エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If
        '拡張子の前のファイル名
        strSequencesFileH = Left$(strSequencesFile, _
            Len(strSequencesFile) - 5)
        '大文字、小文字も含めて完全チェックする
        If strSequencesFileH <> gstrRunBatchName Then
            'エラー:違う
            gstrErrorMsg = "[E19] " & strKeyName & "名" & _
                vbCrLf & "[" & gstrRunBatchName & "]" & vbCrLf & _
                "が未登録です。" & vbCrLf & _
                "再度確認してください。" & vbCrLf & vbCrLf & _
                "処理は開始できませんでした。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "入力エラー"
            bCheckAcrobatBatch = False
            Exit Function
        End If

        bCheckAcrobatBatch = True
        
    End Function

    '*********************************************************
    '
    ' AutoItX3を使ってAcrobatのアクション(バッチ)処理を制御する
    '
    ' Create  : 2014/03/22
    ' Update  : 2014/03/22
    ' Vertion : 1.0.0
    '
    ' 備考    :
    ' URL     : http://pdf-file.nnn2.com/?p=786
    ' その他  : 著作権等は主張しません。
    '          上記URLにコメントを頂けると嬉しいです。
    '
    ' 注意    : ウインドウの状態は「ProcessWalker Express」で監視
    '
    '*********************************************************

    Sub subRun_Acrobat_Batch(ByRef strRunBatchName As String)
        
        If CON_TEST Then Debug.Print _
            "★開始★ " & Date & " " & Time
            
        '----------------------------------------------------------
        
        Dim lRet            As Long     '戻り値
        Dim strTitle(10)    As String   'ワーク・タイトル
        Dim strText(10)     As String   'ワーク・テキスト
        Dim strClassID(10As String   'ワーク・クラスID
        Dim lTimeOut        As Long     'タイムアウト時間(秒)
        Dim i               As Long     '添字
        
    '    Dim objAutit3       As Object
    '    Set gobjAutoItX3 = CreateObject("AutoItX3.Control")
    '    Dim gobjAutoItX3     As New AutoItX3Lib.AutoItX3
        
        '自動化ソフトAutoItX3 のOLE初期化
    '    Set gobjAutoItX3 = CreateObject("AutoItX3.Control")
        
        For i = 0 To UBound(strTitle)
            strTitle(i) = ""
            strText(i) = ""
            strClassID(i) = ""
        Next i
        
        'AutoItX3 ウィンドウテキスト検索モード:完全
        lRet = gobjAutoItX3.AutoItSetOption("WinTitleMatchMode", 3)
        
        '----------------------------------------------------------
        '▼バッチシーケンス画面から該当するバッチを実行
        
        Select Case glAcrobatVersion
    '   Case 11
    '       'Acrobat 11 未対応
    '       strTitle(0) = "アクションを管理"
    '       strClassID(0) = "[CLASS:SysTreeView32; INSTANCE:1]"
        Case 10
            'Acrobat 10
            strTitle(0) = "アクションを編集"
            strClassID(0) = "[CLASS:SysTreeView32; INSTANCE:1]"
        Case 8, 9
            'Acrobat 8 , 9
            strTitle(0) = "バッチシーケンス"
            strClassID(0) = "[CLASS:SysTreeView32; INSTANCE:1]"
        Case 6, 7
            'Acrobat 6 , 7
            strTitle(0) = "バッチシーケンス"
            strClassID(0) = "[CLASS:Static; INSTANCE:2]"
    '    Case Else
    '        'Acrobat 5 未対応
    '        strTitle(0) = "バッチシーケンス"
    '        strClassID(0) = "[CLASS:Static; INSTANCE:5]"
        End Select
        strText(0) = ""
        
        '画面が出るまで待つ
        lTimeOut = 5
        'タイムアウト(秒)
        With gobjAutoItX3
    '        .Sleep CON_SLEEP
            lRet = .WinWait(strTitle(0), strText(0), lTimeOut)
            If Not .WinActive(strTitle(0), strText(0)) Then
                .WinActivate strTitle(0), strText(0)
            End If
            lRet = .WinWaitActive(strTitle(0), strText(0), lTimeOut)
        End With
    '    lRet = gobjAutoItX3.WinWait(strTitle(0), strText(0), lTimeOut)
        If lRet = 0 Then
            'タイムアウト発生!
            gstrErrorMsg = "[E21] Acrobatのバッチ処理" & vbCrLf & _
                strTitle(0) & vbCrLf & _
                "の画面がタイムアウト(" & lTimeOut & "秒)になりました。" & _
                vbCrLf & "処理は中断しました。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "プログラム・エラー"
            GoTo Skip_subRun_Acrobat_Batch:
        End If
        
        'リストボックスのフォーカスをアクティブにする
        lRet = gobjAutoItX3.ControlFocus(strTitle(0), strText(0), _
            strClassID(0))
            If CON_TEST Then Debug.Print _
                "ControlFocus=" & lRet & " E=" & gobjAutoItX3.Error
        
        'リスト上の該当シーケンスを選択状態にする
        lRet = gobjAutoItX3.ControlSend(strTitle(0), strText(0), _
            strClassID(0), strRunBatchName, 1)
    '    If lRet = 0 Then
    '        '0=Error 1=OK
    '    End If
            If CON_TEST Then Debug.Print _
                "シーケンスの選択状態の設定 ControlSend=" & _
                lRet & " E=" & gobjAutoItX3.Error
        
        Select Case glAcrobatVersion
    '   Case 11
    '       'Acrobat 11
    '       strTitle(1) = "アクションを管理"
    '       strText(1) = "実行(&R)"
    '       strClassID(1) = "[CLASS:Button; INSTANCE:7]"
        Case 10
            'Acrobat 10
            strTitle(1) = "アクションを編集"
            strText(1) = "実行(&R)"
            strClassID(1) = "[CLASS:Button; INSTANCE:7]"
        Case Else
            'Acrobat 5, 6, 7, 8, 9
            strTitle(1) = "バッチシーケンス"
            strText(1) = "シーケンスを実行(&S)"
            strClassID(1) = "[CLASS:Button; INSTANCE:5]"
        End Select
        
        'アクション(シーケンス)の実行ボタンをクリック
        '「シーケンスを実行(&S)」
        lRet = gobjAutoItX3.ControlClick(strTitle(1), strText(1), _
            strClassID(1), "", 1)
    '    If lRet = 0 Then
    '        '0=Error 1=OK
    '    End If
            If CON_TEST Then Debug.Print _
                "ControlClick=" & lRet & " E=" & gobjAutoItX3.Error
        
        '----------------------------------------------------------
        '▼「シーケンス実行の確認」画面の処理
        
        Select Case glAcrobatVersion
        Case 10    ', 11
            'Acrobat 10, 11
            strTitle(2) = "アクション : " & strRunBatchName
        Case Else
            'Acrobat 6, 7, 8, 9
            strTitle(2) = "シーケンス実行の確認 : " & strRunBatchName
        End Select
        strText(2) = ""
        strClassID(2) = ""
        
        lTimeOut = 5   'タイムアウト(秒)
        '画面が表示されたかを事前にチェック
        With gobjAutoItX3
    '        .Sleep CON_SLEEP
            lRet = .WinWait(strTitle(2), strText(2), lTimeOut)
            If Not .WinActive(strTitle(2), strText(2)) Then
                .WinActivate strTitle(2), strText(2)
            End If
            lRet = .WinWaitActive(strTitle(2), strText(2), lTimeOut)
        End With
    '    lRet = gobjAutoItX3.WinWait(strTitle(2), strText(2), lTimeOut)
        If lRet = 0 Then
            'タイムアウト発生!
            gstrErrorMsg = "[E22] Acrobatのバッチ処理" & vbCrLf & _
                strTitle(2) & vbCrLf & _
                "の画面がタイムアウト(" & lTimeOut & "秒)になりました。" & _
                vbCrLf & vbCrLf & "処理は中断しました。" & _
                vbCrLf & vbCrLf & "【重要】この後メモリ上にAcrobatアプリが残り" & _
                vbCrLf & "Windowsが不安定になる場合があります。" & _
                vbCrLf & "お手数ですが、OSの再起動をお願いします。"
            MsgBox gstrErrorMsg, _
                vbOKOnly + vbCritical + vbSystemModal, "プログラム・エラー"
            '直前のAutoItコマンドで使用された最後のウィンドウを閉じます
            gobjAutoItX3.WinClose "[LAST]", ""
            GoTo Skip_subRun_Acrobat_Batch:
        End If
        
        'OKボタンをクリック
        strTitle(3) = strTitle(2)
        Select Case glAcrobatVersion
        Case 10     ', 11
            'Acrobat 10, 11
            strText(3) = "次へ"
            strClassID(3) = "[CLASS:Button; INSTANCE:2]"
        Case Else
            'Acrobat 6, 7, 8, 9
            strText(3) = "OK"
            strClassID(3) = "[CLASS:Button; INSTANCE:1]"
        End Select
        
        lRet = gobjAutoItX3.ControlClick(strTitle(3), strText(3), _
            strClassID(3), "", 1)
    '    If lRet = 0 Then
    '        '0=Error 1=OK
    '    End If
            If CON_TEST Then Debug.Print _
                "ControlClick=" & lRet & " E=" & gobjAutoItX3.Error
        
        '----------------------------------------------------------
        '▼「進行状況」画面の終了するまで監視
        '※処理ファイルが0件の場合は次のWinWaitCloseは1が返り、
        'Acrobatが 6,7,8,9 の時は「警告とエラー」画面が表示される。
        'Acrobatが 10      の時は「アクションを編集」画面が表示される。
        
        strTitle(4) = "進行状況"    'OR "[TITLE:進行状況]"
        strText(4) = ""
        strClassID(4) = ""
        
        Dim iLoop       As Long     'ループ添字
        
        If CON_TEST Then Debug.Print _
            strTitle(4) & " の監視終了(4):" & Time
        
        gobjAutoItX3.Sleep CON_SLEEP    '<-これを入れないと失敗する場合が有る
        gobjAutoItX3.Sleep CON_SLEEP    'ココは2倍必要
        
        '画面が一度は動作したかの確認
        lRet = gobjAutoItX3.WinWaitClose(strTitle(4), strText(4), 1)
        If lRet = 0 Then
            
            'Debug.Print "**"
            'Acrobat 6 エラー有り,ゼロ件データ,1件のみエラーデータ
            'Acrobat 7 エラー有り,ゼロ件データ,1件のみエラーデータ
            'Acrobat 8 エラー無し,エラー有り,ゼロ件データ,1件のみエラーデータ
            'Acrobat 9 エラー無し,エラー有り,ゼロ件データ,1件のみエラーデータ
            'Acrobat10 エラー無し,エラー有り,1件のみ正常データ,1件のみエラーデータ
        Else
            'Debug.Print "AA"
            'Acrobat 6 エラー無し,1件のみ正常データ
            'Acrobat 7 エラー無し,1件のみ正常データ
            'Acrobat 8 1件のみ正常データ
            'Acrobat 9 1件のみ正常データ
            'Acrobat10 ゼロ件データ    <-これのみ判断できる
            
            If glAcrobatVersion = 10 Then
                'Acrobat 10の場合
                '[警告とエラー]画面は表示されない。
                '[アクションを編集]画面にもどる
                'クリップボードにエラーメッセージを入れて終了
                gobjAutoItX3.ClipPut "Acrobat X アクション[" & strRunBatchName & _
                    "] 処理で該当データはゼロ件でした。" & _
                    Date & " " & Time
                gstrErrorMsg = "該当データはゼロ件でした。"
                GoTo Skip_subRun_Acrobat_Batch:
            End If
        End If
        
        '注意:WinGetState でも WinExists でもエラーが有る時は
        '見える画面が終了してもメモリ上では存在する場合がある
        '「進捗状況」の画面がそれ!
        
        '進捗画面の終了を監視
        With gobjAutoItX3
            For iLoop = 1 To glTimeOut
                '1秒待機
                .Sleep 1000
                lRet = .WinGetState(strTitle(4), strText(4))
                'Debug.Print "ON:進行状況:Loop " & iLoop & " " & lRet
                If (lRet = 0 Or lRet = 1) Then
                    '画面は存在しない
                    '※この場合は戻り値は0では無く「1=ウィンドウが存在」でも返る
                    Exit For
                End If
            Next iLoop
        End With
        
        If Not (lRet = 0 Or lRet = 1) Then
            'タイムアウト発生
            gstrErrorMsg = "[E24] Acrobatのバッチ処理[" & vbCrLf & _
                strTitle(4) & vbCrLf & "]の画面がタイムアウト(" & _
                glTimeOut & "秒)になりました。" & _
                vbCrLf & "処理は中断しました。"
            MsgBox gstrErrorMsg, _
                 vbOKOnly + vbCritical + vbSystemModal, "プログラム・エラー"
            '直前のAutoItコマンドで使用された最後のウィンドウを閉じます
            gobjAutoItX3.WinClose "[LAST]", ""
            GoTo Skip_subRun_Acrobat_Batch:
        End If
        If CON_TEST Then Debug.Print _
            strTitle(4) & " の監視終了(4):" & Time & " " & iLoop
        
        '----------------------------------------------------------
        '▼「警告とエラー」画面の処理
        '注意:「警告とエラー」画面が表示された段階でシステムの
        'モニターを見ると進捗情報・画面はメモリ上に残っている。
        '但し「警告とエラー」画面が無い時は進捗情報・画面も
        'メモリ上では残って無い。
        
        gobjAutoItX3.Sleep CON_SLEEP
        
        Select Case glAcrobatVersion
        Case 10     ', 11
            'Acrobat 10 , 11
            strTitle(5) = strRunBatchName
        Case Else
            'Acrobat 6, 7 , 8 , 9
            strTitle(5) = "警告とエラー"
        End Select
        strText(5) = ""
        strClassID(5) = ""
        
        '「警告とエラー」画面が存在するかを確認
        lRet = gobjAutoItX3.WinExists(strTitle(5), strText(5))
        If lRet = 0 Then
            '「警告とエラー」画面が存在しない
            If CON_TEST Then Debug.Print _
                "「警告とエラー」画面 Skip"
            GoTo Skip_subRun_Acrobat_Batch:
        End If
            
        Dim strWinText  As String
        
        If 10 <= glAcrobatVersion Then
            'Acrobat X(10) , XI(11) の時
            gobjAutoItX3.Sleep CON_SLEEP
            '[警告とエラー]文字が画面上に表示されているかを確認する
            strWinText = gobjAutoItX3.WinGetText(strTitle(5), strText(5))
            If InStr(strWinText, "警告とエラー") > 0 Then
                '[警告とエラー]文字が見つかった
            Else
                '見つからなかった。エラーは無い。
                'OKボタンをクリックする。
                strClassID(5) = "[CLASS:Button; INSTANCE:1]"
                lRet = gobjAutoItX3.ControlClick( _
                    strTitle(5), strText(5), strClassID(5), "", 1)
    '            Debug.Print "ControlClick=" & lRet & " E=" & gobjAutoItX3.Error
                    If CON_TEST Then Debug.Print _
                        "「警告とエラー」明細・画面 Skip"
                GoTo Skip_subRun_Acrobat_Batch:
            End If
            
        End If
            
        gstrErrorMsg = "[警告とエラー]が有りました。"
        
        Dim strK_Title      As String   '画面タイトル
        Dim strK_Text       As String   '画面テキスト
        Dim strK_ClassID    As String   '画面クラスID
        
        '「警告とエラー」画面を閉じる
        Select Case glAcrobatVersion
        Case 10     ', 11
            'Acrobat 10 , 11
            strK_Title = strRunBatchName
            strK_ClassID = "[CLASS:Button; INSTANCE:1]"
        Case 8, 9
            'Acrobat 8 , 9
            strK_Title = "警告とエラー"
            strK_ClassID = "[CLASS:Button; INSTANCE:1]"
        Case Else
            'Acrobat 6, 7
            strK_Title = "警告とエラー"
            strK_ClassID = "[CLASS:Static; INSTANCE:2]"
        End Select
        strK_Text = ""
        
        gobjAutoItX3.Sleep CON_SLEEP
        lRet = gobjAutoItX3.ControlClick(strK_Title, strK_Text, _
            strK_ClassID, "", 1)
        If lRet = 0 Then
            '0=Error 1=OK
            Debug.Print strK_Title & "★画面を閉じれなかった E=" & _
                gobjAutoItX3.Error
        End If
            
            If CON_TEST Then _
                Debug.Print "ControlClick=" & lRet & _
                " E=" & gobjAutoItX3.Error
        
        '画面を強制的に閉じる
        lRet = gobjAutoItX3.WinClose(strK_Title)
        
    Skip_subRun_Acrobat_Batch:

        With gobjAutoItX3
            
            '念の為に不要になった画面を強制的に閉じる
            '※画面が残るとメモリ上にプロセスが残り
            ' 次回でAcrobatが正常に起動しなくなる。
            For i = UBound(strTitle) To 1 Step -1
                If strTitle(i) <> "" Then
                    .Sleep CON_SLEEP
                    lRet = .WinClose(strTitle(i))
                    '.WinKill strTitle(i), ""
                End If
            Next i
            
            If strTitle(2) <> "" Then
                '選択で失敗した画面を閉じる
                Select Case glAcrobatVersion
                Case 10    ', 11
                    'Acrobat 10, 11
                    strTitle(2) = "アクション : "
                Case Else
                    'Acrobat 6, 7, 8, 9
                    strTitle(2) = "シーケンス実行の確認 : "
                End Select
                'ウインドウテキスト検索モード:前方一致(デフォルト)
                lRet = .AutoItSetOption("WinTitleMatchMode", 1)
                lRet = .WinClose(strTitle(2))
                '.WinKill strTitle(2), ""
            End If
            
        End With
        
        'オブジェクトの強制開放
        Set gobjAutoItX3 = Nothing
        
    End Sub

    '*********************************************************
    '
    ' 終了メッセージの表示
    '
    ' Create  : 2014/03/22
    ' Update  : 2014/03/22
    ' Vertion : 1.0.0
    '
    ' 備考    : 特に無し
    '
    ' URL     : http://pdf-file.nnn2.com/?p=786
    ' その他  : 著作権等は主張しません。
    '          上記URLにコメントを頂けると嬉しいです。
    '
    ' 注意    : 特に無し
    '
    '*********************************************************

    Sub subPutMessage()
        
        Dim lFileNo         As Long     'ファイルNo
        Dim strLogPath      As String   'ファイルパス
        Dim strMsg          As String   'テキストファイルへのメッセージ
        
        Const CON_INFO_MSG1 = vbCrLf & vbCrLf & _
            "当プログラムで連続のバッチ処理を行うと" & vbCrLf & _
            "Acrobatへの自動処理が失敗する場合が有るので" & vbCrLf & _
            "次の処理を行う時は5秒以上の時間を置いて下さい。" & vbCrLf & _
            "パソコンのCPU能力が低い時は10秒以上置いて下さい。"
        
        '※上記メッセージの理由:
        'Acrobatアプリ本体が終了するのに数秒掛かる場合があります。
        'その時はメモリ上にAcrobat本体が残っています。
        'その状態で再起動を行うとAcrobat本体が不安定?になる場合が有るからです。
        
        strMsg = gstrErrorMsg
        
        strLogPath = gstrLogSavePath & _
            Format(Date, "yyyy-mm-dd-") & _
            Format(Time, "hh-mm-ss")

        If gstrErrorMsg = "" Then
            strLogPath = strLogPath & "-OK.txt"
            strMsg = "エラーは有りませんでした。" & vbCrLf & _
                Format(Date, "yyyy/mm/dd ") & _
                Format(Time, "hh:mm:ss")
        Else
            strLogPath = strLogPath & "-ERROR.txt"
            strMsg = gstrErrorMsg & vbCrLf & _
                Format(Date, "yyyy/mm/dd ") & _
                Format(Time, "hh:mm:ss")
        End If
        
        '結果をログファイルとして出力する
        lFileNo = FreeFile
        Open strLogPath For Output As #lFileNo
        Print #lFileNo, strMsg
        Close #lFileNo
        
        
        If CON_TEST Then Debug.Print _
            "★終了 " & Date & " " & Time

        '終了メッセージを表示
        MsgBox "[F00] 処理は終了しました。" _
             & vbCrLf & gstrErrorMsg & _
             vbCrLf & vbCrLf & Date & "  " & Time & _
             CON_INFO_MSG1, vbSystemModal, "結果報告"
             
        
    End Sub

    *************************************************************

    別モジュール

    *************************************************************

    Option Explicit

    'Win32 APIを使用するための宣言

    'レジストリ共通キー(親キー)
    'Public Const HKEY_CLASSES_ROOT = &H80000000
    Public Const HKEY_CURRENT_USER = &H80000001
    'Public Const HKEY_CURRENT_CONFIG = &H80000005
    'Public Const HKEY_DYN_DATA = &H80000006
    Public Const HKEY_LOCAL_MACHINE = &H80000002
    'Public Const HKEY_USERS = &H80000003
    'Public Const ERROR_SUCCESS = 0&

    'レジストリのデータタイプ
    'Private Const REG_NONE = 0                  '未定義のタイプ
    Private Const REG_SZ = 1                    'NULLで終わる文字列
    Private Const REG_EXPAND_SZ = 2             '展開前の環境変数
    Private Const REG_BINARY = 3                '任意の形式のバイナリデータ
    Private Const REG_DWORD = 4                 'ネイティブd形式の32ビット値
    'Private Const REG_DWORD_LITTLE_ENDIAN = 4   'リトルエンディアン形式の32ビット値
    'Private Const REG_DWORD_BIG_ENDIAN = 5      'ビッグエンディアン形式の32ビット値
    'Private Const REG_LINK = 6                  '別のサブキーへのシンボリックリンク
    Private Const REG_MULTI_SZ = 7              'NULLで終わる文字列のリスト

    Const ERROR_MORE_DATA = 234

    'キーアクセスオプションを定義する為に必要
    Private Const SYNCHRONIZE = &H100000
    Private Const READ_CONTROL = &H20000
    Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
    Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
    Private Const STANDARD_RIGHTS_ALL = &H1F0000

    'キーアクセスオプション
    Private Const KEY_CREATE_LINK = &H20        '他のサブキーへのシンボリックリンクの作成を許可
    Private Const KEY_CREATE_SUB_KEY = &H4      'サブキーの作成を許可
    Private Const KEY_ENUMERATE_SUB_KEYS = &H8  'サブキーの列挙を許可
    Private Const KEY_NOTIFY = &H10             '変更通知を有効にする(WIN95は未対応)
    Private Const KEY_QUERY_VALUE = &H1         'サブキーの値の参照を許可
    Private Const KEY_SET_VALUE = &H2           'サブキーの書き込みを許可
                                                'KEY_CREATE_SUB_KEY + KEY_SET_VALUE
    'ウィンドウハンドル取得
    Public Declare Function FindWindow Lib _
            "user32" Alias "FindWindowA" _
            (ByVal lpClassName As String, _
             ByVal lpWindowName As String) As Long

    'Private Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or _
    '      KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
    '                                                'KEY_EXECUTE + KEY_NOTIFY
    Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or _
          KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
                                                    'KEY_CREATE_LINK + KEY_READ + KEY_WRITE
    'Private Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or _
    '      KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or _
    '      KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
    '                                                'KEY_READ

    'Const KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))
    'Const KEY_READ = &H20019  ' ((READ_CONTROL Or KEY_QUERY_VALUE Or
    '                          ' KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not
    '                          ' SYNCHRONIZE))

    '戻り値
    Private Const ERROR_SUCCESS = 0&                'エラー無し

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

    Private Type VS_FIXEDFILEINFO
        dwSignature        As Long
        dwStrucVersion     As Long
        dwFileVersionMS    As Long
        dwFileVersionLS    As Long
        dwProductVersionMS As Long
        dwProductVersionLS As Long
        dwFileFlagsMask    As Long
        dwFileFlags        As Long
        dwFileOS           As Long
        dwFileType         As Long
        dwFileSubtype      As Long
        dwFileDateMS       As Long
        dwFileDateLS       As Long
    End Type

    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (dest As Any, source As Any, ByVal numBytes As Long)

    'レジストリのハンドルを解放する
    Public Declare Function RegCloseKey Lib "ADVAPI32" _
        (ByVal hKey&) As Long

    'レジストリのキーを開ける(ハンドルの確保)
    Public Declare Function RegOpenKeyEx Lib "ADVAPI32" _
        Alias "RegOpenKeyExA" (ByVal hKey&, ByVal lpSubKey$, _
        ByVal ulOptions&, ByVal samDesired&, phkResult&) As Long

    'レジストリの値を取得する(DWORD)
    Public Declare Function RegQueryValueExstr Lib "ADVAPI32" _
        Alias "RegQueryValueExA" (ByVal hKey&, _
        ByVal lpValueName$, ByVal lpReserved&, ByVal lpType&, _
        ByVal lpData$, lpcbData&) As Long

    'レジストリの値を取得する(テキスト)
    Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
        Alias "RegQueryValueExA" _
          (ByVal hKey As Long, ByVal lpValueName As String, _
          ByVal lpReserved As Long, lpType As Long, lpData As Any, _
          lpcbData As Long) As Long

    'ファイルのバージョン情報のサイズを取得する
    Public Declare Function GetFileVersionInfoSize Lib _
        "Version.dll" Alias "GetFileVersionInfoSizeA" _
        (ByVal lptstrFilename As String, lpdwHandle As Long) _
        As Long

    'ファイルのバージョン情報を取得する
    Public Declare Function GetFileVersionInfo Lib "Version.dll" _
        Alias "GetFileVersionInfoA" _
        (ByVal lptstrFilename As String, ByVal dwHandle As Long, _
        ByVal dwLen As Long, lpData As Any) As Long
        
    Public Declare Function VerQueryValue Lib "Version.dll" _
        Alias "VerQueryValueA" (pBlock As Any, _
        ByVal lpSubBlock As String, lplpBuffer As Any, _
        puLen As Long) As Long
        
    Public Declare Sub MoveMemory Lib "kernel32.dll" _
        Alias "RtlMoveMemory" (Destination As Any, _
        source As Any, ByVal length As Long)

    '時間指定してCPUをシステムに戻す
    Public Declare Sub Sleep Lib "kernel32.dll" _
        (ByVal dwMilliseconds As Long)
        

    '**************************************************
    '
    ' Acrobat , Adobe Reader アプリのインストールパスと
    ' アプリケーションのバージョンを取得する
    '
    ' Get the version and application path
    ' for acrobat and adobe reader.
    '
    ' Create  : 2013/10/08
    ' Update  :
    ' Vertion : 1.0.0
    '
    ' 引数1   : strApp As String (IN)
    '           'Acrobat'  Acrobatの処理
    '           'Reader'  Adobe Readerの処理
    ' 引数2   : strPath As String (OUT)
    '           Adobe アプリケーションパス
    ' 引数3   : strVersion As String (OUT)
    '           アプリケーションのバージョン番号 4~11
    ' 引数4   : strMsg As String (OUT)
    '           エラーメッセージ
    '           ""はエラー無し
    '
    ' 戻り値  : True  正常処理
    '           False 実行エラー等
    '
    ' 備考    :
    '      1. 以下のサイトの情報を元に作成しました
    '    http://helpx.adobe.com/jp/acrobat/kb/511265.html
    ' URL     : http://pdf-file.nnn2.com/?p=767
    ' その他  : 著作権等は主張しません。
    '           上記URLにコメントを頂けると嬉しいです。
    '
    '**************************************************

    Public Function Get_Adobe_App_Info_nnn2( _
                ByVal strApp As String, _
                ByRef strPath As String, _
                ByRef strVersion As String, _
                ByRef strMsg As String) As Boolean
        
    On Error GoTo Err_Get_Adobe_App_Info_nnn2:
        
        Dim strFileVersion      As String
        Dim strProductVersion   As String
        Dim strSubKey           As String
        Dim strRootKey          As String
        Dim InstallPathReg      As Long
        Dim lLength             As Long
        Dim lRet                As Long
        Dim strName             As String
        
        strMsg = ""
        strRootKey = HKEY_LOCAL_MACHINE
        If strApp = "Acrobat" Then
            'Acrobat Reg
            strSubKey = "SOFTWARE\Microsoft\Windows\" & _
                "CurrentVersion\App Paths\Acrobat.exe"
        Else
            'Adobe Reader Reg
            strSubKey = "SOFTWARE\Microsoft\Windows\" & _
                "CurrentVersion\App Paths\AcroRd32.exe"
        End If
        
        'キーをオープンしてハンドルを得る
        lRet = RegOpenKeyEx(strRootKey, strSubKey, 0, 1, _
            InstallPathReg)
        
        'バッファを確保する
        strPath = String(250, Chr(0))
        lLength = Len(strPath) '長さ
        
        '"*.exe"エントリから既定のレジストリを得る
        strName = ""
        lRet = RegQueryValueExstr(InstallPathReg, strName, _
            0, 0, strPath, lLength)
        
        'レジストリ値の存在チェック
        strPath = Trim$(Replace(strPath, Chr(0), " "))
        If strPath = "" Then
            'エラー:アプリケーションは未インストール
            strMsg = "Not Found Adobe apllication"
            strVersion = vbNullString
            Exit Function
        End If
        
        'アプリのフルパスを出力
        strPath = Left$(strPath, InStr(strPath, ".exe") + 3)
        
        'ハンドルを閉じる
        Call RegCloseKey(InstallPathReg)

        '***************************************************
        '取得したパスの exeファイル情報を取得する
        '***************************************************

        Dim lngSizeOfVersionInfo  As Long
        Dim lngDummyHandle        As Long
        Dim bytDummyVersionInfo() As Byte
        Dim lngPointerVersionInfo As Long
        Dim lnglLengthVersionInfo As Long
        Dim udtVSFixedFileInfo    As VS_FIXEDFILEINFO

        'バージョン情報のサイズを取得
        lngSizeOfVersionInfo = GetFileVersionInfoSize(strPath, _
                                    lngDummyHandle)
        
        'ダミー変数の領域を確保
        ReDim bytDummyVersionInfo(lngSizeOfVersionInfo - -1)
        
        'バージョン情報を取得
        lRet = GetFileVersionInfo(strPath, 0, _
            lngSizeOfVersionInfo, bytDummyVersionInfo(0))
        
        'バージョン情報リソースのルートブロックを取得
        lRet = VerQueryValue(bytDummyVersionInfo(0), "\", _
            lngPointerVersionInfo, lnglLengthVersionInfo)
        
        '取得したルートブロックをバージョン情報の構造体へ移動
        MoveMemory udtVSFixedFileInfo, _
            ByVal lngPointerVersionInfo, Len(udtVSFixedFileInfo)
        
        With udtVSFixedFileInfo
            'ファイルバージョンを取り出し
            strFileVersion = _
                CStr((.dwFileVersionMS \ 2 ^ 16) And &HFFFF&) & "." & _
                CStr(.dwFileVersionMS And &HFFFF&) & "." & _
                CStr((.dwFileVersionLS \ 2 ^ 16) And &HFFFF&) & "." & _
                CStr(.dwFileVersionLS And &HFFFF&)
            
            '製品バージョンを取り出し
            strProductVersion = _
                CStr((.dwProductVersionMS \ 2 ^ 16) And &HFFFF&) & "." & _
                CStr(.dwProductVersionMS And &HFFFF&) & "." & _
                CStr((.dwProductVersionLS \ 2 ^ 16) And &HFFFF&) & "." & _
                CStr(.dwProductVersionLS And &HFFFF&)
                
            strVersion = CStr((.dwProductVersionMS \ 2 ^ 16) And &HFFFF&)
            
        End With
        
        '確認用
    '    Debug.Print "strFileVersion   =" & strFileVersion
    '    Debug.Print "strProductVersion=" & strProductVersion
        
        Get_Adobe_App_Info_nnn2 = True
        Exit Function
        
    Err_Get_Adobe_App_Info_nnn2:
        strMsg = "Run Time Error" & vbCrLf & Err.Number & _
            vbCrLf & Err.Description
        Get_Adobe_App_Info_nnn2 = False
    End Function

    '*********************************************************
    '
    ' レジストリから値を取得する
    '
    ' Get the value from the registry.
    '
    ' Create  : 2014/03/22
    ' Update  :
    ' Vertion : 1.0.0
    '
    ' 引数1   : lRootKey As Long (IN)
    '           ルートキーの値
    ' 引数2   : strSubKey As String (IN)
    '           サブキーの値
    ' 引数3   : strValueName As String (IN)
    '           取得する値の名前
    ' 引数4   : strType As String (OUT)
    '           取得する値のタイプ
    '           "REG_DWORD","REG_SZ","REG_BINARY"
    ' 引数5   : strMsg As String (OUT)
    '           エラーメッセージ
    ' 引数6   : vaValue As Variant (OUT)
    '           レジストリから取得した値
    ' 引数7   : vDefaultValue As Variant (IN)
    '           オプション:未使用
    '
    ' 戻り値  : 0   エラー無し
    '           2   該当するサブキーが存在いしない
    '           上記以外 その他のエラー
    '
    ' 備考    :
    '
    ' URL     : http://pdf-file.nnn2.com/?p=786
    '
    ' その他  : 著作権等は主張しません。
    '           上記URLにコメントを頂けると嬉しいです。
    '
    ' 参照URL : 基本部分を参考にしました
    ' http://www.devx.com/vb2themax/Tip/19134
    '
    ' Windows API memo:
    ' RegOpenKeyEx
    '  指定されたレジストリキーを開きます
    '  http://msdn.microsoft.com/ja-jp/library/cc429950.aspx
    ' RegQueryValueEx
    '  指定されたレジストリキーに所属している、指定された
    '  レジストリエントリのデータ型とデータを取得します。
    '  http://msdn.microsoft.com/ja-jp/library/cc429931.aspx
    ' CopyMemory
    '  指定されたメモリブロックの内容を、他の場所へコピー
    '  http://msdn.microsoft.com/ja-jp/library/cc430033.aspx
    ' RegCloseKey
    '  指定されたレジストリキーのハンドルを閉じます
    '  http://msdn.microsoft.com/ja-jp/library/cc429930.aspx
    '
    '*********************************************************

    Function GetRegistryValue( _
        ByVal lRooKey As Long, _
        ByVal strSubKey As String, _
        ByVal strValueName As String, _
        ByRef strType As String, _
        ByRef strMsg As String, _
        ByRef vaValue As Variant, _
        Optional vDefaultValue As Variant) As Long
        
        Dim lRet            As Long     '戻り値
        Dim lhandle         As Long
        Dim lResLong        As Long
        Dim strResString    As String
        Dim btResBinary()   As Byte
        Dim length          As Long     '長さ
        Dim lRetVal         As Long
        Dim lValueType      As Long     'レジストリ格納タイプ
        
        GetRegistryValue = 0
        vaValue = ""
        
        ' Prepare the default result
        vaValue = IIf(IsMissing(vDefaultValue), Empty, vDefaultValue)
        
        ' Open the key, exit if not found.
        'レジストリのサブキーのオープン(読み込みのみ)
        lRet = RegOpenKeyEx(lRooKey, strSubKey, 0, KEY_READ, lhandle)
        If lRet = 2 Then
            '該当サブキーは存在しない
            GetRegistryValue = lRet
            strMsg = "該当サブキーは存在しない"
            Exit Function
        ElseIf lRet <> ERROR_SUCCESS Then
            GetRegistryValue = lRet
            strMsg = "RegOpenKeyEx" & vbCrLf & "エラーコード : " & lRet
            MsgBox strMsg, vbOKOnly, "サブキーのオープン"
            Exit Function
        End If
        
        ' prepare a 1K receiving btResBinary
        length = 1024
        ReDim btResBinary(0 To length - 1) As Byte
        
        ' read the registry key
        lRetVal = RegQueryValueEx(lhandle, strValueName, 0, lValueType, _
            btResBinary(0), length)
        ' if btResBinary was too small, try again
        If lRetVal = ERROR_MORE_DATA Then
            ' enlarge the btResBinary, and read the value again
            ReDim btResBinary(0 To length - 1) As Byte
            lRetVal = RegQueryValueEx(lhandle, strValueName, 0, _
                lValueType, btResBinary(0), length)
        End If
        
        ' return a value corresponding to the value type
        Select Case lValueType
            Case REG_DWORD
                CopyMemory lResLong, btResBinary(0), 4
                vaValue = lResLong
                strType = "REG_DWORD"
    '            Debug.Print strValueName & " (REG_DWORD) " & vaValue
            Case REG_SZ, REG_EXPAND_SZ
                ' copy everything but the trailing null char
                strResString = Space$(length - 1)
                CopyMemory ByVal strResString, btResBinary(0), length - 1
                vaValue = strResString
                strType = "REG_SZ,REG_EXPAND_SZ"
    '            Debug.Print _
    '                strValueName & " (REG_SZ,REG_EXPAND_SZ) '" & vaValue & "'"
            Case REG_BINARY
                ' resize the result btResBinary
                If length <> UBound(btResBinary) + 1 Then
                    ReDim Preserve btResBinary(0 To length - 1) As Byte
                End If
                vaValue = btResBinary()
                strType = "REG_BINARY"
    '            Debug.Print strValueName & " (REG_BINARY) " & length
            Case REG_MULTI_SZ
                ' copy everything but the 2 trailing null chars
                strResString = Space$(length - 2)
                CopyMemory ByVal strResString, btResBinary(0), length - 2
                vaValue = strResString
                strType = "REG_MULTI_SZ"
    '            Debug.Print strValueName & " (REG_MULTI_SZ) "
            Case Else
                GetRegistryValue = 99
                strType = ""
                RegCloseKey lhandle
                Err.Raise 1001, , "Unsupported value type"
        End Select
        
        ' close the registry key
        RegCloseKey lhandle
        
    End Function

        
    ※ソースコードHTML変換:SourceConverter

     

    サンプル一覧

     


     

    管理人用のメモ

      

    これ以降はサイト管理人のメモです。

    見なくても結構です。

     

    残された課題

    1. タイムアウトになった後に不要になった画面を強制的に閉じるてるつもりです。
      それでも残ってしまう、のは・・・。
      メモリ上にAcrobatアプリが残ったままになってしまう。
      特に E22 エラー の強制処理が効いてない場合がある。
          

     

    サンプル一覧

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    CAPTCHA


    出来るだけ早く返答する様には心がけています。
    が、遅くなる時もありますのでご了承ください。


    SAMURAI Plugin

    コメントをする時は最低でも以下をお願いします。

    • OS名 バージョン
    • Acrobat バージョン
    • ツール(Excel等) バージョン