starzware

ITスキル

VBScript

TIPS
If

If( xxx )Then
ElseIf( xxx )Then
Else
End If
For

For idx = 0 To 5 Step 1
Next
For Each tmp_value In value_array
  Exit For
Next
While

'+-- Do While 〜 Loop
Do While( xxx )
  Exit Do
Loop
'+-- While 〜 Wend
While
Wend
'+-- Do 〜 Loop While
Do
Loop While
文字列表示

'+-- 文字列表示
WScript.Echo "Hello World"
スクリプトの終了

WScript.Quit
配列要素を追加

Dim a() '要素を指定しない
Redim a(3)
a = Array(4, 5, 6)
WScript.Echo UBound(a) 'サイズ=3
Redim Preserve a(10) 'Preserveで中身を消さない
組込み関数
関数 意味
IsDate 日付かどうか
IsNumeric 数値かどうか
IsEmpty 空かどうか
IsNull NULLかどうか
IsArray 配列かどうか
起動時の引数

WScript.Arguments.Item(0) '第1引数
WScript.Arguments.Item(1) '第2引数
WScript.Arguments.Count '引数の数
WScript.Arguments.Named.Exists("a") '"/a"が指定されているか
文字列

'+-- ”abcd"に”x”が含まれているか?
If(InStr("abcd", "x") = 0)Then WScript.Echo "含まれていません"
日付

DateAdd("yyyy", -4, Now)  '4年前を取得
DateAdd("ww", -4, Now)    '4週前を取得
DateAdd("d", -4, Now)     '4日前を取得
[Excel]各操作

Set excel = CreateObject("Excel.Application")
Set book  = excel.Workbooks.Open(excelfile)
Set book  = excel.Workbooks.Add '新規ブック
Set sheet = book.Sheets("Sheet1")
Set sheet = book.Sheets.Add '新規シート
Set sheet = book.Sheets.Add(, book.Sheets(book.Sheets.Count)) '新規シート:最後尾に追加
Set sheet = book.Sheets.Add(book.Sheets(1)) '新規シート:先頭に追加
'+-- セル値
sheet.Range("A1").Value = "値" '値を設定
a = sheet.Range("A1").Value   '値を取得
sheet.Range("A1").NumberFormatLocal = "@" 'セル書式を"文字列"にする
sheet.Cells(1,2).Value = "値" '値を設定(行列番号指定)
sheet.Range("A1").Interior.Color = vbRed '背景色を設定
sheet.Range("A1").Interior.ColorIndex = 24 '背景色を設定(ColorIndex指定)
sheet.Range("A1").Font.Color = vbBlue '文字色を設定
'+-- シート全体
sheet.Cells.NumberFormatLocal = "@" 'セル書式を"文字列"にする
sheet.Cells.Interior.Color = vbWhite '背景色を設定
'+-- セル操作
sheet.Range("B1:D1").Merge 'セル結合
sheet.Range("E:E").EntireColumn.AutoFit 'セルの自動調整
'+-- 罫線
With sheet.Range("B2:D2")
  .Borders(7).LineStyle = 1  '7:xlEdgeLeft,        1:xlContinuous
  .Borders(8).LineStyle = 1  '8:xlEdgeTop,         1:xlContinuous
  .Borders(9).LineStyle = 1  '9:xlEdgeBottom,      1:xlContinuous
  .Borders(10).LineStyle = 1 '10:xlEdgeRight,      1:xlContinuous
  .Borders(11).LineStyle = 1 '11:xlEdgeVertical,   1:xlContinuous
  .Borders(12).LineStyle = 1 '12:xlEdgeHorizontal, 1:xlContinuous
  .Borders(7).Weight = 2     '7:xlEdgeLeft,        2:xlThin
  .Borders(8).Weight = 2     '8:xlEdgeTop,         2:xlThin
  .Borders(9).Weight = 2     '9:xlEdgeBottom,      2:xlThin
  .Borders(10).Weight = 2    '10:xlEdgeRight,      2:xlThin
  .Borders(11).Weight = 2    '11:xlEdgeVertical,   2:xlThin
  .Borders(12).Weight = 2    '12:xlEdgeHorizontal, 2:xlThin
