Excel 从CSV文件导入数据错误:名称为。。。已经存在
我正在尝试从.csv文件导入数据,然后获取最后一列的总和 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
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
窗口中实际删除查询,才能真正删除它。谢谢您的帮助。我从查询窗口中删除了查询。现在可以理解为什么会出现错误。