Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VBA将Excel重命名为CSV_Excel_Vba_Csv_Save As - Fatal编程技术网

使用VBA将Excel重命名为CSV

使用VBA将Excel重命名为CSV,excel,vba,csv,save-as,Excel,Vba,Csv,Save As,我正在尝试使用Excel 2010在VBA中编写宏,该宏链接到工作表(位于单元格A1)中的按钮。按下按钮时,应生成删除列a和B的CSV,使列C实际上成为列a。我还试图根据工作表中单元格A30中的单元格内容命名新生成的CSV,但当我运行宏时,我在SaveAs函数中遇到错误。我相信这是因为后来在脚本中删除了单元格A30。我的问题是,哪里有一种方法可以使用范围(A30)来命名新的CSV,同时在新的CSV中删除该单元格,所有这些单元格都在同一个子系统中?我还是VBA新手,所以我不清楚为什么这是一个问题,

我正在尝试使用Excel 2010在VBA中编写宏,该宏链接到工作表(位于单元格A1)中的按钮。按下按钮时,应生成删除列a和B的CSV,使列C实际上成为列a。我还试图根据工作表中单元格A30中的单元格内容命名新生成的CSV,但当我运行宏时,我在SaveAs函数中遇到错误。我相信这是因为后来在脚本中删除了单元格A30。我的问题是,哪里有一种方法可以使用范围(A30)来命名新的CSV,同时在新的CSV中删除该单元格,所有这些单元格都在同一个子系统中?我还是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 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!

我建议学习使用Excel数据的数组。它通常比尝试在VBA中复制Excel应用程序功能简单得多。而且它的效率/速度要快得多

下面是一个函数,它将数据馈送到数组,然后将数组打印到csv(文本)文件

您可以这样调用函数:

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

查看如何在那里获得
Dim ws As Worksheet
?这是在声明一个局部变量。您可以很好地将
文件名设置为字符串
文件名=范围(“A30”).Value
,然后在以后的过程中重新使用它。我在SaveAs函数中遇到了一个错误-您得到的确切错误是什么?至于删除文件,您可以使用
Kill
关键字执行此操作。。。前提是杀戮目标已关闭。感谢您的快速回复!我仍然收到相同的运行时错误“1004”:对象“工作表”的方法“SaveAs”失败。@Ryan一个问题是
Range(“A30”)
隐式引用当前活动的任何工作表:这就像编写
ActiveSheet.Range(“A30”).Value
,这可能是您需要查看的,也可能不是。使用更明确的代码,指定工作表是什么,并使用该对象限定
范围
调用。
文件名的值是多少?你用Ctrl+G检查了吗?看起来对吗?你是说一次一个单元格编写CSV文件比使用Excel内置的SaveAs CSV格式“效率高得多”?@Mathieu No.但它可能比复制和粘贴工作表中的所有单元格,然后删除两列要快。我真的不知道在这种情况下是否更快。我的观点是,学习数组非常有用。当你将Excel范围写入数组,然后遍历数组元素时,这与“一次遍历一个单元格”不同。在工作表中迭代单元格时,Excel应用程序与VBA之间会发生通信;这需要时间。数组是VBA固有的,与“一次遍历一个单元格”的范围相比,它的速度非常快。是的,我知道,谢谢。我的意思是“一次一个单元格/值”。您仍然在重复数千次,以将尽可能多的内容写入一个文件,而这些内容可以通过一个本机操作写入,同时又重新发明了CSV轮子。嘿,您在快速解决OP问题方面做得很好,我对此表示钦佩。
Sub TestRun()
    FileName = "Y:\Drive\Youth " & Range("A30") & " .csv"
    CreateCsvFromWorkSheet 3, 60, FileName
    MsgBox "Complete."
End Sub