SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

VB テクニック編13 - バッチ実行、EXE バッチ実行、関連付け実行、文字列置換

■SAK 関数利用規程

  ・テクニック編で紹介する関数は、私こと Y.SAK の開発関数である。
  ・著作権明示部分の改編は認めない。
  ・個人、企業がこれらの関数を使用したり、一部を使用して新たなシステムや
    プログラムを開発することは自由です。
  ・但し、これらの関数を一部でも使用しているソフトウェアをシェアウェア、
    その他有償プロダクトとして配布・販売するには、私の許可が必要です。
    (無償のフリーソフトウェアなら、自由に配布しても良い。)
  ・これらの関数を使用して発生した、いかなる形での損害も私こと Y.SAK は
    賠償しません。

■バッチの実行(バッチ処理)

  ・通常のバッチファイル(.bat) を VB から実行するには、次のようにする。
    (バッチファイル起動、バッチファイル実行)

  on local error resume next
  shell "g:\tmp\test.bat", 1
  on local error goto 0

■EXE のバッチ実行(他のアプリケーションバッチ処理)

  ・VB の exe に限らないが、exe ファイルをパッチ実行するには、終了待ち合
    わせが必要である。
    次の例では、電卓を起動し、電卓が終了するのを待ち合わせる。
    そして、電卓がクローズすると、メモ帳を起動し終了を待つ。
    メモ帳がクローズすると、完了メッセージを表示する。

  ・Excel、Word のオブジェクトを使用する場合は、
    VB テクニック編8 - Excel 起動、Word 起動、メール送信、メール受信
    を参照下さい。

  ・自分で作成したプログラムであれば、特定の実行パラメタが与えられたとき、
    処理完了後に自動終了するようなロジックにしておけばよい。
    また処理エラーなどをチェックするなら、ステータスファイルに処理結果を
    記録するなどして処理する。
    但し、マルチユーザが多重で実行する可能性のあるシステムでは、ステータ
    スファイルがシステム固定にならない仕組みが必要である。

  ・この待ち合わせサンプル関数 CallPgm() では、AppActivate hinst で待ち
    合わせているが、Windows API の FindWindow() で待ち合わせるのも手であ
    る。どちらにも長所と短所がある。
    確実な待ち合わせは C 言語で、サブクラスやフックで WM_CLOSE を処理す
    る方が良い。ただ、現実的には、このサンプルの方法で実用にはなる。

  if CallPgm("calc.exe") = false then msgbox "calc 起動失敗"
  if CallPgm("notepad.exe") = false then msgbox "notepad 起動失敗"
  msgbox "バッチ起動終了"

Public Function CallPgm(pgm as string) as boolean

  dim hinst as long

  CallPgm = false

  On Local Error Resume Next
  hinst = Shell(pgm, 1)
  DoEvents
  If Err <> 0 then exit function
  Do
    AppActivate hinst
    DoEvents
    If Err <> 0 Then Exit Do
  Loop
  On Local Error GoTo 0

  CallPgm = true

end Function

■関連付け実行

  ・拡張子による関連付け起動を行うには、次のようにする。
    初期ディレクトリを指定する必要がある場合は、一般的にはファイルパスと
    同じものを指定すれば良い。(次の例では、g:\tmp\ となる。)
    通常は省略しても実行できるものが多い。
    また、初期ディレクトリにオープンや保存先のディレクトリとして、g:\wrk\
    などと指定しておくと、オープンダイアログの初期表示がその場所になる。
    (但し、Excel などはソフト固有の機能で初期ディレクトリが切り替わる。)

  const SW_HIDE            = 0
  const SW_SHOWNORMAL      = 1
  const SW_NORMAL          = 1
  const SW_SHOWMINIMIZED   = 2
  const SW_SHOWMAXIMIZED   = 3
  const SW_MAXIMIZE        = 3
  const SW_SHOWNOACTIVATE  = 4
  const SW_SHOW            = 5
  const SW_MINIMIZE        = 6
  const SW_SHOWMINNOACTIVE = 7
  const SW_SHOWNA          = 8
  const SW_RESTORE         = 9

  if ShellExecute(HWND, "Open", "g:\tmp\abc001.wav", "", "", SW_SHOWNORMAL) < 32 then
                       '|       |                    |   |   |_ ウィンドウ表示スタイル
                       '|       |                    |   |_ 初期ディレクトリ
                       '|       |                    |_ パラメタ
                       '|       |_ パスファイル名
                       '|_ オペレーション
    msgbox "return 値 < 32 は、エラー"
  end if

  Public Declare Function ShellExecuteA Lib "shell32" (ByVal hwd As Long, ByVal ope As String, ByVal file As String, ByVal para As String, ByVal cdir As String, ByVal show As Long) As Long
  Public Declare Function ShellExecuteW Lib "shell32" (ByVal hwd As Long, ByVal ope As String, ByVal file As String, ByVal para As String, ByVal cdir As String, ByVal show As Long) As Long

