2014-10-16 112 views
0

此主題已得出結論:我是一個初學者,我可以工作 - 如果您需要調整簡單的東西,您可能想要閱讀所有這些在這裏說...將excel導出爲csv的工作VBA UTF8

的溶液在這篇文章的底部抄...

原始任務: 這是一個更好的擅長以CSV在UTF8解決方案,我能找到那裏。大多數人想要安裝插件或不必要地使該過程複雜化。其中有很多。

一個問題已經解決。 (如何導出使用的行而不是預定義的數字)

剩下的是調整一些東西。

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 

SOLUTION: (請注意,您可以預先通過用數字替換wkb.UsedRange.Rows.Count定義的行數 - 同樣的柱子,和做其他小的調整應該需要) 如果你想一個預先定義的文件路徑放在空引號後的文件名= 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 
+0

用途:'當r = 1〜wkb.UsedRange.Rows' – Fratyx 2014-10-16 10:51:07

+0

不起作用。你必須做「對於r = 1到wkb.UsedRange.Rows.Count」,任何方式你可以發佈它,所以我可以接受答案並解決線程。 – helena4 2014-10-16 13:34:13

+0

你是對的。我沒有寫出想法,因爲我沒有Excel來測試它。但我會按照你的邀請:-) – Fratyx 2014-10-16 13:36:30

回答

0

用途:

For r = 1 To wkb.UsedRange.Rows.Count 

更新

使用此命令刪除輸出中的尾隨逗號。 (見註釋)

If Len(s) > 0 Then 
    s = Left(s, Len(s) - 1) 
End If 
BinaryStream.WriteText s, 1 

更新2

我希望你想到這會工作。我改變了逗號的添加方式,併爲此添加了變量sep(分隔符)。也許你想在函數頭部聲明它。如果你有一個固定的行數,並且你知道計數,你可以替換wkb.UsedRange.Columns.Count表達式。正如你看到裏面引用您要引用報價是什麼讓4個報價產品總數(我不知道這句話是有道理的。):-)

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 

並深呼吸,當你終於做到了。

+0

這變成一個痛苦的馬拉松... 現在我有 貓,狗 空行 鼠標,鳥 我必須確保它們都引用和空行也將作爲一個單一的昏迷」, 」。 要與 「貓」,「狗」 , 「鼠標」,「鳥」 結束了第一個我必須這樣做,因爲一些文本中具有實際的昏迷和其更多的是痛苦的,以只舉出那些,所以我們不妨全力以赴。他沒有告訴我爲什麼昏迷。 這是最後一個 - 我保證,他有一個更多的要求,並且生病需要兩天的時間,並且不斷的將他打在臉上,直到他修復他的糟糕的解析器來處理它。 – helena4 2014-11-21 12:25:25

+0

Thx幫助迄今順便說一句,(我離開了一段時間) 我想象舉例一切都會很容易,如果空行垃圾很難,你可以放下它,我會看到我能做些什麼它。 這可能會有幫助,但我無法很好地理解它適應。 http://www.excel-easy.com/vba/examples/write-data-to-text-file.html 或者我們可以做&CHR(34),但我可能需要兩個小時才能找出哪裏準確地插入它。下班後將考察它。 – helena4 2014-11-21 13:08:45

+0

耶穌,你不知道有多少「解決方案」,我試圖甚至到達這個接近一個,然後讓你調整它。最後。 還有其他的工作解決方案 - 一些編碼員已經爲它編寫了一些可用的插件,但是複製粘貼VBA總是在可用性方面勝過任何安裝。 – helena4 2014-11-21 15:46:40

0

我從你的評論中假設你希望每個單元格都被引號括起來,並用逗號分隔,包括空白單元格(這是一個正常的CSV)。

以下代碼使用ForEach遍歷電子表格的使用範圍。

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

太糟糕了,我無法拿出你的答案,我會採取Fratys的,因爲我最騷擾他。 您的函數可以工作,但給我奇怪的結果,當我嘗試手動指定MaxCol = 3而不是「ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count」 它可能是我的過錯艱難。 – helena4 2014-11-21 15:42:19

0

目前的解決方案(出現在OP本身中)除了一件事外很棒 - 它增加了一個BOM。這是我的解決方案,也可以剝離BOM(通過https://stackoverflow.com/a/4461250/4829915)。 我還刪除了當前未使用的標籤「誒:」從結束,並添加嵌套:

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

爲什麼要跳過物料清單? – 2016-04-18 10:06:55

+0

某些應用程序在包含BOM時無法讀取CSV文件。 – LWC 2016-04-18 18:57:07