End With
'+-- オートシェイプ
sheet.Shapes("テキスト ボックス 1").TextEffect.Text = "値" '値を設定
'+-- ヘッダー/フッダー
sheet.PageSetup.LeftHeader   = "左ヘッダー"
sheet.PageSetup.CenterHeader = "中央ヘッダー"
sheet.PageSetup.RightHeader  = "右ヘッダー"
sheet.PageSetup.LeftFooter   = "左フッダー"
sheet.PageSetup.CenterFooter = "中央フッダー"
sheet.PageSetup.RightFooter  = "右フッダー"
'+-- 余白
sheet.PageSetup.LeftMargin   = 1.0
sheet.PageSetup.CenterMargin = 1.0
sheet.PageSetup.RightMargin  = 1.0
'+-- シートでループ
For Each sheet In book.Sheets
    WScript.Echo sheet.Name 'シート名を表示S
Next
'+-- シートでループ
For Each sheet In book.Sheets
  v = sheet.Cells(1,1).Value
Next
'+-- シートでループ(逆ループ)
For sheetIdx = book.Sheets.Count -1 To 1 Step -1
  'sheet.Delete 'シートを削除
Next
'+-- オートシェイプでループ
For Each shape In sheet.Shapes
  If(shape.type = 17)Then
      '17:msoTextBox テキストあり
      '6:msoGroup For Each shape2 In shape.TextFrame.Charactors.Texe
      '9:msoLine テキストなし
      '1:msoAutoShape 不明 If(shape.TextFrame2.HasText <> 0)Thenで判断
      WScript.Echo shape.TextEffect.Text
  End If
Next
'+-- 保存
book.Save
'+-- ブックを保存する
book.SaveAs pFilename
'+-- ブックを閉じる
book.Close
'+-- ブックを閉じる(保存確認なし)
book.Close False
'+-- 終了
excel.Quit
Set book = Nothing
Set excel = Nothing
[Excel]A1セルに移動

Set excel = CreateObject("Excel.Application")
Set book  = excel.Workbooks.Open(excelfile)
Set sheet = book.Sheets("Sheet1")
sheet.Active
sheet.Range("A1").Select
ファイル操作

Set FSO = CreateObject("Scripting.FileSystemObject")
'+-- ファイル情報
textfile = "C:¥script¥vbscript¥testfile.txt"
FSO.GetFileName(textfile) 'testfile.txt
FSO.GetBaseName(textfile) 'testfile
FSO.GetExtensionName(textfile) 'txt
FSO.GetParentFolderName(textfile) 'C:¥script¥vbscript
FSO.GetAbsolutePathName(textfile) 'C:¥script¥vbscript¥testfile.txt
'+-- スペシャルフォルダの取得
FSO.GetSpecialFolder(0) 'Windows Folder
FSO.GetSpecialFolder(1) 'System Folder
FSO.GetSpecialFolder(2) 'Temporary Folder
'+-- ファイル/フォルダの操作
FSO.DeleteFile srcFile 'ファイル削除
FSO.CopyFile srcFile, distFile 'ファイルコピー
FSO.MoveFile srcFile, distFile 'ファイル移動
FSO.CopyFolder srcFolder, distFolder 'フォルダコピー
FSO.CreateFolder("C:¥Folder1") 'フォルダ作成
If(FSO.FolderExists(folder))Then WScript.Echo "フォルダです"
'+-- ファイル情報2
Set thisFile = FSO.GetFile(file)
thisFile.DateCreated '作成時刻
thisFile.DateLastModified '最終更新時刻
thisFile.DateLastAccessed '最終アクセス時刻
カレントフォルダを取得

Set FSO = CreateObject("Scripting.FileSystemObject")
CURRENT_FOLDER = FSO.GetParentFolderName(WScript.ScriptFullName)
デスクトップフォルダを取得

Set oShell = CreateObject("WScript.Shell")
DESKTOP_FOLDER = oShell.SpecialFolders("desktop")
テキストファイルを読み込むために開く

