我正在尝试将一堆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
答案 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的新手,所以也许有人可以启发我,确切的错误是。