VBScript初級

VBSの初心者です。簡単にまとめていきたいと思います。

VBS ドラッグ&ドロップでファイル名を取得。引数としてファイル名を取得。ドラッグアンドドロップ

今回はドラッグ&ドロップでファイルを引数として読み込んで、ファイルのファイル名を取得します。

ドラッグアンドドロップしたものをうけとるには

 

WScript.Aruguments(0)

 

を使用します。0の箇所は0始まりで何番目かの引数を表します。

以下に使用例と詳細について記載します。



WScript.echo WScript.Arguments(0) 'フルパス

Set fso=CreateObject("Scripting.FileSystemObject") 'FileSystemObjectのインスタンスの作成

WScript.echo fso.getFileName(WScript.Arguments(0)) 'ファイル名のみ

VBSの引数はWScriptオブジェクトのArgumentsプロパティに保持されます。

WScript.Argumentsプロパティからは、WshArgumentsコレクションを参照できます。(下図参照)

 

f:id:chacha07:20200202081559g:plain

詳細

第4回 WScriptオブジェクトの詳細(2) (2/4):Windows管理者のためのWindows Script Host入門 - @IT

今回はitemプロパティを使用しています。実際はWScript.Arguments.Item(0)ですがitemを省略しています。

カッコ内の0は第何引数かを表し、0が一つ目の引数を表します。0始まりなので気を付けましょう。

 

フルパス取得の場合はWScript.Arguments(0)で取得できます。

 

ファイル名のみ必要な場合はFileSystemObjectオブジェクトのGetFileNameメソッドを使用します。

 

VBS 空白ではないセルを数える "長さ0の文字列"を除く Excel関数をVBSで使用

今回は選択範囲内の空白ではないセルの数を数えます。

ネットで検索するとCOUNTIFやCOUNTAを使用した数え方が出てきますが、この方法では"長さ0の文字列"を数えてします。

 

今回は列を選択してその範囲内の空白でないセルを数えてみたいと思います。

 

つまり、実際にデータの入っているセルだけを数えるということです。 

 

使うのはExcelの機能であるCOUNTBLANK関数とRows.Countプロパティです。

 

CONTBLANK関数は"長さ0の文字列"を含む空白の数を数えます。

Excel関数をVBSで呼び出す場合はApplicationオブジェクトのWorksheetFunctionプロパティを使用します。

 

Rows.Countプロパティではシートの最大行を数えます。

32bit版エクセル97以降では、65,536行
Excel2007以降では、1,048,576行

です。

 

この二つの値の差で空白でないセルを数えます。

 

今回の例では2列目に入力されているセルの数を出力します。

 

ちなみに、セルB16には"長さ0の文字列"が入っています。

 

 

'Excelのインスタンスの生成
Set  iobj= WScript.CreateObject("Excel.Application")

'Excelウィンドの非表示
iobj.Visible = false

'ワークブックを開く、WScript.Arguments(0)は第一引数
iobj.Workbooks.Open(WScript.Arguments(0))

'ワークシートへの参照をオブジェクト変数inpに格納
Set inp=iobj.Sheets(1)

'ExcelのCOUNTBLANK関数を使用し、空白の数を数える 選択範囲は2列目
blankcells=iobj.WorkSheetFunction.CountBlank(inp.columns(2))

'最大行を取得
maxrows=inp.Rows.count

'空白でないセルの算出
acells=maxrows-blankcells

'出力
wscript.echo acells

'Excelの終了
iobj.quit

'オブジェクト変数の解放
set inp=nothing

'Excelのインスタンスの解放
set iobj=nothing

今回実行するのに使ったExcel

f:id:chacha07:20190601135031p:plain

 

ExcelファイルをVBSファイルにドラッグ&ドロップすると実行

 

f:id:chacha07:20190601135331p:plain

VBS Excel シートの削除 アラート ( 警告 )の停止

 

今回はExcelシートの削除をしたいと思います。 

スクリプトの流れとしては、「シートの1」、「削除するシート」という名前の2つのシートを作成

その後、それぞれのシートのA1セルに「シートの1」は「helloworld」、「削除するシート」は「del」と入力

最後に「削除するシート」を削除します。

