Ошибка импорта данных из файла CSV: запрос с именем ... уже существует - PullRequest
1 голос
/ 25 января 2020

Я пытаюсь импортировать данные из файла .csv и затем получить сумму последнего столбца.

Содержимое файла CSV:

Name,Age,City,Salary
Rick,25,Dallas,1800
Nick,28,Austin,2500
Jack,30,NYC,3500
Rose,26,Dallas,2400

Макрос выдает следующую ошибку .
Macro Error

Код выглядит следующим образом.

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

У меня два вопроса.

  1. Когда я прекращаю запись макроса и удаляю импортированные данные. Есть предупреждение для подтверждения удаления запроса. Каково влияние Да и Нет?

  2. Я искал в Интернете ошибку, но не нашел решения. Связано ли это с удалением запроса при удалении импортированных данных?

1 Ответ

1 голос
/ 26 января 2020

Если вы удаляете запрос, удаляя 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 вы перезапишете таблицу данных на активном листе; тогда как при выполнении макроса вы будете создавать новую таблицу на новом листе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...