Set FSO = CreateObject("Scripting.FileSystemObject")
'+-- テキストファイルを読み込むために開く
Set objFile = FSO.openTextFile(pFilename)
Do While Not objFile.AtEndOfStream
    buffer = objFile.ReadLine
Loop
objFile.Close
Set objFile = Nothing
テキストファイルを読み込むために開く(一気に読み込む場合)

Set FSO = CreateObject("Scripting.FileSystemObject")
'+-- テキストファイルを読み込むために開く
Set objFile = FSO.openTextFile(pFilename)
textall = objFile.ReadAll
objFile.Close
Set objFile = Nothing
テキストファイルを書き込むために開く

Set FSO = CreateObject("Scripting.FileSystemObject")
'+-- テキストファイルを書き込むために開く
Set textFile = FSO.openTextFile(pFilename, 2, True) '1:Read, 2:Write, 8:Append
textFile.WriteLine "Anything"
textFile.Close
Set textFile = Nothing
コマンド実行

Set oShell = CreateObject("WScript.Shell")
oShell.Exec("cmd /c dir")
oShell.ExitCode
ネットワーク

Set net = CreateObject("WScript.Network")
WScript.Echo net.ComputerName
WScript.Echo net.UserDomain
WScript.Echo net.UserName
デスクトップフォルダを取得

Set hash = CreateObject("Scripting.Dictionary")
'+-- 追加
Call hash.Add("key1", "value1")
'+-- 有無と取得
If(hash.Exists("key1"))Then
  value = hash.Item("key1")
End If
IEを起動する

Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visible = True
oIE.Navigate2 "http://localhost/"
Set doc = oIE.Document
Set e1 = doc.getElementById("xxx") '単一
Set e2 = doc.getElementByName("xxx") 'これは配列に
'+-- テキスト
Set eText = doc.getElementById("xxx")
eText.Value = "値"
'+-- チェックボックス
Set eCheckBox = doc.getElementById("xxx")
eCheckBox.Checked = True
'+-- リンク
Set eLink = doc.getElementById("xxx")
eLink.click 'リンクをクリック
'+-- ボタン
Set eButton = doc.getElementById("xxx")
eButton.onClick 'ボタンをクリック

' --------------------------
' 表示されるまで待つ
' --------------------------
Sub WaitIE()
  Do While oIE.Busy
    WScript.Sleep 100
  Loop
End Sub
[関数]フォルダ探索

Set FSO = CreateObject("Scripting.FileSystemObject")
' --------------------------
' フォルダを再帰的に探索
' --------------------------
Sub DoSubFolder(pFolder)
  Set objFolder = FSO.GetFolder(pFolder)
  '+-- フォルダリスト
  For Each thisFolder In objFolder.SubFolders
    '+-- 再起呼び出し
    Call DoSubFolder(thisFolder)
  Next
  '+-- ファイルリスト
  For Each thisFile In objFolder.Files
    ext = LCase(FSO.GetExtensionName(thisFile))
    filename = FSO.GetBaseName(thisFile)
    'If(Left(filename,2) = "~$")Then
      'スルー(Excelのワークファイルのため)
    'ElseIf(ext = "xlsx" Or ext = "xls")Then
      Call execute(thisFile)
    'End If
  Next
End Sub
HTAで使えるコード

' --------------------------
' フォルダ選択
' --------------------------
Set oShell = CreateObject("WScript.Shell")
Function browseFolder()
  Set folder = oShell.browseForFoler(0, "フォルダ選択", 0)
  If(Not folder Is Nothing)Then
    Return folder.Items.Item.Path
  Else
    Return Nothing
  End If
End Function

' --------------------------
' 起動時に呼び出される関数
' --------------------------
Sub Window_OnLoad
End Sub
デフォルトプリンタの表示

Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer

'+-- Win7 64bitではとりあえず大丈夫だった。
Set printers = Service.ExecQuery("Select * From Win32_Printer Where Default='True'")

For Each printer In printers
	MsgBox printer.Caption
Next

Set printers = Nothing
Set Locator = Nothing
Set Service = Nothing
[Excel]画像を貼り付ける

