excel - 使用VBScript在后台打开Excel工作簿时,如何同时打开另一个工作簿?
问题描述
我已经将一个用于删除不需要的行的 VBA 程序转换为 VBScript,因为我想在后台执行该程序,同时我可以打开另一个工作簿来做其他事情。(如果首先用 VBA 编写,我必须打开工作簿并运行宏,而不是双击图标并运行,其次,在宏完成之前,我无法使用任何其他 excel 工作簿,在此期间,excel 应用程序将被冻结)
下面是我的程序,如果我不打开另一个工作簿,它工作正常。关键实际上是如何让它在后台运行,这样我就可以同时处理另一个工作簿。如果我打开另一个工作簿,“abc.xlsx”也出现在任务栏中,然后出现一些运行时错误,但是,在我的程序中,每个 excel 对象都正确引用到“abc.xlsx”中的工作表。
我尝试过类似的方法:objExcel.Visible = False 和 objExcel.ScreenUpdating = False,但不幸的是没有用。
Dim FilePatch, objExcel, xlApp, wb, ws
FilePath = "C:\abc.xlsx"
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
objExcel.ScreenUpdating = False
Set xlApp = objExcel.Application
Set wb = xlApp.Workbooks.Open(FilePath)
Set ws = wb.Worksheets(1)
const xlDown = -4121
Dim nr, Amt, n, i
nr = ws.Range("K1").End(xlDown).Row
Amt = ws.Range("K2:K" & nr).Value
For i = 2 To nr
If Amt(i - 1, 1) = 0 Then
n = n + 1
End If
Next
Dim breakinto, multiple
breakinto = 500
remainder = n Mod breakinto
multiple = Int(n / breakinto)
Dim rng, Z(), j, k
For k = 1 To multiple + 1
nr = ws.Range("K1").End(xlDown).Row
Amt = ws.Range("K2:K" & nr).Value
n = 0
Erase Z
For i = 2 To nr
If Amt(i - 1, 1) = 0 Then
n = n + 1
ReDim Preserve Z(n)
Z(n) = i
End If
Next
Set rng = ws.Rows(Z(1))
If k = multiple + 1 Then
For j = 2 To remainder
Set rng = Xlapp.Union(rng, ws.Rows(Z(j)))
Next
rng.Delete
Else
For j = 2 To breakinto
Set rng = Xlapp.Union(rng, ws.Rows(Z(j)))
Next
rng.Delete
End If
Next
wb.Close True
objExcel.Quit
Set objExcel = Nothing
MsgBox "Completed"
WScript.Quit
请让我知道要修改什么,以便在不干扰另一个打开的工作簿的后台运行它(作为 excel 应用程序的单独实例)。谢谢大家!
解决方案
我无法复制它(Excel 365、Win10)如果我启动一个隐藏的 Excel 实例并添加一个工作簿,即使我随后从任务栏启动 Excel 并打开另一个文件,它也会保持隐藏状态。隐藏实例中的文件不会显示在第二个(可见)实例中。
测试脚本:
Dim objExcel, xlApp, wb, ws, c
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = false
Set wb = xlApp.Workbooks.add()
Set ws = wb.Worksheets(1)
Set c = ws.range("A1")
'loop while staying hidden for about 30sec, then switch to visible
Do
c.value = "Hello"
Set c = c.offset(1,0)
If c.row > 10 Then
xlApp.Visible = True
Exit Do
End If
WScript.Sleep(3000) 'msec
Loop
即使隐藏的实例变得可见并且 vbscript 退出,它们仍然是两个独立的实例。
推荐阅读
- python - 如果将光标悬停在小部件的特定区域上,则更改光标
- flutter - sms_autofill 无法检测到 OTP
- python - 如何在 Python 中找到以下问题的最小值?
- python - Tkinter 回调中的异常 - TypeError:字符串格式化期间并非所有参数都转换
- python - Python 流中的第一个非重复字符
- java - 集群标记显示不准确
- ansible - 如何在不更改 .rb 文件的情况下通过 Vagrantfile 扩展 vagrant 插件?
- shell - 在 pod 远程 openshift 或 kubernetes 中运行 shell 脚本
- ruby-on-rails - Rails + Big Sur + pg 和 Spring 冲突?
- angular - Angular SSR First Paint 在加载 styles.css 后出现