削除に使用しているのは↓の一行だけです。

 

obj.Worksheets("削除するシート名").Delete

 

'Excelのインスタンスの生成
Set obj=WScript.CreateObject("Excel.Application")

'Excelウィンドの表示、Falseにすれば画面にはなにも表示されない
obj.Visible=True



'設定されている起動時に作成されるシート数
temp = obj.SheetsInNewWorkbook

'起動時に作成されるシート数を2個に変更
obj.SheetsInNewWorkbook = 2

'ブックの新規作成
Set book=obj.Workbooks.add()

'起動時に作成されるシート数を元の状態に戻す
obj.SheetsInNewWorkbook=temp



'シートの名前の変更
obj.Sheets(1).name="シートの1"

'シートの名前の変更
obj.Sheets(2).name="削除するシート"

'ワークシートへの参照をオブジェクト変数fshtに格納
'このfshtをつかってシートを操作する
Set fshta=obj.Sheets(1)

Set fshtb=obj.Sheets(2)

'"シートの1"のA1セルにhelloworldと入力、Cells(行,列)
fshta.Cells(1,1)="helloworld"

'"削除するシート"のA1セルにdelと入力、Cells(行,列)
fshtb.Cells(1,1)="del"

'シートの削除
obj.Worksheets("削除するシート").Delete

'FileSystemObjectのインスタンスの作成
set fso = createObject("Scripting.FileSystemObject")

'カレントディレクトリの取得
cdir=fso.getParentFolderName(WScript.ScriptFullName)

'名前を付けて保存
book.SaveAs cdir & "\hello.xlsx" , 51

'Excelの終了
obj.Quit

'オブジェクト変数の解放、つまりメモリの解放
Set fshta=Nothing
Set fshtb=Nothing

'Excelのインスタンスの解放、これもメモリの解放
Set obj=Nothing

 

 

これだけでも削除はできますが、↓のようなアラートが出ます。

f:id:chacha07:20190502223328p:plain これを出ないようにするにはDisplayAlertsプロパティを使用します。

以下のように追加することでアラートが出なくなります。

obj.DisplayAlerts = False
obj.Worksheets("削除するシート").Delete
obj.DisplayAlerts = True

 

 

VBS Excel 名前を付けて保存 保存場所の指定

 

今回は前回作成したExcelを名前を付けて保存したいと思います。

前回の記事↓

VBS Excelブック作成時のシートの数の指定 - VBScript初級


'Excelのインスタンスの生成
Set obj=WScript.CreateObject("Excel.Application")

'Excelウィンドの表示、Falseにすれば画面にはなにも表示されない
obj.Visible=True



'設定されている起動時に作成されるシート数
temp = obj.SheetsInNewWorkbook

'起動時に作成されるシート数を1個に変更
obj.SheetsInNewWorkbook = 1

'ブックの新規作成
Set book=obj.Workbooks.add()

'起動時に作成されるシート数を元の状態に戻す
obj.SheetsInNewWorkbook=temp



'シートの名前の変更
obj.Sheets(1).name="シートの1"

'ワークシートへの参照をオブジェクト変数fshtに格納
'このfshtをつかってシートを操作する
Set fsht=obj.Sheets(1)

'"シートの1"のA1セルにhelloworldと入力、Cells(行,列)
fsht.Cells(1,1)="helloworld"

'FileSystemObjectのインスタンスの作成
set fso = createObject("Scripting.FileSystemObject")

'カレントディレクトリの取得
cdir=fso.getParentFolderName(WScript.ScriptFullName)

'名前を付けて保存
book.SaveAs cdir & "\hello.xlsx" , 51

'Excelの終了
obj.Quit

'オブジェクト変数の解放、つまりメモリの解放
Set fsht=Nothing

'Excelのインスタンスの解放、これもメモリの解放
Set obj=Nothing

 

 

 今回はカレントディレクトリをFileSystemObjectのgetParentFolderNameメソッドを使用して取得し、SaveAsメソッドで名前を付けて保存しました。

 

VBS Excelブック作成時のシートの数の指定

 今回は以前作成したExcelを開くだけのプログラムに

 

”ブックの新規作成時に作成されるシートの数

 

を指定します。

