VBA Excel不会将数据复制到工作表

时间:2019-08-28 13:36:59

标签: excel vba

我正在尝试将一堆CSV文件中的数据复制到Excel文件的单独工作表中。我想为每个CSV文件创建一张工作表,如果要在复制新数据之前已经存在这些工作表,我想删除这些工作表(此部分工作正常)。

不幸的是,我的脚本似乎没有复制数据。该脚本运行时没有给我错误,但各个表中仍然没有数据。 省略删除已建立连接的最后一位不会更改任何内容。

非常感谢您。

“导入”工作表如下所示:

ColumnA           ColumnB
file_name         sheet_name

<pathTo>\1.csv    file_1
<pathTo>\2.csv    file_2
<pathTo>\3.csv    file_3
<pathTo>\4.csv    file_4

我的宏看起来像这样:

Sub AddAllFiles()
    Dim inputRow As Integer
    For inputRow = 3 To 20
        Dim fileName As String
        Dim outputSheet As String

        fileName = Sheets("import").Range("A" & inputRow).Value
        outputSheet = Sheets("import").Range("B" & inputRow).Value

        Dim checkSheetName As String
        On Error Resume Next
        checkSheetName = Worksheets(outputSheet).Name
        If checkSheetName <> "" Then
            Sheets(outputSheet).Delete
        End If
        Worksheets.Add.Name = outputSheet

        With Sheets(outputSheet).QueryTables.Add(Connection:="TEXT" & fileName, Destination:=Sheets(outputSheet).Range("$A$1"))
            .FieldName = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePlatform = 65001
            .TextFilePromptOnRefresh = False
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileConsecutiveDelimiter = True
            .TextFileSemicolonDelimiter = True
            .TextFileTabDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileTrailingMinusNumbers = True
            .PreserveColumnInfo = True
        End With

        Dim wb_connection As WorkbookConnection
        For Each wb_connection In ActiveWorkbook.Connections
            If InStr(fileName, wb_connection) > 0 Then
                wb_connection.Delete
            End If
        Next wb_connection

    Next inputRow

    MsgBox "Imported CSV Files"

End Sub

2 个答案:

答案 0 :(得分:1)

我更改了设置,并使用了Refresh功能。见下文。我还将分号添加到了Connection字符串中。

  

Refresh方法使Microsoft Excel连接到QueryTable对象的数据源,执行SQL查询,然后将数据返回到基于QueryTable对象的范围。 除非调用此方法,否则QueryTable对象不会与数据源通信。

因此,该连接存在,但尚未尝试打开连接。

此外,此方法可能会失败。如果您留下的代码中没有"TEXT;",则可能会收到错误消息。只是要考虑的事情。您可能需要对它进行一些错误处理。

  

建立数据库连接后,将验证SQL查询。如果查询无效,则Refresh方法将失败,并显示“ SQL语法错误”异常。

With Sheets(outputSheet).QueryTables.Add(Connection:="TEXT;" & fileName, Destination:=Sheets(outputSheet).Range("$A$1"))
    .CommandType = 0
    .RefreshPeriod = 0
    .Name = outputSheet
    .FieldName = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .Refresh BackgroundQuery:=True      ' This is the step I changed.
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePlatform = 65001
    .TextFilePromptOnRefresh = False
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileConsecutiveDelimiter = True
    .TextFileSemicolonDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileTrailingMinusNumbers = True
    .PreserveColumnInfo = True
    .PreserveColumnInfo = True
End With

答案 1 :(得分:0)

在分号到"TEXT"之后(感谢GibralterTop)

With Sheets(outputSheet).QueryTables.Add(Connection:="TEXT;" + fileName, Destination:=Sheets(outputSheet).Range("$A$1"))

并添加

.Refresh BackgroundQuery:=False

with节结束之前,我的问题似乎已经解决。由于我是VBA的新手,所以也许有人可以启发我,确切的错误是。