Если вы удаляете запрос, удаляя Range (и отвечая «Да» на вопрос), кажется, что вы только изменяете его на запрос только для соединения и не удаляете его. Вам действительно нужно удалить запрос, либо с кодом VBA, либо в окне «Запросы и соединения», чтобы действительно удалить его.
Другая проблема с вашим запросом состоит в том, что вы будете создавать несколько ListObjects
с одним и тем же DisplayName
. Это также приведет к ошибке времени выполнения.
Однако, если таблицы находятся на отдельных листах, как в случае с вашим запросом, они могут иметь одинаковые значения Name
, и Excel добавит DisplayName
, добавив a _n
, где n - это число, чтобы предотвратить дублирование имен.
(Вы все еще не можете иметь таблицы с одинаковым Name
на одном листе).
Так что я бы попробуйте:
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
.
Также обратите внимание, что если вы При повторном запросе sh вы перезапишете таблицу данных на активном листе; тогда как при выполнении макроса вы будете создавать новую таблицу на новом листе.