使用 VBA 将 Excel 重命名为 CSV

Posted

技术标签:

【中文标题】使用 VBA 将 Excel 重命名为 CSV【英文标题】:Renaming Excel to CSV Using VBA 【发布时间】:2018-04-30 21:36:20 【问题描述】:

我正在尝试使用 Excel 2010 在 VBA 中编写一个宏,该宏链接到工作表中的按钮(位于单元格 A1 中)。按下按钮时,应该生成一个删除列 A 和 B 的 CSV,以便列 C 有效地成为列 A。我还尝试根据工作表中单元格 A30 中的单元格内容命名新生成的 CSV,但是当我运行宏时,SaveAs 函数出现错误。我相信这是因为稍后在脚本中删除了单元格 A30。我的问题是哪里有一种方法可以使用 Range (A30) 来命名新的 CSV,同时仍然在稍后在新的 CSV 中删除该单元格,所有这些都在同一个 sub 中?我还是 VBA 的新手,所以我不清楚为什么这是一个问题,因为我认为每个命令都是按顺序执行的,所以一旦用新名称保存 CSV,我想我就可以了删除文件名的来源。

Sub rpSaveCSV()

Dim ws As Worksheet
Set ws = ActiveSheet

'Saves current sheet of tracker as a CSV
ws.SaveAs "Y:\Drive\Youth " & Range("A30") & " .csv", FileFormat:=xlCSV

'Copies entire sheet and pastes values to get rid of formulas
  ws.Select
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues
    ActiveSheet.Select
    Application.CutCopyMode = False

'Deletes first two columns and all remaining columns without content
Range("A:B").EntireColumn.Delete
Range("BI:XFD").EntireColumn.Delete

'Saves panel CSV
ActiveWorkbook.Save

'Opens Tracker up again
Workbooks.Open Filename:="Y:\Drive\Tracker.xlsm"

End Sub

【问题讨论】:

看看你是怎么得到Dim ws As Worksheet的?那就是声明一个局部变量。您可以很好地使用Dim fileName As StringfileName = Range("A30").Value,并在以后重复使用它。 我在 SaveAs 功能上遇到错误 - 什么错误您究竟得到了什么? 至于删除文件,你可以用Kill关键字来做...前提是kill目标是关闭的。 【参考方案1】:

声明一个变量来保存字符串值:

Dim filename as String
filename = Range("A30")

'verify that "Y:\Drive\Youth " & filename & " .csv" is a valid file name:
Debug.Print "Y:\Drive\Youth " & filename & " .csv" ' looks right? Ctrl+G to find out
ws.SaveAs "Y:\Drive\Youth " & filename & " .csv", FileFormat:=xlCSV

'...delete columns...

'...do stuff...

Debug.Print filename 'value is still here!

【讨论】:

感谢您的快速回复!我仍然收到相同的运行时错误“1004”:对象“_Worksheet”的方法“SaveAs”失败。 @Ryan 一个问题是Range("A30") 隐含地引用了当前活动的任何工作表:就像写ActiveSheet.Range("A30").Value,这可能是也可能不是您需要查看的内容。使用更明确的代码,指定工作表是什么,并使用该对象来限定 Range 调用。 filename 的值是多少?你用Ctrl+G检查了吗?看起来对吗?【参考方案2】:

我建议学习将数组用于 Excel 数据。它通常比尝试在 VBA 中复制 Excel 应用程序函数要简单得多。而且它更高效/更快。

这是一个将数据输入数组,然后将数组打印到 csv(文本)文件的函数。

Sub CreateCsvFromWorkSheet(leftColumn, rightColumn, FileName)
    Set ws = ActiveSheet
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.CreateTextFile(FileName, True)

    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ar = ws.Range(ws.Cells(1, leftColumn), ws.Cells(lastRow, rightColumn))
    For i = 1 To UBound(ar, 1)
        strLine = ""
        For j = 1 To UBound(ar, 2)
            strLine = strLine & ar(i, j) & ","
        Next
        strLine = Left(strLine, Len(strLine) - 1)
        f.WriteLine strLine
    Next
    f.Close
End Sub

你可以这样调用函数:

Sub TestRun()
    FileName = "Y:\Drive\Youth " & Range("A30") & " .csv"
    CreateCsvFromWorkSheet 3, 60, FileName
    MsgBox "Complete."
End Sub

【讨论】:

您是说一次写入一个单元格的 CSV 文件会比使用 Excel 的内置 SaveAs CSV 格式“效率更高”吗? @Mathieu 否。但它可能比复制和粘贴工作表中的所有单元格,然后删除两列更快。我真的不知道在这种情况下它是否更快。我的观点是学习数组非常有用。 当您将 Excel 范围写入数组时,然后遍历数组的元素,这与遍历“一次一个单元格”不同。当您在工作表中迭代单元格时,Excel 应用程序和 VBA 之间会发生通信;这需要时间。数组是 VBA 原生的,与“一次一个单元格”迭代范围相比,速度快如闪电。 是的,我知道,谢谢。我的意思是“一次一个单元格/值”。您仍在重复数千次以将尽可能多的内容写入一个文件,而这些内容可以通过一次本机操作写入,同时重新发明 CSV ***。 嘿,你在快速解决 OP 的问题方面做得很好,我很佩服。

以上是关于使用 VBA 将 Excel 重命名为 CSV的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件重命名为另一个文件系统?

无法将 git 分支重命名为“master”,以错误的名称推送到远程

如何仅将“未命名:”列重命名为数字索引

使用 pathlib 将一个目录破坏性地重命名为另一个现有目录

如何使用 C# 将 .TXT 文件重命名为 .OLD? [关闭]

将多个目录中的文件重命名为目录名