【问题标题】:Exporting to CSV without formatted blank values导出为没有格式化空白值的 CSV
【发布时间】:2021-05-19 15:06:05
【问题描述】:

我有一个带有数据选项卡的 .xlsm,旨在用数据自动填充一些单元格,然后将这些行导出到 CSV 文件,但是当我运行我的代码时,它会复制整个活动范围,包括已格式化为的单元格为空白并将它们导出为逗号,我尝试编写代码以删除新 CSV 中的逗号,并且我尝试编写代码以首先不复制格式化的空白值,但到目前为止我没有试过了。

到目前为止,我已经花了几个月的时间,论坛上的其他人也有同样的问题,但似乎没有人解决它。

Sub Mcam_Order_Entry()
'
' Mcam_Order_Entry Macro
' GETS ORDER ENTRY FORM READY FOR TRUNEST
'
' Keyboard Shortcut: Ctrl+Shift+M
'

Dim SB As Worksheet
Set SB = Worksheets("Sandbox")
Set n = SB.Cells(3, 2)
 

 Worksheets("PNM").Copy
 With ActiveSheet.UsedRange
 .Copy
 .PasteSpecial paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=True, Transpose:=False
 End With
 Application.CutCopyMode = False
 ActiveWorkbook.SaveAs Filename:="I:\Group\DNC\MAGESTIC\Multicam\NEW MULTICAM DXFS\" & "Nest" & n & ".csv", _
 FileFormat:=xlCSVMac
 
 ActiveWorkbook.RefreshAll
 Range("F15").Select
 ActiveWorkbook.Save
 ActiveWindow.Close
 Worksheets("Sandbox").Select
 Range("B3") = Range("B3") + 1
 Worksheets("PNM").Select
 Range("F2:F15").Select
 Selection.ClearContents
 Range("F2").Select

End Sub

【问题讨论】:

  • 代替Copy/PasteSpecial,试试With ActiveSheet.UsedRange.Value = .ValueEnd With
  • 当我将 " .Copy .PasteSpecial paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=True, Transpose:=False " 替换为 ".value = .value" 我得到相同的结果,一个在末尾或“底部”有一堆逗号的文件,因为它正在拉动其中包含公式的单元格,这些公式是空白的。
  • 你的公式有类似=IF(foo, bar, "")的作用吗? “公式化空白”是什么意思?
  • 是的,我所说的公式为空白,我的意思是一个公式发生了,结果是一个故意的空白单元格 = "" 真正的公式看起来更像这样 =IFERROR(VLOOKUP(TEXT($F2, "0000000"),'Nesting WIP'!A:J,2,FALSE),"") 输出有时是 "" 有时是实际值。

标签: excel vba export-to-csv blank-line


【解决方案1】:

试试,

Sub setRangToCsv()

    Dim Filename As String
    Dim rngDB As Range
    Dim Ws As Worksheet
    
    Set Ws = ActiveSheet
    Set rngDB = Ws.UsedRange

    Filename = "comacsvtest.csv"
        
    TransToCSV Filename, rngDB

End Sub
Sub TransToCSV(myfile As String, rng As Range)

    Dim vDB, vR() As String, vTxt()
    Dim i As Long, n As Long, j As Integer, k As Integer
    Dim objStream
    Dim strFile As String

    Set objStream = CreateObject("ADODB.Stream")
    vDB = rng
    For i = 1 To UBound(vDB, 1)
        n = n + 1
        k = 0
        Erase vR ' add  this  line
        For j = 1 To UBound(vDB, 2)
            If vDB(i, j) <> "" Then
                k = k + 1
                ReDim Preserve vR(1 To k)
                vR(k) = vDB(i, j)
            End If
        Next j
        ReDim Preserve vTxt(1 To n)
        vTxt(n) = Join(vR, ",")
    Next i
    strtxt = Join(vTxt, vbCrLf)
    With objStream
        '.Charset = "utf-8"
        .Open
        .WriteText strtxt
        .SaveToFile myfile, 2
        .Close
    End With
    Set objStream = Nothing

End Sub

【讨论】:

  • 这段代码当然很有趣,而且方向不同,这可能是我应该思考的方式,但这段代码也会产生意想不到的结果。此代码获取我输入的最后一行数据,并用最后一行数据填充其余行,在 CSV 文件中生成几行重复的数据。
  • @Ace,我编辑了答案。 Erase vR 已添加。
  • 谢谢,这段代码解决了我的问题,虽然我仍然有点困惑为什么,很明显你比我更了解这一点,谢谢谢谢谢谢。现在我只需要弄清楚如何清除原始 .xslm 的内容更新命名编号并将用户放回到数据的开头以重新开始该过程。
  • 再次感谢您,此代码比我的代码运行得更快,并且解决了我的问题,我能够在我之前的评论中添加这些功能并且代码运行良好! - 我真希望我知道为什么。
猜你喜欢
  • 2019-02-06
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多