【问题标题】:Excel crashing when importing CSV data into workbook将 CSV 数据导入工作簿时 Excel 崩溃
【发布时间】:2020-11-04 23:05:25
【问题描述】:

我编写了一些用于确定设备尺寸的工作簿。我通过 VBA 将设计的详细信息导出到 CSV 文件,以便更轻松地重新加载。下面附上代码。 该脚本大部分时间都可以工作,但是如果我尝试在保存一个 CSV 文件后不久尝试加载一个 CSV 文件,excel 有时会崩溃然后重新启动等。我有 4 个针对不同设备的不同大小的工作簿,每个都基于相同的 VBA 代码,它们都有同样的问题。

需要注意的是,当我保存 CSV 文件时,我会在文件名的末尾添加文本,以识别大小的设备类型,并防止将其识别为 excel 文件。这是由导出脚本完成的。例如“Filename.csv”被保存为“Filename.csv.WHRU”

'''''''''''''''''''''''''''''''''''''''''

工作表(12).激活

将 fStr 变暗为字符串 使用 Application.FileDialog(msoFileDialogFilePicker) .显示

    If .SelectedItems.Count = 0 Then
        MsgBox "Cancel Selected"
        Exit Sub

    End If

    'fStr is the file path and name of the file
    fStr = .SelectedItems(1)
End With
With ThisWorkbook.Sheets(12).QueryTables.Add(Connection:= _
"TEXT;" & fStr, Destination:=ThisWorkbook.Sheets(12).Cells(3, 7))
  .Name = "CAPTURE"
    .FieldNames = True
    .RefreshStyle = xlOverwriteCells
    .TextFileCommaDelimiter = True
    .Refresh BackgroundQuery:=False
 End With
For Each Cn In ThisWorkbook.Connections
    Cn.Delete
Next Cn

For Each Cn In Sheets(12).QueryTables
    Cn.Delete
Next Cn

'''''''''''''''''''''''''''''''''''''''''

【问题讨论】:

  • 让我们首先在每个表单/模块/类的顶部添加Option Explicit。您可以通过选择 Tools->Options->Require Variable Declaration 来默认此设置。现在,继续Debug->Compile VBAProject,直到所有错误都消失。我相当确定您正在重用变量,例如Cn,而没有正确声明/设置它们。保存文件的代码在哪里?
  • 另外,Worksheets(12) 并不总是与Sheets(12) 相同。 Sheets(3) 可能是一张图表,然后把一切都搞砸了。
  • 我浏览并更正了 Worksheets 与 Sheets。它出现在许多地方。我还声明了所有变量。同时我删除了 querytable.connection 定义中的“_”所有这三个项目结合起来解决了这个问题。

标签: excel vba csv


【解决方案1】:

要直接从 VBA 复制 CSV 文件中的信息并将其放入 Excel 工作表中,您可以利用 this project。该项目还允许您立即编写 CSV 文件。

试试这个:

Sub ImportCSVRecords(filePathAndName As String, OutputSheet As String, OutputRange As String)
    Dim CSVix As CSVinterface
    
    Set CSVix = New CSVinterface 'Create new instance
    Call CSVix.OpenConnection(filePathAndName) 'Open a physical connection to the CSV file
    Call CSVix.ImportFromCSV 'Import data
    Call CSVix.DumpToSheet(WBookName:=ThisWorkbook.Name, SheetName:=OutputSheet, rngName:=OutputRange) 'Dumps the data to the current Workbook's OutputSheet starting at named OutputRange.
    Set CSVix = Nothing 'Terminate the current instance
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2013-01-25
    • 2019-10-10
    • 2014-09-30
    • 1970-01-01
    • 2019-04-27
    • 2011-06-04
    相关资源
    最近更新 更多