【问题标题】:How to remove the empty line that VBA creates when saving to CSV如何删除 VBA 在保存到 CSV 时创建的空行
【发布时间】:2020-12-25 20:05:25
【问题描述】:

当您将工作表保存到 csv 时,如何删除 VBA 创建的最后一个空行?

Sub SaveAsCSV()
Dim strSourceSheet As String
Dim strFullname As String


strSourceSheet = "Sheet1"
strFullname = "\\H:\filepath\filepath1\"
myfilenamedate = Format(Range("C2"), "yyyyMMdd")
myfilenameindicator = "data"

ThisWorkbook.Sheets(strSourceSheet).Copy
ActiveWorkbook.SaveAs Filename:=strFullname & myfilenameindicator & myfilenamedate & ".csv", _
                      FileFormat:=xlCSV, _
                      CreateBackup:=True, _
                      local:=True
ActiveWorkbook.Close


End Sub

我已将代码更新为@FaneDuru 的规范,当此代码以这种方式表示时,它仍然返回错误。如果有人可以帮助它了解正在发生的事情,将不胜感激。我对 VBA 的理解非常有限。

Sub SaveAsCSV()
Function eliminateEmptyRow(fullName As String) As Boolean
 'Necessary a reference to "Microsoft Script Control 1.0"
 Dim fso As New FileSystemObject, txtStr As TextStream, objOutputFile As TextStream, strText As String
 
  If Dir(fullName) <> "" Then 'check if file exists
    Set txtStr = fso.OpenTextFile(fullName)
        strText = txtStr.ReadAll
    txtStr.Close
  Else
    eliminateEmptyRow = False: Exit Function
  End If
  strText = left(strText, Len(strText) - 2)

   Set objOutputFile = fso.CreateTextFile(fullName)
      objOutputFile.Write strText
   objOutputFile.Close
   eliminateEmptyRow = True
End Function

Dim strSourceSheet As String
Dim strFullname As String


strSourceSheet = "Sheet1"
strFullname = "\\H:\filepath\filepath1\"
myfilenamedate = Format(Range("C2"), "yyyyMMdd")
myfilenameindicator = "data"

ThisWorkbook.Sheets(strSourceSheet).Copy
ActiveWorkbook.SaveAs Filename:=strFullname & myfilenameindicator & myfilenamedate & ".csv", _
                      FileFormat:=xlCSV, _
                      CreateBackup:=True, _
                      local:=True
ActiveWorkbook.Close

If Not eliminateEmptyRow(strFullname & myfilenameindicator & myfilenamedate & ".csv") Then Stop

End Sub

【问题讨论】:

  • 是什么让你觉得它增加了一行?当我从 Excel 中保存 CSV 文件时,存储的数据会从第一行数据在工作表上运行到最后一行数据在工作表上。 CSV 文件本身的最后一行以 EOL 结尾。
  • CSV 的 行分隔符 是 \r\n,所以它自然会以 1 结尾。
  • @RonRosenfeld 我在记事本中打开文件,我可以看到末尾有一个空格。
  • 记事本邀请您在最后一个 {CrLf} 之后添加数据。这并不意味着那里有东西。没有。当使用内置的另存为 CSV 功能创建最后一个 {CrLf} 时,无法抑制它。您可以编写自己的 CSV 文件导出器(比它的价值更麻烦,相信我 - 除非文件非常简单)。根据@FaneDuru 的回复,您可以在保存后操作文件 - 或者您可以调查为什么最终的 {CrLf} 会导致下游问题并在那里解决。
  • 您看到的是实际空间吗?或者您是否在下一行的开头看到光标(这是预期的)?如果您看到的是实际空间,请检查您的工作表是否存在您认为是数据之后的空间。当我使用十六进制编辑器检查从 Excel 保存的 CSV 文件时,没有尾随空格或多余的行。

标签: excel vba csv export-to-csv


【解决方案1】:

请尝试下一种方法。如果需要,Excel 会自然地插入一个空行来追加。下一个函数应该打开创建的文件,并从末尾删除VbCrLf

Function eliminateEmptyRow(fullName As String) As Boolean
 'Necessary a reference to "Microsoft Script Control 1.0"
 Dim fso As New FileSystemObject, txtStr As TextStream, objOutputFile As TextStream, strText As String
 
  If Dir(fullName) <> "" Then 'check if file exists
    Set txtStr = fso.OpenTextFile(fullName)
        strText = txtStr.ReadAll
    txtStr.Close
  Else
    eliminateEmptyRow = False: Exit Function
  End If
  strText = left(strText, Len(strText) - 2)

   Set objOutputFile = fso.CreateTextFile(fullName)
      objOutputFile.Write strText
   objOutputFile.Close
   eliminateEmptyRow = True
End Function

ActiveWorkbook.Close之后插入下一行:

If Not eliminateEmptyRow(strFullname & myfilenameindicator & myfilenamedate & ".csv") Then Stop

请测试一下并发送一些反馈。

已编辑,将函数调用包含在原始代码中:

Sub SaveAsCSV()
  Dim strSourceSheet As String
  Dim strFullname As String

  strSourceSheet = "Sheet1"
  strFullname = "\\H:\filepath\filepath1\"
  myfilenamedate = Format(Range("C2"), "yyyyMMdd")
  myfilenameindicator = "data"

  ThisWorkbook.Sheets(strSourceSheet).Copy
  ActiveWorkbook.SaveAs Filename:=strFullname & myfilenameindicator & 
  myfilenamedate & ".csv", _
                      FileFormat:=xlCSV, _
                      CreateBackup:=True, _
                      local:=True
  ActiveWorkbook.Close

  If Not eliminateEmptyRow(strFullname & myfilenameindicator & myfilenamedate & ".csv") Then Stop
End Sub

【讨论】:

  • @Cheryl Emvula:您是否抽出时间来测试上述建议?它没有按您的需要工作吗?
  • 说实话@FaneDuru,我不太擅长VBA。我正在努力将它实现到我现有的代码中。你能帮忙吗?
  • @Cheryl Emvula:但我认为,上述解决方案可为您提供所需的一切。在您问题的代码中,您只需插入推荐的行If Not eliminateEmptyRow(strFullname &amp; myfilenameindicator &amp; myfilenamedate &amp; ".csv") Then Stop。在ActiveWorkbook.Close 之后运行代码。如果出现错误,代码将停在这一行。通常一切都会顺利进行。
  • 导致编译错误:未定义子或函数
  • @Cheryl Emvula:你不是复制了eliminateEmptyRow 函数吗?如果是,您是否设置了对“Microsoft Script Control 1.0”的引用?如果没有,你知道怎么做吗?其实很简单……
猜你喜欢
  • 2016-05-12
  • 2018-03-24
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多