【问题标题】:Ignoring Blank Cells in CSV Export of Excel Worksheet Data忽略 Excel 工作表数据的 CSV 导出中的空白单元格
【发布时间】:2016-11-14 16:29:26
【问题描述】:

我正在尝试确定一种方法来“忽略”由 Excel 工作表数据生成的 CSV 文件中的空白单元格。

空白单元格将是用户在一行或下一行中输入的结果(两行永远不会被填充,但是脚本中引用的标题需要保持不变)。一行与一个操作系统的磁盘要求有关,而下面的一行与另一个操作系统的磁盘要求有关(如果适用);磁盘要求的格式仍将适用于当前格式的标头。

当前,当 VBA 代码应用于 Excel 工作表时,与第一个 OS 磁盘要求有关的空白行中缺失的数据通过输入空白单元格“推送”下一行的信息。我想找到一种方法让 VBA 代码“忽略”空白行并将前一行的数据输入到此单元格中。我正在使用的 VBA 代码:

Sub WriteCSVFile()

Dim My_filenumber As Integer
Dim logSTR As String

My_filenumber = FreeFile

logSTR = logSTR & "Header1" & " , "
logSTR = logSTR & "Header2" & " , "
logSTR = logSTR & "Header3" & " , "
logSTR = logSTR & "Header4" & " , "
logSTR = logSTR & "Header5" & " , "
logSTR = logSTR & "Header6" & " , "
logSTR = logSTR & "Header7" & " , "
logSTR = logSTR & "Header8" & " , "
logSTR = logSTR & "Header9" & " , "
logSTR = logSTR & "Header10" & " , "
logSTR = logSTR & "Header11" & " , "
logSTR = logSTR & "Header12" & " , "
logSTR = logSTR & "Header13" & " , "
logSTR = logSTR & Chr(13)
logSTR = logSTR & Cells(18, "C").Value & " , "
logSTR = logSTR & Cells(19, "C").Value & " , "
logSTR = logSTR & Cells(20, "C").Value & " , "
logSTR = logSTR & Cells(21, "C").Value & " , "
logSTR = logSTR & Cells(22, "C").Value & " , "
logSTR = logSTR & Cells(26, "C").Value & " , "
logSTR = logSTR & Cells(27, "C").Value & " , "
logSTR = logSTR & Cells(28, "C").Value & " , "
logSTR = logSTR & Cells(29, "C").Value & " , "
logSTR = logSTR & Cells(30, "C").Value & " , "
logSTR = logSTR & Cells(31, "C").Value & " , "
logSTR = logSTR & Cells(32, "C").Value & " , "

如果没有数据来自 logSTR = logSTR & Cells(31, "C").Value & " , " 我想从 logSTR = logSTR & Cells(32, "C").Value 得到数据&"," 放置在该单元格中,而不是留空。这将允许数据的格式(以逗号分隔的 3 个值)与 Header11、Header12 和 Header13(而不是 Header12、Header13 和 No Header)对齐。

logSTR = logSTR & Chr(13)
logSTR = logSTR & "" & " , "
logSTR = logSTR & "" & " , "
logSTR = logSTR & "" & " , "
logSTR = logSTR & "" & " , "
logSTR = logSTR & "" & " , "
logSTR = logSTR & Cells(36, "C").Value & " , "
logSTR = logSTR & Cells(37, "C").Value & " , "
logSTR = logSTR & Cells(38, "C").Value & " , "
logSTR = logSTR & Cells(39, "C").Value & " , "
logSTR = logSTR & Cells(40, "C").Value & " , "
logSTR = logSTR & Cells(41, "C").Value & " , "
logSTR = logSTR & Cells(42, "C").Value & " , "
logSTR = logSTR & Chr(13)
logSTR = logSTR & "" & " , "
logSTR = logSTR & "" & " , "
logSTR = logSTR & "" & " , "
logSTR = logSTR & "" & " , "
logSTR = logSTR & "" & " , "
logSTR = logSTR & Cells(46, "C").Value & " , "
logSTR = logSTR & Cells(47, "C").Value & " , "
logSTR = logSTR & Cells(48, "C").Value & " , "
logSTR = logSTR & Cells(49, "C").Value & " , "
logSTR = logSTR & Cells(50, "C").Value & " , "
logSTR = logSTR & Cells(51, "C").Value & " , "
logSTR = logSTR & Cells(52, "C").Value & " , "

