変換.tokyo | henkan.tokyo

【Excel VBA】Excel VBAからCSVファイルを読み込む

 
■【Excel VBA】Excel VBAからCSVファイルを読み込む

Excel VBAからCSVファイルを取り込む機会は多いと思いますが、CSVファイルの開き方や読み込み方にもいろいろあり、また読み込む速度も大きく異なる場合があります。

今回は、(1)定番の読み込み方、(2)改行された値を含むCSVの読み込み方、の2つをご紹介します♪

まずは(1)定番の読み込み方から。こちらは、

Webサイト「Excel VBAを使ったCSVファイル読み込み時の高速化、タブ区切り対応、ダブルクォーテーション削除のコツ」
http://www.atmarkit.co.jp/ait/articles/1706/16/news032.html

を参考に作成しました。


【サンプルコード@ 定番】

Sub CSVファイルの読み込み()
Dim fso As New Scripting.FileSystemObject
Dim csvFile As Object
Dim csvData As String
Dim splitcsvData As Variant
Dim i As Integer
Dim j As Integer

'OpenTextFileメソッドでCSVデータを、読み込み専用で開く
Set csvFile = fso.OpenTextFile("C:\test\test.csv", 1)
i = 1

'変数iを1で初期化しておき、AtEndOfStreamプロパティを使うことでファイルの最後の行に達するまで、処理を繰り返す
Do While csvFile.AtEndOfStream = False
'ReadLineメソッドで読み込んだCSVファイルの1行を読み込む
csvData = csvFile.ReadLine

'Split関数でカンマ(,)で区切られた各文字列を(1次元)配列として返し、変数splitcsvDataに格納する
splitcsvData = Split(csvData, ",")

'UBound関数を使い配列の要素の数を調べ、変数jに格納する。+1しているのは配列の添え字が0から開始されるため
j = UBound(splitcsvData) + 1

'Sheet2のi行目の1列目からi行目のj列目までの範囲に、読み込んだCSVデータを表示する
Sheet2.Range(Sheet2.Cells(i, 1), Sheet2.Cells(i, j)).Value = splitcsvData
i = i + 1
Loop

csvFile.Close
Set csvFile = Nothing
Set fso = Nothing

End Sub


続いて、(2)改行された値を含むCSVを読み込む場合です。

CSVファイルを読み込むVBAを簡単に作成するには【サンプルコード@ 定番】のような形を取ることが多いですが、この作り方の場合、動きとしてはテキストファイルを1行ずつ読み込んでいくようなイメージになります。
この場合、例えば値の中に改行コードを含むようなCSV(ex. Excelのセルの中でAlt+Enterキーで改行したような値を含む etc.)を読み込んでしまうと...ご想像の通り、1レコードの途中で改行されてしまい、正しくCSVファイルを読み込めなくなります。

そんなCSVを読み込む時には...
非常にシンプルな考え方ですが、CSVファイルを開いて、その内容をExcelシートにコピーする、という方法もあります。
こちらは、

Webサイト「マクロ(Excel VBA)で CSV ファイルを開いてシートの中に取り込む方法」
https://my-tax-nology.com/import-csv-data-to-excel-by-using-excel-vba

を参考に作成しました。

VBA_Read_csv.png


【サンプルコードA 改行された値を含むCSVの読み込み】

Sub Csv_Import()

Dim A_Sheet 'Excelファイルのシート名を入れ込む変数'
Dim Csv_Import_File 'Excelファイルに取り込むCSVファイルの名前を入れ込む変数'

'現在アクティブなシート名を変数 A_Sheet に入れ込む
A_Sheet = ActiveSheet.Name
'CSVファイルを選択する
Csv_Import_File = Application.GetOpenFilename("CSVファイル,*.csv")
If Csv_Import_File = "False" Then Exit Sub 'キャンセルなら終了

'「CSVデータ取込み」シートのセル「A1〜ZZ100000」をクリアする
ThisWorkbook.Sheets("CSVデータ取込み").Range("A1:ZZ100000").ClearContents

With Workbooks.Open(Csv_Import_File)
'全てのデータをこのブックの「CSVデータ取込み」シートにコピー
.Sheets(1).Cells.Copy ThisWorkbook.Sheets("CSVデータ取込み").Range("A1")
.Close 'CSVファイルを閉じる'
End With

'A_Sheet という名前のシートをアクティブにする'
Worksheets(A_Sheet).Activate

End Sub


■サンプルVBAダウンロード
こちらから


■VBA開発に参考となる図書

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

入門者のExcel VBA 初めての人にベストな学び方 (ブルーバックス) [ 立山秀利 ]
価格:1058円(税込、送料無料) (2018/10/1時点)

楽天で購入

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

たった1日で即戦力になるExcelの教科書 [ 吉田拳 ]
価格:1922円(税込、送料無料) (2018/10/1時点)

楽天で購入


【Excel VBA】Excel VBAからWMIを使って各ドライブの空き容量を取得する

 
■【Excel VBA】Excel VBAからWMIを使って各ドライブの空き容量を取得する

Webサイト「Excel VBA から WMI を使ってみよう - WMI Step」を参考に作成しました。
http://www.wmifun.net/step/vba_01.html


皆さんは「WMI」をご存知でしょうか?
WMIとは「Windows Management Instrumentation」の略で、Windows管理技術の中核を担っています。
WMIは、ローカル コンピュータとリモート コンピュータの両方の管理に使用できます。
WMIは、プログラミング言語やスクリプト言語で日常的な管理タスクを実行するための一貫したアプローチを提供します。

