【发布时间】:2014-10-16 10:24:52
【问题描述】:
这个话题已经结束:我是一个完全的初学者,我可以做这个 - 如果你需要调整简单的东西,你可能想阅读这里所说的所有内容......
解决方案复制在本文底部...
原始任务: 这是我能够在 UTF8 解决方案中找到的对 CSV 更好的解决方案之一。大多数人要么想要安装插件,要么不必要地使过程复杂化。而且还有很多。
一个问题已经解决。 (如何导出正在使用的行而不是预定义的数字)
剩下的就是调整一些东西。
Case Excel
A1=Cat, B1=Dog
A2=empty B2=Empty
A3=Mouse B3=Bird
当前脚本导出
猫,狗
老鼠,鸟
需要的是
"Cat","Dog"
,
"Mouse","Bird"
代码:
Public Sub WriteCSV()
Set wkb = ActiveSheet
Dim fileName As String
Dim MaxCols As Integer
fileName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")
If fileName = "False" Then
End
End If
On Error GoTo eh
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Dim BinaryStream
Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Charset = "UTF-8"
BinaryStream.Type = adTypeText
BinaryStream.Open
For r = 1 To 2444
s = ""
C = 1
While Not IsEmpty(wkb.Cells(r, C).Value)
s = s & wkb.Cells(r, C).Value & ","
C = C + 1
Wend
If Len(s) > 0 Then
s = Left(s, Len(s) - 1)
End If
BinaryStream.WriteText s, 1
Next r
BinaryStream.SaveToFile fileName, adSaveCreateOverWrite
BinaryStream.Close
MsgBox "CSV generated successfully"
eh:
End Sub
解决方案: (请注意,您可以通过将 wkb.UsedRange.Rows.Count 替换为数字来预先定义行数 - 与列相同,并在需要时进行其他小的调整。) 如果您希望在 fileName = Application.GetSaveAsFilename(""
之后将预定义的文件路径放在空引号中Public Sub WriteCSV()
Set wkb = ActiveSheet
Dim fileName As String
Dim MaxCols As Integer
fileName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")
If fileName = "False" Then
End
End If
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Dim BinaryStream
Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Charset = "UTF-8"
BinaryStream.Type = adTypeText
BinaryStream.Open
For r = 1 To wkb.UsedRange.Rows.Count
S = ""
sep = ""
For c = 1 To wkb.UsedRange.Columns.Count
S = S + sep
sep = ","
If Not IsEmpty(wkb.Cells(r, c).Value) Then
S = S & """" & wkb.Cells(r, c).Value & """"
End If
Next
BinaryStream.WriteText S, 1
Next r
BinaryStream.SaveToFile fileName, adSaveCreateOverWrite
BinaryStream.Close
MsgBox "CSV generated successfully"
eh:
End Sub
【问题讨论】:
-
使用:
For r = 1 To wkb.UsedRange.Rows -
那行不通。您必须执行 "For r = 1 To wkb.UsedRange.Rows.Count" ,以任何方式发布它,以便我接受答案并解决问题。
-
你是对的。我写得乱七八糟,因为我没有 Excel 来测试它。但我会听从你的邀请:-)
-
你知道如何调整它,使它不会在它导出的第二列之后添加“,”吗?如果你用 a=dog 和 b+cat 导出 2 列,你会得到:dog,cat, i want to get dog,cat
-
BinaryStream.WriteText Left(s, Len(s) - 1), 1