我们正在使用 Excel 插件从第三方应用程序获取报告,但速度非常慢,因此我最好只为这个特定的工作簿启用它。是否可以只为这个工作簿启用插件?
答案1
我按照@PeterH 在您的问题评论中描述的方式做了。实际上还要多做一点,这是我未更改的代码(连接字符串除外):
Sub getGrantInfo()
For Each makeSheet In Worksheets("Data").ListObjects("grantTable").ListRows
Sheets.Add Before:=Worksheets(1)
ActiveSheet.Name = makeSheet.Range.Cells(1, 1).Value
'get data
With Worksheets(makeSheet.Range.Cells(1, 1).Value).ListObjects.Add(SourceType:=0, Source:=Array( _
"OLEDB;Provider=OraOLEDB.Oracle.1;Password="******";Persist Security Info=True;User ID=*****;Data Source=******;Extended Properties=""" _
, """"), Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = makeSheet.Range.Cells(1, 2).Value
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = makeSheet.Range.Cells(1, 1).Value
.Refresh BackgroundQuery:=False
End With
ActiveWorkbook.Connections.Item(1).Delete
Next makeSheet
End Sub
至于解释,这个 VBA:
- 循环遍历
For Each-Next
工作表名称和 SQL 的表格(块)以获取该工作表上的数据,请参见屏幕截图示例,我不记得 Excel 可以为该表格处理的工作表数量是否存在实际限制。 - 添加新工作表,并根据表格中工作表列中的名称命名
- 该
With-End With
块正在与数据库建立连接(请注意,密码、用户 ID 和来源我已更改为星号),您的连接将根据数据库提供商的不同而有所不同。因此,我建议录制一个宏来创建连接。但如果我没记错的话,它会创建整个With-End With
块。 - 请注意,该
Destination:=
命令告诉在工作表上开始放置数据的位置。 - 请注意,
.CommandText
该变量是来自表的 SQL。 - 请注意,
.ListObject.DisplayName
这是在新工作表上创建的表的命名。 - 删除刚刚使用的连接。如果我没记错的话,如果您不在这里删除,它将继续添加新连接(迭代数字 1),我认为您必须创建一个新循环才能一次删除一个,我认为您不能一次删除所有连接。
总之,我相信您只需要将With-End With
块修改为您的连接,ActiveWorkbook.Connections.Item(1).Delete
然后修改命令,并进行其他修改以准确执行您要查找的操作(例如,将数据复制并粘贴到非宏文件中)。
我把整个例程放出来是为了给其他人提供可能的想法,以自动从数据源中提取数据,或者可能通过修改从更多数据源中提取数据。