首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将excel导出到csv UTF8的工作VBA

将excel导出到csv UTF8的工作VBA
EN

Stack Overflow用户
提问于 2014-10-16 10:24:52
回答 3查看 3.2K关注 0票数 0

这个话题的结论是:我是一个完全的初学者,我可以做这个-如果你需要调整简单的东西,你可能想要阅读所有这些都在这里说…

解决方案被复制在这篇文章的底部。

原创任务:这是我在UTF8解决方案中能够找到的更好的用于CSV的excel之一。大多数人要么希望安装插件,要么不必要地使过程复杂化。而且他们有很多。

有一个问题已经解决了。(如何导出使用中的行而不是预定义的数字)

剩下的就是修改一些东西。

代码语言:javascript
复制
Case Excel
A1=Cat, B1=Dog
A2=empty B2=Empty
A3=Mouse B3=Bird

当前脚本导出

猫,狗

老鼠,鸟

需要的是

代码语言:javascript
复制
"Cat","Dog"
,
"Mouse","Bird"

代码:

代码语言:javascript
复制
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来预定义行数--用列替换wkb.UsedRange.Rows.Count,并在需要时执行其他小的调整)。如果您想要一个预定义的文件路径,在fileName = Application.GetSaveAsFilename("“)之后放入空引号

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-16 13:36:51

使用:

代码语言:javascript
复制
For r = 1 To wkb.UsedRange.Rows.Count

更新

使用它移除输出中的后缀逗号。(见评论)

代码语言:javascript
复制
If Len(s) > 0 Then
    s = Left(s, Len(s) - 1)
End If
BinaryStream.WriteText s, 1

更新2

我希望这能像你期望的那样起作用。我改变了添加逗号的方式,并为此添加了变量sep (分隔符)。也许您想在函数头中声明它。如果有固定的行计数,并且知道计数,则可以替换wkb.UsedRange.Columns.Count表达式。正如你在引号中所看到的,你必须引用一个引号,它使4个引号加在一起(我不知道这个句子是否有意义) :-)

代码语言:javascript
复制
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

当你终于做到的时候深呼吸。

票数 1
EN

Stack Overflow用户

发布于 2014-11-21 13:12:18

从您的评论中,我假设您希望每个单元格被引号包围,并用逗号分隔,包括空白单元格(这是一个普通的CSV)。

下面的代码使用ForEach遍历电子表格的使用范围。

代码语言:javascript
复制
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

                                    '   calculate the last column number
MaxCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
S = Chr(34)                         '   double quote

For Each Cell In ActiveSheet.UsedRange ' traverse the used range

    S = S & Cell.Value

    If Cell.Column = MaxCol Then    '   last cell in row

        S = S & Chr(34)             '   close the quotes

        BinaryStream.WriteText S, 1

        S = Chr(34)                 '   start next row with quotes

    Else

        S = S + Chr(34) & "," & Chr(34) ' close the quotes, write comma, open quotes

    End If

Next

BinaryStream.SaveToFile fileName, adSaveCreateOverWrite
BinaryStream.Close

MsgBox "CSV generated successfully"

eh:

End Sub

如果您需要只包含没有引号的数字的单元格,则需要做更多的工作。

票数 0
EN

Stack Overflow用户

发布于 2016-04-12 12:11:38

当前的解决方案(出现在OP本身中)是伟大的,除了一件事-它添加了一个BOM。这里是我的解决方案,也剥离BOM (通过https://stackoverflow.com/a/4461250/4829915)。我还从结尾处删除了当前未使用的标签"eh:“,并添加了嵌套:

代码语言:javascript
复制
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
    Const adTypeBinary = 1

    Dim BinaryStream
    Dim BinaryStreamNoBOM
    Set BinaryStream = CreateObject("ADODB.Stream")
    Set BinaryStreamNoBOM = 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.Position = 3 'skip BOM
    With BinaryStreamNoBOM
        .Type = adTypeBinary
        .Open
        BinaryStream.CopyTo BinaryStreamNoBOM
        .SaveToFile fileName, adSaveCreateOverWrite
        .Close
    End With

    BinaryStream.Close

    MsgBox "CSV generated successfully"

End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26402010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档