Set FSO = CreateObject("Scripting.FileSystemObject")
Set excel = CreateObject("Excel.Application")
Set book  = excel.Workbooks.Open(excelfile)
Set sheet = book.Sheets("Sheet1")
sheet.Range("B" & idx).Select
image = "C:¥script¥test.jpg"
If FSO.FileExists(image) Then
  '+-- アクティブセルの左上を基準に画像を貼り付け
  sheet.Range("C5").Select
  sheet.Pictures.Insert image
End If
book.Save
book.Close
excel.Quit
[Excel]セル範囲内のシェイプを削除

Set FSO = CreateObject("Scripting.FileSystemObject")
Set excel = CreateObject("Excel.Application")
Set book  = excel.Workbooks.Open(excelfile)
Set sheet = book.Sheets("Sheet1")
'+--
Set myRange = sheet.Range("B2:D10")
For Each myShape In sheet.Shapes
  '+-- セル範囲(myRange)にオートシェイプが入っていれば削除
  If Not excel.Intersect(sheet.Range(myShape.TopLeftCell, myShape.BottmRightCell), myRange) Is Nothing Then
    myShape.Delete
  End If
Next
book.Save
book.Close
excel.Quit
[関数]イベントログ

Set oShell = CreateObject("WScript.Shell")
' --------------------------
' フォルダを再起的に探索
'  0:成功,1:失敗,2:警告,4:情報
' --------------------------
Sub WriteEventLog(pType, pMessage)
  Call oShell.LogEvent(pType, pMessage)
End Sub
[Access]MDBのカタログ情報を表示

Set conn    = CreateObject("adodb.connection")
Set catalog = CreateObject("adox.catalog")

'+-- MDBファイルにOLEDBドライバで接続する
With conn
 .Provider = "Microsoft.Jet.OLEDB.4.0"
 .ConnectionString = "C:¥script¥abcde.mdb"
 .Open
End With

'+-- カタログにDBへ接続中のオブジェクトを設定
catalog.ActiveConnection = conn

'+-- テーブルのループ
For Each table In catalog.Tables

  If table.Type = "TABLE" Then 'TABLE/VIEW/LINK/ACCESS TABLE/SYSTEM TABLE/PASS-THROUGH/
    WScript.Echo "=== TABLE === " & table.Name
    For each column in table.Columns
      WScript.Echo "--- Field ---"
      'column.name 'フィールド名
      'column.type 'データ型を数字で表す
      WScript.Echo column.name & ":" & column.type

      WScript.Echo "--- Properties ---"
      For Each obj in column.Properties
        'obj.Name   'フィールドのプロパティ名
        'obj.Value  '現在の設定
        WScript.Echo obj.Name & ":" & obj.Value
      Next
    Next 'column
  End If 'table
Next 'table

Set column = Nothing
Set table = Nothing
Set catalog = Nothing
Set conn = Nothing
XMLファイルか

Set oDOM = CreateObject("MSXML2.DomDocument")
oDOM.ansync = False
ret = oDOM.Load(file)
If ret Then WScript.Echo "XMLファイルです"
フォルダ作成(階層)

' --------------------------
' フォルダ作成
' --------------------------
Sub CreateFolder(pFolder)
  parentFolder = FSO.GetParentFolderName(pFolder)
  If Not FSO.FolderExists(parentFolder) Then
    CreateFolder(parentFolder)
  End If

  If Not FSO.FolderExists(pFolder)Then
    FSO.CreateFolder(pFolder)
  End If
End Sub
[Excel][関数]オートシェイプからテキストを取得(エラー対応)

' --------------------------
' オートシェイプからテキスト取得
' @param pSheet シートオプジェクト
' @param pShapeName オートシェイプにつけられた名称
' @return String 取得したテキスト(エラー時は空文字)
' --------------------------
Function GetShapeText(pSheet, pShapeName)
On Error Resume Next
  pValue = ""
  pValue = pSheet.Shapes(pShapeName).TextEffect.Text
  GetShapeText = pValue
End Function
FileSystemObjectを参照設定する(Excel)
[参照設定]で [Microsoft Scripting Runtime]を参照する
正規表現で文字列の一部を取得

Set REG = CreateObject("VBScript.RegExp")
REG.pattern = "^¥d(_d{1,2})*" '[9_9_9]/[9_99_99]/[9_9_9_9]...
REG.IgnoreCase = False

