昨日介紹了逐行讀取資料後,再逐一判斷內容的作法,今天要介紹的是透過Split功能來切割字串,以更靈活的方式來切割資料。另外,要介紹讀取UTF8的方式。
這篇我們分兩個部份介紹:第一個部份還是讀取ASCII(ANSI)編碼的文字檔,但以Tab字元為辨識字元,透過Split切割,最後用For..Next方式將資料帶到工作表上。第二個部份,則是透過子程式讀取UTF8檔案,然後以換行字元透過Split切割,最後使用Resize與Application.Transpose功能,將資料以陣列方式轉入。
第一部份程式碼:
Sub Day18_ANSI()
Dim strPath As String
Dim strFileType As String
Dim strFile As String
'選取要轉入的檔案
strPath = SpecialFolders("MyDocuments")
strFileType = "*.txt"
strFile = SelectFile(strPath, strFileType)
If Len(strFile) = 0 Then Exit Sub
'以二進位方式讀入資料,在轉成文字字串
Dim b() As Byte
Open strFile For Binary As #1
ReDim b(LOF(1) - 1)
Get #1, , b
Close
b = StrConv(b, vbUnicode)
'依照Tab字元切割資料,由A欄最後一行空白開始匯入
iNewRow = Range("A65535").End(xlUp).Row + 1
If Range("A1") = "" And iNewRow = 2 Then iNewRow = 1
tmp = Split(b, vbTab)
For i = 0 To UBound(tmp)
Debug.Print tmp(i)
Range("A" & iNewRow).Offset(i, 0) = tmp(i)
Close
Next
End Sub
假如我們有個純文字檔,如以下圖片,資料透過Tab字元隔開:
匯入後,會變成以下情形:
第二部份程式碼:
子程式:
Public Function Read_UTF8_Text_File(strPath As String)
'讀取UTF8純文字檔
Dim adoStream As Object
Set adoStream = CreateObject("ADODB.Stream")
adoStream.Charset = "UTF-8"
adoStream.Open
adoStream.LoadFromFile strPath
Read_UTF8_Text_File = adoStream.ReadText
End Function
主程式:
Sub Day18_UTF8()
Dim strPath As String
Dim strFileType As String
Dim strFile As String
'選取要轉入的檔案
strPath = SpecialFolders("MyDocuments")
strFileType = "*.txt"
strFile = SelectFile(strPath, strFileType)
If Len(strFile) = 0 Then Exit Sub
iNewRow = Range("A65535").End(xlUp).Row + 1
If Range("A1") = "" And iNewRow = 2 Then iNewRow = 1
'由Read_UTF8_Text_File子程式讀入UTF8文字,然後依照換行字元切割資料
'由A欄第一個空白行輸入資料,透過Resize與 Application.Transpose方式塞入切割後的陣列資料
var_String = Split(Read_UTF8_Text_File(strFile), vbCrLf)
Range("A" & iNewRow).Resize(UBound(var_String) - LBound(var_String) + 1).Value = Application.Transpose(var_String)
End Sub
假如我們有個UTF8格式的純文字檔,如以下圖片,內容有多國語言文字:
匯入後,會變成以下情形:
以上介紹的兩個程式,在讀取資料與放置資料到工作表的方式,各位可以自由組合,若用For的方式,可再配合昨日介紹的PutRowData子程式,即可將資料拆解後放置到不同的欄位中,各位可嘗試看看!