我目前正在研究一组vba函数,这些函数应该允许用户从xls或xlsx文件中导出多个工作表,并根据工作表的名称将它们全部导出为不同的文件格式。这是一个使用旧文件的非常具体的程序。
所选文件中的某些工作表应被视为原始数据,我想将它们导出为.CSV文件,而不对数据进行任何更改。如果它有帮助,我甚至不需要"看到"用于制作IF或其他逻辑处理的数据。
我已经有一个函数从封闭文件中获取特定工作表中特定单元格的数据,但是我无法弄清楚如何从工作表中获取所有数据而不迭代所有数十亿个单元格大多数都是空的,只是为了检查单元格中是否有数据(23785; GP)。
这是我已经拥有的功能,可能有助于理解预期的行为。
Private Function GetInfoFromClosedFile(ByVal wbPath As String, _
ByVal WBName As String, wsName As String, cellRef As String) As Variant
Dim arg As String
GetInfoFromClosedFile = ""
If Right(wbPath, 1) <> "\" Then wbPath = wbPath & "\"
If Dir(wbPath & "\" & WBName) = "" Then Exit Function
arg = "'" & wbPath & "[" & WBName & "]" & wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
On Error Resume Next
GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
End Function
其他工作簿必须在最后关闭,并且不会对当前工作簿进行任何更改。至少,所有所做的更改都应该撤消,以便在选择文件后,用户只能在他的计算机上看到我的确认消息和新创建的文件,而他的Excel中没有明显的差异。由于这将被那些既不是程序员也不精通技术的人使用,所以任何搞乱他们当前工作簿的东西都可能会同时用于某些事情。
答案 0 :(得分:1)
此Sub将文件字符串和工作表名称作为参数创建.CSV文件,其扩展名.csv附加到其先前的名称,工作表名称和扩展名。
Private Sub export_file_to_csv(src_path, sheet_name)
Application.DisplayAlerts = False
Set src_workbook = Workbooks.Open(src_path, , True)
src_workbook.Sheets(sheet_name).Activate
dst_path = src_path & " - " & sheet_name & ".csv"
src_workbook.SaveAs Filename:=dst_path, FileFormat:=xlCSV
src_workbook.Close
Application.DisplayAlerts = True
End Sub
然后,您可以根据需要在另一个子中多次调用它。
Sub main_sub()
export_file_to_csv "C:\Users\username\Desktop\maps.xlsx", "Europe"
export_file_to_csv "C:\Users\username\Desktop\maps.xlsx", "Asia"
export_file_to_csv "C:\Users\username\Documents\budget.xls", "Sheet1"
End Sub
只需将此代码放在另一个工作簿中,编辑将导出为CSV的文件的路径和工作表名称,然后运行应显示在宏菜单上的main_sub。原始文件将保持不变,因为它们是以只读方式打开的。
希望它有所帮助!