str = "1_1_11_あげほげ.xlsx"
Set match = REG.execute(str)
For Each m In match
  WScript.Echo m.Value 'ヒットした部分が取得できる 1_1_11
Next
ヘッダーフッターの設定(VBScript)

[設定値]
&8 : フォントを8ptにする
&"フォント名" : 指定されたフォントに設定する
&A : シート名
&F : ファイル名
&P : ページ番号
改行 : CR(Chr(13), vbCr)
[設定例]
&"MS ゴシック,標準"&10&P -> フォント[MS ゴシック]10ptで"ページ番号"を印字する
[関数]改行コードを文字に置換

' --------------------------
' 改行コードを文字に置換
'   CRLF=%改行(CRLF)%, CR=%改行(CR)%, LF=%改行(LF)%
' @param pValue 文字列(改行コードあり)
' @return String 文字列(改行コードを文字に変換)
' --------------------------
Function ConvEnterCode2String(ByVal pValue)
  If(pValue = "")Then
    ConvEnterCode2String = ""
  ElseIf(InStr(pValue, vbCrLf) > 0)Then
    ConvEnterCode2String = Replace(pValue, vbCrLf, "%改行(CRLF)%")
  ElseIf(InStr(pValue, vbCr) > 0)Then
    ConvEnterCode2String = Replace(pValue, vbCr, "%改行(CR)%")
  ElseIf(InStr(pValue, vbLf) > 0)Then
    ConvEnterCode2String = Replace(pValue, vbLf, "%改行(LF)%")
  Else
    ConvEnterCode2String = pValue
  End If
End Function
ADOでOracleに接続する

Set conn = CreateObject("ADODB.Connection")
'+-- Oracle ODBCプロバイダ
connectionString = "Driver={Oracle in OraDB12Home1};" _
                 & "DBQ=host:port/SID;" _
                 & "UID=xxx;" _
                 & "PWD=xxx;"
conn.Open(connectionString)
SQL = "SELECT SYSDATE FROM DUAL;"
Set rs = conn.Execute(SQL)

'文字化けする場合は以下で環境変数NLS_LANGを適切に設定する
'Set oShell = CreateObject("WScript.Shell")
'Set env = oShell.Environment("USER")
'env.Item("NLS_LANG") = "Japanese_Japan.UTF8"
'env.Item("NLS_LANG") = "Japanese_Japan.JA16SJIS"
'env.Item("NLS_LANG") = "Japanese_Japan.JA16SJISTILDE"
'env.Item("NLS_LANG") = "Japanese_Japan.JA16EUC"
'env.Item("NLS_LANG") = "Japanese_Japan.JA16EUCTILDE"

'+-- カラム名
For columnIdx = 0 To rs.Fields.Count -1
  rs(columnIdx).Name
Next

'+-- データを取得
Do Until rs.Eof
  For columnIdx = 0 To rs.Fields.Count -1
    rs(columnIdx).Value
  Next
  rs.MoveNext
Loop

rs.Close
Set rs = Nothing

conn.Close
Set conn = Nothing
[Excel][関数]列番号から列英字に変換(Excel関数未使用)

Function ConvComlumnNumber2Alpha(ByVal pColNumber)
   a = pColNumber
   work = ""
   Do While pColNumber > 0
      a = Int((pColNumber - 1) / 26)
      b = (pColNumber - 1) Mod 26
      work = Chr(b + 65) & work
      pColNumber = a
   Loop
   ConvComlumnNumber2Alpha = work
End Function
[文字列]括弧の前後を取得する

str = "aa bb cc ( dd, ee, ff) ggg"
idx1 = InStr(str, "(")
idx2 = InStr(str, ")")

'結果
str1 = Left(str, idx1-1) '[aa bb cc ]
str2 = Mid(str, idx1+1, idx2-idx1-1)) '[ dd, ee, ff]
str3 = Mid(str, idx2+1) '[ ggg]
[Excel]シート名

  Set excel = CreateObject("Excel.Application")
  Set book  = excel.Workbooks.Open(excelfile)
  '+-- シートでループ
  For Each sheet In book.Worksheets
    sheetname = sheet.Name
  Next
  book.Close False
  excel.Quit
