VBA提取文本行保存为UTF-8报错:仅支持字符串类型而非数组
解决VBA写入UTF-8文件时参数类型不匹配的问题
你的代码报错根源是WriteIfFile_utf8函数中.writetext方法仅支持字符串类型,但你传入了数组myArray。除此之外,代码还有几个逻辑问题需要修正,比如循环内重复写入会覆盖文件、变量未声明等,以下是完整的修复方案:
核心问题分析
myArray = Array(LineData)生成了数组类型,但WriteIfFile_utf8的.writetext需要字符串输入,导致类型不匹配报错。- 循环内每次调用
WriteIfFile_utf8会覆盖目标文件,最终只会保留最后一行符合条件的数据。 - 多个变量未声明,不符合VBA的最佳实践,容易引发隐式类型错误。
修复后的代码
Option Explicit ' 强制变量声明,避免隐式错误 Sub ReadTextFileDataInExcel() Dim TblNum As String TblNum = Worksheets("“ü—̓f[ƒ^").Range("A2").Value Dim RowNumber As Long Dim TextFile As String Dim LineData As String Dim MyDir As String Dim MyFileName As String Dim collectedLines As String ' 用于收集所有符合条件的行 TextFile = ThisWorkbook.Path & "\" & TblNum & "\" & "CA003" & "\10_RunScript\20.ExpectResult.sql" MyDir = ThisWorkbook.Path & "\" & TblNum & "\" & "CA003" & "\10_RunScript" MyFileName = MyDir & "\40.ExpectResult.sql" RowNumber = 1 collectedLines = "" ' 初始化收集字符串 Open TextFile For Input As #1 Do While Not EOF(1) Line Input #1, LineData If LineData Like "insert*" Then ' 写入Excel表格 Worksheets("40.ExpectResult_TEMP").Range("A" & RowNumber).Value = LineData ' 收集行数据,添加换行符分隔 collectedLines = collectedLines & LineData & vbCrLf RowNumber = RowNumber + 1 End If Loop Close #1 ' 所有行收集完成后,一次性写入UTF-8文件 If collectedLines <> "" Then WriteIfFile_utf8 MyFileName, Left(collectedLines, Len(collectedLines) - 2) ' 移除最后多余的换行符 End If End Sub Function WriteIfFile_utf8(strPath As String, strText As String) Dim objStream As Object Dim utfStr As Variant Set objStream = CreateObject("adodb.stream") With objStream .Type = 2 ' adTypeText .Charset = "UTF-8" .Open .WriteText strText ' 传入字符串类型参数 .Position = 0 .Type = 1 ' adTypeBinary .Position = 3 ' 跳过UTF-8 BOM头 utfStr = .Read() .Position = 0 .Write utfStr .SetEOS .SaveToFile strPath, 2 ' 2 = adSaveCreateOverWrite .Close End With Set objStream = Nothing End Function
关键修改说明
- 添加
Option Explicit强制变量声明,避免隐式类型错误。 - 用
collectedLines字符串收集所有符合条件的行,最后一次性写入文件,避免重复覆盖。 - 直接向
WriteIfFile_utf8传递字符串strText,解决参数类型不匹配问题。 - 调整函数参数类型为明确的
String,增强代码可读性和类型安全。 - 移除最后多余的换行符,避免文件末尾出现空行。
内容的提问来源于stack exchange,提问作者Janarie Jamel
相关产品推荐
相关产品推荐

