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コレクションを参照できます。(下図参照)

第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

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

![]()
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
これだけでも削除はできますが、↓のようなアラートが出ます。
これを出ないようにするには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を開くだけのプログラムに
”ブックの新規作成時に作成されるシートの数”
を指定します。
以前の記事は↓です。
今回、シートの数の指定に使うのは
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
では、説明していきます。
次に、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始まりなので気を付けましょう。

第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
実行すると下の画面が出てきます。

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

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

プログラムの動きについてですが
まず初めに
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

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

このようにvRootFolderでパスを指定することでユーザの選択する範囲を制限することができます。
またif文でオブジェクト変数bfolderが空の場合、つまりフォルダが選択されなかった場合の処理を追加しています。