httpでページ内容を取得

url = "xxxxx"
'Set objHttp = CreateObject("MSXML2.XMLHTTP") ' TLS1.2に非対応
Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")

Call objHttp.Open("GET", url, False)
objHttp.Send

Do While objHttp.ReadyState < 4
    DoEvents
Loop

If Not objHttp.Status = 200 Then
  'Error
  WScript.Quit
End If

'text = objHttp.responseText 'Shift_JIS(MS932)用
text = StrConv(objHttp.responseBody, vbUnicode)

Set objHttp = Nothing
[関数]タイムスタンプ文字列を返す

Function GetTimeStampString
	GetTimeStampString = Replace(Replace(Replace(Now, "/",""),":","")," ","")
End Function
基本ルーチン

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
CURRENT_FOLDER = FSO.GetParentFolderName(WScript.ScriptFullName)
DESKTOP_FOLDER = oShell.SpecialFolders("desktop")

'実行部
Sub Execute(ByVal pFile)
  Call Process
End Sub

'処理部
Sub Process()
End Sub

Function GetTimeStampString
	GetTimeStampString = Replace(Replace(Replace(Now, "/",""),":","")," ","")
End Function

'メイン
Sub Main
On Error Resume Next
	
	'+-- 引数チェック
	If WScript.Arguments.Count > 0 Then
    WScript.Echo "引数がありません"
    WScript.Quit
  Else
    param1 = WScript.Arguments.Item(0)
  End If
	
	'+-- フォルダorファイル
	If Not FSO.FileExists(param1) Then
    Call DoSubFolder(param1)
	ElseIf Not FSO.FileExists(param1) Then
  	Call Execute(param1)
	End If

End Sub

Call Main()
WScript.Quit
[Excel]指定の名称と同じシート名があるかどうか

Function IsDuplicateSheetName(ByVal pSheetName, ByRef pBook)
	
	For Each sheet In pBook.Sheets
		If pSheetName = sheet.Name Then
			IsDuplicateSheetName = True
			Exit Function
		End If
	Next
	
	IsDuplicateSheetName = False
	
End Function
ZeroPadding

Function ZeroPadding(ByVal pValue, ByVal pDigit)
  ZeroPadding = Right(String(pDigit, "0") & pValue, pDigit)
End Function
Popup

Set oShell = WScript.CreateObject("WScript.Shell")
'Popup("メッセージ",秒,"タイトル",ボタン)
'[ボタン]vbOKOnly/vbOKCancel/vbAbortRetryIgnore/vbYesNoCancel/vbYesNo/vbRetryCancel
'[アイコン]なし/vbCritical/vbQuestion/vbExclamation/vbInformation
'[フォーカス]vbDefaultButton1/vbDefaultButton2/vbDefaultButton3
'[戻り値]vbOK/vbCancel/vbAbort/vbRetry/vbIgnore/vbYes/vbNo/時間切れ(-1)
timeout = 5
notimeout = 0
ret = oShell.Popup("中止する場合は「キャンセル」を押してください。", timeout, "処理を実行しますか?", vbOKCancel+vbQuestion)

Select Case ret
Case vbOK
  oShell.Popup "実行しました。(これは自動的に閉じません)", notimeout,, vbInformation
Case vbCancel
  oShell.Popup "キャンセルしました。", timeout,, vbInformation
Case -1
  oShell.Popup "自動的に実行しました。", timeout,, vbInformation
End Select
VBScriptのeval

b = 1
c = 2
a = "b + c"
Execute "MsgBox " & a '3
VBScriptのinclude

Set FSO = CreateObject("Scripting.FileSystemObject")
Private Sub Include(ByVal pFileName)
  inc = FSO.OpenTextFile(pFileName, 1, False).ReadAll()
  Execute inc
End Sub
GetStandardStream

Const StdIn = 0
Const StdOut = 1
Const StdErr = 2
Dim isUnicode As Boolean = True //Optional False=ASCII Default:False
Set textStream = FSO.GetStandardStream(StdOut, isUnicode)