'=======================================================================
'  Windows API  ShellExecute()
'=======================================================================
Public Function ShellExecute(hwd As Long, ope As String, file As String, para As String, cdir As String, show As Long) As Long

  If GetOS() = VER_PLATFORM_WIN32_NT Then
    ShellExecute = ShellExecuteW(hwd, ope, file, para, cdir, show)
  Else
    ShellExecute = ShellExecuteA(hwd, ope, file, para, cdir, show)
  End If

End Function

■改行コードの削除(改行削除、改行消去)

  ・文字列に含まれる改行コード(CR/LF) を削除するには、次のようにする。

  msgbox DltCRLF("abc" & vbCrLf & "def" & vbCrLf & "ghi" & vbCrLf)

Public Function DltCRLF(s as string) as string

  dim a as string
  dim i as long

  a = s
  i = 1
  do
    i = instr(i, a, vbCrLf)
    if i > 0 then a = left(a, i - 1) & right(a, len(a) - i - 1)
  loop until i = 0

  DltCRLF = a

end Function

■改行コードの置換(改行置換)

  ・文字列に含まれる改行コード(CR/LF) を置換するには、次のようにする。

'** CR/LF を半角空白に置換する。
  msgbox RepCRLF("abc" & vbCrLf & "def" & vbCrLf & "ghi" & vbCrLf, " ")

'** CR/LF を「-」に置換する。
  msgbox RepCRLF("abc" & vbCrLf & "def" & vbCrLf & "ghi" & vbCrLf, "-")

'** CR/LF を "" に置換、つまり、改行コードの削除と同じになる。
  msgbox RepCRLF("abc" & vbCrLf & "def" & vbCrLf & "ghi" & vbCrLf, "")

Public Function RepCRLF(s as string, rep as string) as string

  dim a as string
  dim i as long
  dim j as long

  a = s
  j = len(rep)
  i = 1 - j
  do
    i = instr(i + j, a, vbCrLf)
    if i > 0 then a = left(a, i - 1) & rep & right(a, len(a) - i - 1)
  loop until i = 0

  RepCRLF = a

end Function

■任意文字列の置換

  ・文字列に含まれる任意文字列を置換するには、次のようにする。
    この RepStr() は、オールマイティである。
    (文字列削除、文字削除、文字置き換え、文字置換)

'** 「ab」を「-」に置換する。
  msgbox RepStr("abcdefabgabh", "ab", "-")

'** CR/LF を「-」に置換する。
  msgbox RepStr("abc" & vbCrLf & "def" & vbCrLf & "ghi" & vbCrLf, vbCrLf, "-")

'** CR/LF を "" に置換、つまり、改行コードの削除と同じになる。
'   (指定文字を取り除く)
  msgbox RepStr("abc" & vbCrLf & "def" & vbCrLf & "ghi" & vbCrLf, vbCrLf, "")

'** 空白 " " を "" に置換、つまり、空白の削除と同じになる。
'   (文字列空白削除、空白文字削除)
  msgbox RepStr(" ab  c ", " ", "")

Public Function RepStr(s as string, org as string, rep as string) as string

  dim a as string
  dim i as long
  dim j as long
  dim k as long

  a = s
  k = len(org) - 1
  j = len(rep)
  i = 1 - j
  do
    i = instr(i + j, a, org)
    if i > 0 then a = left(a, i - 1) & rep & right(a, len(a) - i - k)
  loop until i = 0

  RepStr = a

end Function

■VB テクニック編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2017 Y.SAK