Open "Z:\SHARED DRIVE\RequestDirectory\" & ThisWorkbook.Name & ".csv" For Append As #My_filenumber
    Print #My_filenumber, logSTR
Close #My_filenumber


End Sub 

【问题讨论】:

  • 只需使用 If 语句清除空格,例如 If Cells(52, "C") "" then logSTR = logSTR & Cells(52, "C").Value & " , "

标签: vba excel csv


【解决方案1】:

你可以使用如下的辅助函数:

Function BuildValuesString(colIndex As String, rows As String) As String
    Dim val As Variant

    For Each val In Split(rows, ",")
        If Cells(val, colIndex) <> "" Then BuildValuesString = BuildValuesString & Cells(val, colIndex).Value & " , "
    Next val
End Function

并在您的主代码中利用它,例如:

logSTR = logSTR & Cells(18, "C").Value & " , "
logSTR = logSTR & Cells(19, "C").Value & " , "
logSTR = logSTR & Cells(20, "C").Value & " , "
logSTR = logSTR & Cells(21, "C").Value & " , "
logSTR = logSTR & Cells(22, "C").Value & " , "
logSTR = logSTR & Cells(26, "C").Value & " , "
logSTR = logSTR & Cells(27, "C").Value & " , "
logSTR = logSTR & Cells(28, "C").Value & " , "
logSTR = logSTR & Cells(29, "C").Value & " , "
logSTR = logSTR & Cells(30, "C").Value & " , "
logSTR = logSTR & Cells(31, "C").Value & " , "
logSTR = logSTR & Cells(32, "C").Value & " , "

会变成:

logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22,26,27,28,29,30,31,32")

并且,您可以以同样的方式使用其他两个助手:

Function BuildNullStrings(numNullStrings As Long) As String
    Dim iNullStrings As Long

    For iNullStrings = 1 To numNullStrings
        BuildNullStrings = BuildNullStrings & "" & " , "
    Next iNullStrings
End Function

Function BuildHeadersString(maxHeader As Long) As String
    Dim iHeader As Long

    For iHeader = 1 To maxHeader
        BuildHeadersString = BuildHeadersString & "Header" & iHeader & " , "
    Next iHeader
End Function

这样您的整个代码将缩短为:

Sub WriteCSVFile2()

    Dim My_filenumber As Integer
    Dim logSTR As String

    My_filenumber = FreeFile

    logSTR = logSTR & BuildHeadersString(13)
    logSTR = logSTR & Chr(13)

    logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22,26,27,28,29,30,31,32")

    logSTR = logSTR & Chr(13)
    logSTR = logSTR & BuildNullStrings(5)

    logSTR = logSTR & BuildValuesString("C", "36,37,38,39,40,41,42")

    logSTR = logSTR & Chr(13)
    logSTR = logSTR & BuildNullStrings(5)

    logSTR = logSTR & BuildValuesString("C", "46,47,48,49,50,51,52")


    Open "Z:\SHARED DRIVE\RequestDirectory\" & ThisWorkbook.Name & ".csv" For Append As #My_filenumber
        Print #My_filenumber, logSTR
    Close #My_filenumber


End Sub

【讨论】:

  • 非常感谢您的回复 - 我正在尝试应用您的建议,但我对 VBA 很陌生,我似乎无法弄清楚您在开始时提到的“助手”应该放在哪里。那些是为了在 VBA 代码本身中“分离”吗?我有你缩短的例子,但辅助功能似乎隔离自己,这是正常的吗?
  • 您可以将它们放在项目的任何模块中,因为它们没有被声明为Private。所以你也可以把它们放在SuB WriteCSVFile2()所在的同一个模块中
  • 好吧,我试了一下,我收到以下错误“编译错误:未定义子或函数”,它突出显示 logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22,26,27,28,29,30,31,32") 行。我错过了添加什么吗?
  • 抱歉,我没有将BuildString 更改为BuildValuesString。查看编辑的代码
  • 好的,太好了,谢谢您-非常感谢您对此提供的帮助。我现在可以达到预期的效果。
猜你喜欢
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2021-02-17
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多