首页 > 解决方案 > 使用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 应用程序的单独实例)。谢谢大家!

标签: excelvbavbscript

解决方案


我无法复制它(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 退出,它们仍然是两个独立的实例。


推荐阅读