たとえば、次のようなことが実行可能です。
・リモート コンピュータ上のプロセスを起動
・特定の日時にプロセスを実行するようにスケジュールを設定
・コンピュータをリモートで再起動
・ローカル コンピュータまたはリモート コンピュータにインストールされているアプリケーションのリストを取得
・ローカル コンピュータまたはリモート コンピュータ上の Windows イベント ログを照会

WMIは、VBAを使用することができる各Officeアプリケーションから使用することが出来ます。
(他に、VBやVBS、PowerShellやBatからも実行可能です)
このサンプルでは、各ドライブごとに空き容量と全容量(単位:バイト)をGBに変換、小数点第2位で四捨五入した値を表示しています。
※参照設定から「Microsoft WMI Scripting V1.2 Library」を追加してから実行してください。

WMI_VBA.png



■サンプルコード

Sub GetWMItoExcel()

Dim oDiskSet As SWbemObjectSet
Dim oDisk As SWbemObject
Dim oLocator As SWbemLocator
Dim oService As SWbemServices
Dim i As Long
Set oLocator = New WbemScripting.SWbemLocator
Set oService = oLocator.ConnectServer
Set oDiskSet = oService.ExecQuery _
("Select * From Win32_LogicalDisk Where DriveType=3")
Worksheets("Sheet1").Cells(1, 1).Value = "各ドライブの空き容量は、"
i = 1
'各ドライブごとに空き容量と全容量(単位:バイト)をGBに変換し、小数点第2位で四捨五入
For Each oDisk In oDiskSet
Worksheets("Sheet1").Cells(i + 1, 1).Value = oDisk.Name & " " & Round(oDisk.FreeSpace / 1024 / 1024 / 1024, 1) & "GB / " & Round(oDisk.Size / 1024 / 1024 / 1024, 1) & "GB"
i = i + 1
Next
Set oDiskSet = Nothing
Set oDisk = Nothing
Set oLocator = Nothing
Set oService = Nothing

End Sub

WMI_xlsx.png


■サンプルVBAダウンロード
こちらから


■VBA開発・WMI利用に参考となる図書

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

入門者のExcel VBA 初めての人にベストな学び方 (ブルーバックス) [ 立山秀利 ]
価格:1058円(税込、送料無料) (2018/10/1時点)

楽天で購入


[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

たった1日で即戦力になるExcelの教科書 [ 吉田拳 ]
価格:1922円(税込、送料無料) (2018/10/1時点)

楽天で購入


[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

ネットワーク管理に使うWMI PowerShellによるWindowsマシン管理 [ 嶋貫健司 ]
価格:6480円(税込、送料無料) (2018/10/1時点)

楽天で購入

【VBS】フォルダ内のファイルを一括リネームする


■【VBS】フォルダ内のファイルを一括リネームする

下記のサイト「技術的なこと、あれこれ」を参考にしました。
http://www.sakutyuu.com/technology/?p=1467


サンプルでは、指定したフォルダ内にある拡張子「PDF」ファイルのみを連番でリネームしています。
この指定を変更することで、様々なファイルに対応させることが出来ます。
また、ファイル名は「〇〇〇_連番.pdf」の形式となります。

【VBS】フォルダ内のファイルを一括リネームする.png


■サンプルコード

Const ForReading = 1 '読み込み
Const ForWriting = 2 '書きこみ(上書きモード)
Const ForAppending = 8 '書きこみ(追記モード)

Set FSO = CreateObject("Scripting.FileSystemObject")

'フォルダのパスを取得
target_folder = InputBox("リネーム対象ファイルの保存先フォルダを指定してください。","【PDFファイルリネーム】ファイルの保存先は?")
If Len(target_folder) = 0 Then .Quit

On Error Resume Next
ShowSubfolders FSO.GetFolder(target_folder)
Set FSO = Nothing

Sub ShowSubFolders(Folder)
'フォルダ内のファイルの数を取得
Dim x
x = 0

'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'フォルダオブジェクトを取得
Set objFolder = objFileSys.GetFolder(Folder)

'ファイルの数を取得(フォルダは除く)
x = objFolder.Files.Count
Dim m
Dim n
m = 0
n = 0
Dim add_txt
add_txt = InputBox("リネームするファイルに付ける名前を指定してください。ファイル名は「〇〇〇_連番.pdf」の形式となります。","【PDFファイルリネーム】ファイルの保存先は?")

For Each File in Folder.Files 'Foler内のファイルを列挙する
On Error Resume Next
Fname = File.name
m = m + 1
'-------------------------------------
Dim strString
Dim strVal
strVal = Fname
strString = Right(strVal, 3)
'PDFファイルの時には連番でリネームする
if strString = "pdf" then
n = n + 1
Dim fs
Dim fn
Set fs = WScript.CreateObject("Scripting.FileSystemObject")
Set fn = fs.GetFile(Folder & "\" & Fname)
Dim rename
rename = add_txt & "_" & n & ".pdf"
fn.Name = rename
Set fs = Nothing
Set fn = Nothing
end if
'-------------------------------------
'※確実に for ~ next ...から離脱させる
if x = m then
exit for
end if

Next

'サブフォルダについても再帰的にリネーム処理する場合
'For Each Subfolder in Folder.SubFolders 'Foler内のフォルダを列挙する
' ShowSubFolders Subfolder '再帰呼び出し
'Next

Set objFileSys = Nothing
Set objFolder = Nothing
Msgbox "リネームが完了しました",,"【PDF用ファイルリネーム】"
End Sub


■サンプルVBSダウンロード
こちらから


■VBSを作成するのに参考となる書籍
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

VBScriptポケットリファレンス改訂版 (Pocket reference) [ アンク ]
価格:2030円(税込、送料無料) (2018/9/15時点)

楽天で購入