iT邦幫忙

DAY 18
1

Excel VBA 的眉眉角角系列 第 18

Excel VBA 的眉眉角角Day18: 讀取UTF8檔案後,利用Split功能切割以及Resize與Application.Transpose的介紹

昨日介紹了逐行讀取資料後,再逐一判斷內容的作法,今天要介紹的是透過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子程式,即可將資料拆解後放置到不同的欄位中,各位可嘗試看看!


上一篇
Excel VBA 的眉眉角角Day17: 匯入文字檔後逐行檢查
下一篇
Excel VBA 的眉眉角角Day19:判斷檔案是否已開啟
系列文
Excel VBA 的眉眉角角30

尚未有邦友留言

立即登入留言