Excel 从CSV文件导入数据错误:名称为。。。已经存在

Excel 从CSV文件导入数据错误:名称为。。。已经存在,excel,vba,Excel,Vba,我正在尝试从.csv文件导入数据,然后获取最后一列的总和 CSV文件内容包括: Name,Age,City,Salary Rick,25,Dallas,1800 Nick,28,Austin,2500 Jack,30,NYC,3500 Rose,26,Dallas,2400 宏抛出以下错误。 代码如下所示 Sub EmpMacro1() ' ' EmpMacro1 Macro ' ' ActiveWorkbook.Queries.Add Name:="Emp_Datta", For

我正在尝试从.csv文件导入数据,然后获取最后一列的总和

CSV文件内容包括:

Name,Age,City,Salary
Rick,25,Dallas,1800
Nick,28,Austin,2500
Jack,30,NYC,3500
Rose,26,Dallas,2400
宏抛出以下错误。

代码如下所示

Sub EmpMacro1()
'
' EmpMacro1 Macro
'

'
    ActiveWorkbook.Queries.Add Name:="Emp_Datta", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(File.Contents(""C:\Users\Irfan.Shaikh\Desktop\Emp_Datta.csv""),[Delimiter="","", Columns=4, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""Promoted Headers"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Changed Type"" = Table.TransformColumnTypes(#""Promoted Headers"",{{""Name"", type text}, {""Age"", Int64.T" & _
        "ype}, {""City"", type text}, {""Salary"", Int64.Type}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Changed Type"""
    ActiveWorkbook.Worksheets.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Emp_Datta;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [Emp_Datta]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Emp_Datta"
        .Refresh BackgroundQuery:=False
    End With
    Range("C7").Select
    ActiveCell.FormulaR1C1 = "Total"
    Range("D7").Select
    ActiveCell.FormulaR1C1 = "=SUM(Emp_Datta[Salary])"
    Range("D8").Select
End Sub
我有两个问题

  • 当我停止录制宏并删除导入的数据时。存在确认删除查询的警报。是和否的影响是什么

  • 我在网上查找错误,但没有找到解决办法。是否与我删除导入数据时删除查询有关


  • 如果您通过删除范围(并回答“是”)来删除查询,那么您似乎只是将其更改为仅连接查询,而不是真正删除它。您需要使用VBA代码或在“查询和连接”窗口中实际删除查询,才能真正删除它

    查询的另一个问题是,您将使用相同的
    DisplayName
    创建多个
    ListObjects
    。这也会导致运行时错误

    但是,如果这些表位于单独的工作表上,就像您的查询一样,它们可以具有相同的
    名称
    ,Excel将通过添加一个
    \u n
    来调整
    显示名称
    ,其中n是一个数字,以防止重复命名

    (在同一工作表上仍然不能有具有相同
    名称的表)

    因此,我会尝试:

    Const sName As String = "Emp_Datta"
    
    On Error GoTo delQuery
        ActiveWorkbook.Queries.Add Name:=sName, Formula:= _
            "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(File.Contents(""C:\Users\Irfan.Shaikh\Desktop\Emp_Datta.csv""),[Delimiter="","", Columns=4, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""Promoted Headers"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Changed Type"" = Table.TransformColumnTypes(#""Promoted Headers"",{{""Name"", type text}, {""Age"", Int64.T" & _
            "ype}, {""City"", type text}, {""Salary"", Int64.Type}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Changed Type"""
    On Error GoTo 0
    
        ActiveWorkbook.Worksheets.Add
        With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
            "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Emp_Datta;Extended Properties=""""" _
            , Destination:=Range("$A$1")).QueryTable
            .CommandType = xlCmdSql
            .CommandText = Array("SELECT * FROM [Emp_Datta]")
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
    
            '---------------------
            .ListObject.Name = sName
            '---------------------
    
            .Refresh BackgroundQuery:=False
        End With
        Range("C7").Select
        ActiveCell.FormulaR1C1 = "Total"
        Range("D7").Select
        ActiveCell.FormulaR1C1 = "=SUM(Emp_Datta[Salary])"
        Range("D8").Select
    Exit Sub
    delQuery:
        Dim v
        For Each v In ActiveWorkbook.Queries
            If v.Name = sName Then _
                v.Delete
                Resume
        Next v
    MsgBox "Error No: " & Err.Number & vbLf & Err.Description
    Stop
    
    End Sub
    
    而且,除非有什么理由使用
    ActiveWorkbook
    ,否则我建议将这些引用更改为
    ThisWorkbook


    还要注意,如果您刷新查询,您将覆盖activesheet上的数据表;而如果执行宏,则将在新工作表上创建一个新表。

    如果在删除单元格数据时删除查询,则原则上上述宏将起作用。否则,如果查询已存在且csv数据结构为常量,则您可以选择在不运行宏的情况下刷新它。即使我删除查询,然后重新运行宏。我收到了我在OP中发布的错误。该错误对我来说意味着存在冲突且不起作用的查询。如果您通过删除范围(并回答“是”问题)来删除查询,则似乎您只是将其更改为仅连接的查询,而不是真正删除它。您需要使用VBA代码或在
    querys and Connections
    窗口中实际删除查询,才能真正删除它。谢谢您的帮助。我从查询窗口中删除了查询。现在可以理解为什么会出现错误。