我使用的是2013 32位Excel。
我试图在代码中更改数据连接中文本文件的名称(见下文)。它最初是通过录制宏来在电子表格中手动设置的:
Data
标签→From Text
→Get External Data group
此电子表格中有多个连接,都是手动设置的,所有连接都需要在代码中更新。它们都是相同类型的连接:文本。
当我执行下面的代码时,Excel会在 Refresh
语句中返回错误:
"Method 'Refresh' of object 'WorkbookConnection' failed"
然后我再次步骤,这次它成功执行Refresh
语句,因为它没有返回错误。但是当我按F5
继续时,Excel崩溃了。
Dim wC As WorkbookConnection
Dim rG As Range
Dim rSummary As Range
Dim sh As Worksheet
Dim sChangeValue As String
Dim sWorksheetName As String
Dim sDataTableName As String
Dim sConnection As String
Dim lo As ListObject
For Each wC In ActiveWorkbook.Connections
If wC.Type = xlConnectionTypeTEXT Then
'I say "For Each", but in practice there is only one range per sheet
For Each rG In wC.Ranges
Set rSummary = Sheets("Summary").ListObjects("d_QueryTable").Range
sChangeValue = Application.WorksheetFunction.VLookup(wC.Name, rSummary, 7, False)
If sChangeValue = "Y" Then
sWorksheetName = Application.WorksheetFunction.VLookup(wC.Name, rSummary, 2, False)
sDataTableName = Application.WorksheetFunction.VLookup(wC.Name, rSummary, 3, False)
sConnection = Application.WorksheetFunction.VLookup(wC.Name, rSummary, 10, False)
With wC
.TextConnection.Connection = sConnection
.Refresh
End With
'sh(sWorksheetName).ListObjects(sDataTableName).TableObject.Refresh
End If
Next rG
End If
Next wC
wC.TextConnection.Connection
字段的值为
"TEXT;Y:\Investigations\run_49.csv"
为了测试目的,我将其更改为存储在sConnection
中的值是相同的。但为什么我会得到刷新错误?那为什么Excel会崩溃?
所有帮助表示赞赏。
答案 0 :(得分:0)
可能您收到错误,因为.TextConnection.Connection
在.Refresh
之前,而SQL Server根本不喜欢它。
一般来说,SQL Server中的.Connection
实际上是一种可传递的信息(非常敏感,在整个SQL Server中没有任何更敏感的方式),SQL Server避免像这样设置它。试试这个以查看散列,其中SQL Server保留连接字符串:
Sub TestME()
Dim wC As WorkbookConnection
Dim rG As Range
Dim rSummary As Range
For Each wC In ActiveWorkbook.Connections
For Each rG In wC.Ranges
Set rSummary = Worksheets(1).Range("A1:H100")
With wC
Debug.Print .OLEDBConnection.Connection
.Refresh
End With
Next rG
Next wC
End Sub
它应该是大约1000个随机标志,印在即时窗口上。
答案 1 :(得分:0)
根据我的经验,几乎所有的VBA崩溃都是由内存问题引起的,通常会以某种方式错误地处理对象。
我敢打赌这是因为这一行:
Set rSummary = Sheets("Summary").ListObjects("d_QueryTable").Range
你是"重新 - Set
"这个对象多次,前两个循环的每次迭代。
由于可能只需将 设置为 ,因此请将该行移至第一个For
语句之前。