这是我第一次在excel中使用VBA来创建一个宏,它将逐行读取excel电子表格,并为每一行创建一个包含列中信息的文本文件。我的宏适用于普通文本,但有时在某些电子表格单元格中有外来文本。
一旦我的宏试图将其写入文本文件,它就会崩溃。第一个问题似乎是读取值(在调试器中查看外来文本显示为'?'问号),然后在尝试将这些问号写入文本文件时失败。
这是从一行读取值到字符串数组
的代码片段 Set oFS = CreateObject("Scripting.Filesystemobject")
For Each rID In oSh.UsedRange.Columns("A").Cells
For Each rValue In oSh.UsedRange.Rows(rowCount).Cells
ReDim Preserve columnValues(columnCount)
columnValues(columnCount) = rValue
columnCount = columnCount + 1
Next
Next
这是我写入文本文件的代码
sFNText = sMakeFolder & "\" & rID.Value & ".txt"
Set oTxt = oFS.OpenTextFile(sFNText, 2, True)
For i = 0 To UBound(columnTitles)
oTxt.Write columnTitles(i) & ": " & columnValues(i) & vbNewLine
Next i
oTxt.Close
我已尝试更改opentextfile的格式,并使用AscW和ChrW转换为ansi和来自ansi,但没有任何乐趣。请问有人可以解决我的问题,或者建议一个更简单的方法吗?
编辑:特别是我试图用希腊语符号(馅饼,欧米茄等)阅读并将它们写回文本文件。我用过
StrConv(Cells(1, 1), vbUnicode)
在类似的帖子中详细介绍的方法(请参阅注释),并且该示例正在运行。将此文本写入文本文件似乎是一个问题。 nixda的例子在使用他的打印命令时看起来效果很好,但是当我尝试使用时
otxt.Write
将我存储的变量写入文本文件,它写出垃圾 - 而不是产生正确结果的print方法。看一下调试器,两个变量的存储方式是相同的(print方法+ write),所以我相信它现在归结为输出方法(otxt.Write),它将存储的变量转换为垃圾。我试过使用-1& OpenTextFile的-2个选项 - 都产生垃圾结果。
答案 0 :(得分:1)
我有以下表格:
和以下代码:
Sub writeUnicodeText()
Dim arr_Strings() As String
i = 0
For Each oCell In ActiveSheet.Range("A1:A4")
ReDim Preserve arr_Strings(i)
arr_Strings(i) = oCell.Value
i = i + 1
Next
Set oFS = CreateObject("Scripting.Filesystemobject")
Set oTxt = oFS.OpenTextFile("C:\users\axel\documents\test.txt", 2, True, -1)
For i = 0 To UBound(arr_Strings)
oTxt.Write arr_Strings(i) & vbNewLine
Next i
oTxt.Close
End Sub
这将生成以下文件:
答案 1 :(得分:0)
这是我用来写入文本的代码。我已经尝试了很多方法,而且效果最好。
Sub ProcessX()
FName1 = "Location of File"
txtStrngX = OpenTextFileToString2(FName1)
end sub
Public Function OpenTextFileToString2(ByVal strFile As String) As String
Dim hFile As Long
hFile = FreeFile
Open strFile For Input As #hFile
OpenTextFileToString2 = Input$(LOF(hFile), hFile)
Close #hFile
End Function
至于从行读入时,请确保在编译时将变量设置为字符串,并且任何方法都可以正常工作。
答案 2 :(得分:0)
对不起。那是从文本中读取的。这是写作。
Public Function RecordsetToText(rs As Object, Optional FullPath _
As String, Optional ValueDelimiter As String = " ") As Boolean
'PURPOSE: EXPORTS DATA FROM AN ADO RECORDSET TO A TEXT FILE
'PARAMETERS:
'RS: Recordset to Export. Open the recordset before
'passing it to this function
'FullPath (Optional): FullPath of text file.
'if not specified, the function uses app.path +
'rs.txt
'ValueDelmiter (Optional): String to delimiter
'values within a row. If not specified, an tab
'is used
'RETURNS: True if successful, false if an error occurs
'COMMENTS: Rows are delimited by a carriage return
Dim sFullPath As String
Dim sDelimiter As String
Dim iFileNum As Integer
Dim lFieldCount As Long
Dim lCtr As Long
Dim oField As ADODB.Field
On Error GoTo ErrorHandler:
If RecordSetReady(rs) = False Then Exit Function
sDelimiter = ValueDelimiter
If FullPath = "" Then
sFullPath = App.Path
If Right(sFullPath, 1) <> "\" Then sFullPath = _
sFullPath & "\"
sFullPath = sFullPath & "rs.txt"
Else
sFullPath = FullPath
End If
iFileNum = FreeFile
Open sFullPath For Output As #iFileNum
With rs
lFieldCount = .Fields.Count - 1
On Error Resume Next
.MoveFirst
On Error GoTo ErrorHandler
For lCtr = 0 To lFieldCount
Set oField = .Fields(lCtr)
If lCtr < lFieldCount Then
Print #iFileNum, oField.Name & sDelimiter;
Else
Print #iFileNum, oField.Name
End If
Next
Do While Not .EOF
For lCtr = 0 To lFieldCount
Set oField = .Fields(lCtr)
If lCtr < lFieldCount Then
Print #iFileNum, oField.Value & sDelimiter;
Else
Print #iFileNum, oField.Value
End If
Next
.MoveNext
Loop
End With
RecordsetToText = True
ErrorHandler:
On Error Resume Next
Close #iFileNum
End Function