以前の記事は↓です。

VBSでExcelを操作 - VBScript初級

 

今回、シートの数の指定に使うのは

 

SheetsInNewWorkbookプロパティ

 

です。

 

シートの数を変更するにはこのプロパティの値を変更するだけです。

 

スクリプト実行後に元の値に戻せるように

一度SheetsInNewWorkbookプロパティの中身を変数に入れて置き、

ブックを開いた後に元の値に戻すようなプログラムになっています。

ソースは以下の通りです。


'Excelのインスタンスの生成
Set obj=WScript.CreateObject("Excel.Application")

'Excelウィンドの表示、Falseにすれば画面にはなにも表示されない
obj.Visible=True


'設定されている起動時に作成されるシート数
temp = obj.SheetsInNewWorkbook

'起動時に作成されるシート数を1個に変更
obj.SheetsInNewWorkbook = 1

'ブックの新規作成
Set book=obj.Workbooks.add()

'起動時に作成されるシート数を元の状態に戻す
obj.SheetsInNewWorkbook=temp


'シートの名前の変更
obj.Sheets(1).name="シートの1"

'ワークシートへの参照をオブジェクト変数fshtに格納
'このfshtをつかってシートを操作する
Set fsht=obj.Sheets(1)

'"シートの1"のA1セルにhelloworldと入力、Cells(行,列)
fsht.Cells(1,1)="helloworld"

'ブックの保存
book.Save

'Excelの終了
obj.Quit

'オブジェクト変数の解放、つまりメモリの解放
Set fsht=Nothing

'Excelのインスタンスの解放、これもメモリの解放
Set obj=Nothing

VBS で csv 、テキストファイル を Excel に カンマ区切り で読み込ませ、Excel ファイルとして 保存する。 Workbooks.OpenText

 

見出しのとおり今回は

ドラッグ&ドロップでcsvファイルをexcelファイルに変換します。

コードは以下の通りです。


'Excelのインスタンスの作成
Set  iobj= WScript.CreateObject("Excel.Application")
'引数のファイルをインポート
iobj.Workbooks.OpenText WScript.Arguments(0),65001,1,1, ,False,False,False,True,False,False,False

Set books = iobj.ActiveWorkbook

'シートをオブジェクト変数に格納
Set inp=iobj.Sheets(1)

'FileSystemObjectのインスタンスの作成
set fso = createObject("Scripting.FileSystemObject")

'カレントディレクトリの取得
cdir=fso.getParentFolderName(WScript.ScriptFullName)

'名前を付けて保存
books.SaveAs cdir & "\csvtoexcel.xlsx" , 51

'ブックを閉じる
books.Close

'Excelの終了
iobj.Quit()

'インスタンスの解放
Set fso=Nothing
Set iobj=Nothing

 

 

 では、説明していきます。

 

まずは、Excelインスタンスを作ります。

 

次に、workbooksオブジェクトのopentextメソッドを使用して、ドラッグ&ドロップされたテキストファイルを読み込みます。

今回のopentextメソッドの中身は以下の通りです。

 

 

opentext ファイル名,文字コード番号,取り込み開始行,データ形式,文字列引用符,区切り文字の扱い,タブ区切り,セミコロン区切り,カンマ区切り,スペース区切り,任意の区切り文字

詳しくは下のリンクを見てください。 

 OpenText メソッド (Excel) | Microsoft Docs

 

 

ファイル名には今回、WScript.Arguments(0)が入っています。これは、WScriptオブジェクトのArgumentsプロパティです。

 

このWScript.Argumentsプロパティからは、WshArgumentsコレクションを参照できます。

 

そして、このWshArgumentsコレクションには、VBScript で起動時に指定された引数が保持されています。

 

今回はitemプロパティを使用しています。実際はWScript.Arguments.Item(0)ですがitemを省略しています。

 

カッコ内の0は第何引数かを表し、0が一つ目の引数を表します。0始まりなので気を付けましょう。

f:id:chacha07:20190410224410g:plain

第4回 WScriptオブジェクトの詳細(2) (2/4):Windows管理者のためのWindows Script Host入門 - @IT

残りの要素については説明のとおりです。

区切り文字のところをtrueにします。

 

