【问题标题】:How can I create a new excel file/Workbook in VBA without opening it automatically?如何在 VBA 中创建新的 excel 文件/工作簿而不自动打开它?
【发布时间】:2021-10-09 03:04:17
【问题描述】:

我创建了一个子例程来根据输入字符串(新文件名)创建一个新的 Excel 工作簿。如下:

Private Sub AddSaveAsNewWorkbook(FILE As String)

    Dim path As String
    path = FILE & ".xlsx"
    Set Wk = Workbooks.Add
    With Wk
        .SaveAs Filename:=path
    End With
End Sub

但是,我正在使用这个子例程来生成超过 40,000 个新文件。如果程序每次都打开这些文件中的每一个,我的计算机就会崩溃。有没有办法做到这一点,而不是自动打开 Excel 文件?

谢谢。

【问题讨论】:

  • 与其不断调用Workbooks.Add(),只需调用一次,然后在循环中使用wk.SaveAs 来创建您需要的所有版本:无需在excel 中不断添加新文件。或者创建一个模板文件并复制/重命名它而不在 Excel 中打开它(使用FileCopy)。
  • 如果你想尽可能地坚持你的代码,那么至少在.SaveAs ...之后调用.Close。还请澄清不是您的计算机崩溃了,而是 Excel 有所不同!
  • 将您的数据放入数据库并制作一个 Excel 文件来提取数据。谁会看 40k Excel 文件?或者通过直接使用 Open and Print 而不是 Excel 对象模型编写 CSV 文件。
  • @DickKusleika 谁会查看这么多文件并不重要,你不知道他对那个动作的意图。
  • 好吧@lowak 我不同意。有时你必须回答他们没有问的问题。

标签: vba excel


【解决方案1】:

如果您计划创建 40,000 个新文件,那么 .Add.SaveAs 会降低您的 PC 速度。而且由于您不想打开它,因此我建议您为此使用 ACE。这是一个简单的例子。

(基于VB.Net示例HERE

Sub Sample()
    Dim cn As New ADODB.Connection, cmd As New ADODB.Command
    Dim FilePath As String, sFileName As String
    Dim i As Long
    
    '~~> Folder to save the files
    FilePath = "C:\Temp\"
        
    For i = 1 To 40000
        sFileName = FilePath & "File - " & i & ".xlsx"
        
        With cn
            .Provider = "Microsoft.ACE.OLEDB.12.0"
            .ConnectionString = "Data Source=" & sFileName & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
            .Open
            
            Set cmd = New ADODB.Command
            cmd.ActiveConnection = cn
            
            '~~> Command to create the table
            cmd.CommandText = "CREATE TABLE Sheet1 (Sno Int, " & _
                                                   "Employee_Name VARCHAR, " & _
                                                   "Company VARCHAR, " & _
                                                   "Date_Of_joining DATE, " & _
                                                   "Stipend DECIMAL, " & _
                                                   "Stocks_Held DECIMAL)"
            '~~> Adding Data
            cmd.CommandText = "INSERT INTO Sheet1 (Sno, Employee_Name, " & _
                                                  "Company,Date_Of_joining,Stipend,Stocks_Held) " & _
                                                  "values ('1', 'Siddharth Rout', 'Defining Horizons', " & _
                                                  "'20/7/2014','2000.75','0.01')"
                              
            cmd.Execute
            
            .Close
        End With
    Next i
End Sub

注意:这两个 cmd.CommandText 是 Gserg 在下面的 cmets 中强调的替代方案。 (感谢整理)

【讨论】:

  • 这对我不起作用。
  • nto 有什么用?你得到什么错误?
  • @KeithSwerling:现在试试?
  • @SiddharthRout 好吧,我对其进行了测试并且它可以工作(前提是读者理解这两个cmd.CommandTexts 是alternatives)。声明sFileName 并删除File - 之前的空格也可能会更干净。
  • @SiddharthRout 这是当读者知道not 理解这两个cmd.CommandTexts 是替代品时发生的错误(如所写,create 命令永远不会执行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多