excel - 在 VBScript 中调用 Excel 工作表

标签 excel vbscript

我有以下代码:

Option Explicit
Randomize
Dim a, song, album
a = Int((Rnd*195)+1)
song = "B" & a
album = "A" & a

Dim objApp, objWbs, objWorkbook, objSheet

Set objApp = CreateObject("Excel.Application")
Set objWbs = objApp.WorkBooks
objApp.Visible = False
Set objWorkbook = objWbs.Open("C:\Users\Name\Documents\Music.xlsx")
Set objSheet = objWorkbook.Sheets("Sheet1")

song = objSheet.Range(song).Value 
album = objSheet.Range(album).Value

objWorkbook.Close False
objWbs.Close 
objApp.Quit 

Set objSheet = Nothing
Set objWorkbook = Nothing
Set objWbs = Nothing
Set objApp = Nothing

MsgBox("Album name: " & album & vbNewLine & "Song name: " & song)

它在 Excel 工作表“音乐”的第 1 行和第 195 行之间打印两个随机单元格。其中一个 - A 列中的一个 - 代表专辑,另一个代表歌曲。问题是返回结果需要相当长的时间,大约 20 秒。

我想知道是否有更有效的方法可以用来更快地获得结果。

最佳答案

我认为 Ansgar Wiechers' answer启动 Excel 是脚本中最慢的部分可能是正确的。您可以尝试使用 ADO 连接到 Excel 文件,就好像它是一个数据库一样。这将避免启动 Excel:

Option Explicit

Randomize
Dim conn, rst, song, album

Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=C:\Users\Name\Documents\Music.xlsx;" & _
    "Extended Properties='Excel 12.0 Xml;HDR=NO';"

' Select a random record; reference https://stackoverflow.com/a/9937263/249624
' Asc(album) is just a way to get some numeric value from the existing data
Set rst = conn.Execute("SELECT TOP 1 F1 AS album, F2 as song FROM [Sheet1$] ORDER BY Rnd(-(100000*Asc(F1))*Time())")

If rst.EOF Then
    song = "[NO RECORDS]"
    album = "[NO RECORDS]"
Else
    song = rst("song").Value
    album = rst("album").Value
End If

MsgBox("Album name: " & album & vbNewLine & "Song name: " & song)

这里的一个可能问题是 VBScript 默认使用 64 位版本的 wscript.exe 运行,而 64 位 ACE.OLEDB 仅在您安装了 64 位版本的 Office 2010 或更高版本时才可用。不过,这可以通过使用 32 位版本的 wscript.exe 运行脚本来解决(例如,参见 How do I run a VBScript in 32-bit mode on a 64-bit machine? )。

如果您决定走这条路并且可以控制输入 Excel 文件,我建议您在电子表格中添加标题行并更改 HDR=NOHDR=YES在连接字符串中。这样,您可以在查询中按名称引用列(例如 SELECT TOP 1 album, song ... ),而不是依赖“F1”语法。

关于excel - 在 VBScript 中调用 Excel 工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22279384/

相关文章:

mysql - 来自 EXCEL for MySQL 的数据文件

vbscript - 仅获取子文件夹的文件夹大小,而忽略任何其他内容?

未登录时 Excel 不会启动

windows - CreateObject 和 Wscript.CreateObject 有什么区别?

vba - 使用 Trimmean 平均列的动态范围

vba - 将某行数据移入列

c# - Excel 目标搜索算法

Excel:模拟具有给定均值、标准差、偏度和峰度的整数随机样本

vbscript - 如何暂停 vbscript 执行?

regex - 使用 vbscript 表示两个数字的正则表达式 : not valid :"$123456789012" and valid: "12345678912"