後は、WScript.ScriptFullNameでフルパスを参照し、FileSystemObjectのgetParentFolderNameメソッドを使用して元ファイルのカレントディレクトリを取得します。

 

そして、任意のファイル名を付けて保存すれば完成です。最後に気を付けておきたいのは、SaveAsで指定している51という数字です。数字の意味は下表のとおりです。

xlWorkbookNormal -4143 ブックの標準 *.xls

xlOpenXMLWorkbook

51 XML ブックを開く *.xlsx
xlOpenXMLWorkbookMacroEnabled 52 マクロを有効にした XML ブックを開く *.xlsm

XlFileFormat 列挙体 (Excel) | Microsoft Docs

 

VBS フォルダの選択 BrowseForFolder 制限つきも フォルダ選択ダイアログ

今回はダイアログボックスでフォルダを選択し、選択したフォルダのパスを表示させます。

 たった3行のソースコードです。


'Shellの呼び出し    
Set shla = WScript.CreateObject("Shell.Application")
'フォルダオブジェクトの作成及び値の取得 Set bfolder = shla.BrowseForFolder(0,"フォルダを選択して下さい",&h1) WScript.echo bfolder.Items.Item.Path



実行すると下の画面が出てきます。

f:id:chacha07:20190308212805p:plain

今回はドキュメントを選択してみました。 

f:id:chacha07:20190308213321p:plain

パスが表示されました。(空白のところはユーザ名です。)

f:id:chacha07:20190308213332p:plain


プログラムの動きについてですが

まず初めに

WScript.CreateObject("Shell.Application")で

Windowsのshellの機能を呼び出します。

 

次にshellの機能である

BrowseForFolderで

フォルダ参照ダイアログボックスを作成し、Folderオブジェクトを返します。

 

最後に

bfolderに格納されたFolderオブジェクトのItemsメソッドがFolderItemsオブジェクトを呼び出し、FolderItemsオブジェクトのitemメソッドがFolderItemオブジェクトを呼び出し、FolderItemオブジェクトのPathプロパティを表示します。

 

FolderItemオブジェクトのプロパティ

Applicacion フォルダのアイテムのアプリケーション・オブジェクト
GetFolder アイテムがフォルダの場合、アイテムの Folder オブジェクト
GetLink アイテムがショートカットの場合、アイテムの ShellLinkObject オブジェクト
IsBrowsable アイテムがブラウズ可能かどうか
IsFileSystem アイテムがファイルシステムの一部かどうか
IsFolder アイテムがフォルダかどうか
IsLink アイテムがショートカットかどうか
ModifyDate ファイル、フォルダの最終更新日時
Name アイテムの名前
Parent アイテムの親オブジェクト
Path アイテムのフルパス名
Size アイテムのサイズ(バイト数)
Type アイテムの種類

 

BrowseForFolderの構文は以下の通り

 

oFolder = Shell .BrowseForFolder( Hwnd , sTitle , iOptions [, vRootFolder ])

 

Hwnd:必須。ダイアログボックスの親ウィンドウのハンドル。

sTitle:必須。ダイアログボックス内に表示される文字列

iOptions:必須。BROWSEINFO 構造体のulFlagsメンバーからなる値リストの組み合わせ。

vRootFolder:省略可。ダイアログボックスで使用する、ルートフォルダを指定する。

 

 

もし、ユーザの選択する範囲を制限・限定したい場合はvRootFolderでパスを指定します。今回はドキュメントの中のworkspaceフォルダを指定しました。


Set shla = WScript.CreateObject("Shell.Application")

Set bfolder = shla.BrowseForFolder(0,"フォルダを選択して下さい",&h1,"C:\Users\     \Documents\workspace")

If bfolder Is Nothing then

WScript.echo "フォルダが選択されませんでした。"

Else

WScript.echo bfolder.Items.Item.Path

End If

f:id:chacha07:20190308214337p:plain

これを実行すると下の状態で立ち上がります。

f:id:chacha07:20190308214707p:plain

このようにvRootFolderでパスを指定することでユーザの選択する範囲を制限することができます。

またif文でオブジェクト変数bfolderが空の場合、つまりフォルダが選択されなかった場合の処理を追加しています。