【问题标题】:When using VBScript to open Excel workbook in the background, how to open another workbook at the same time?使用VBScript在后台打开Excel工作簿时,如何同时打开另一个工作簿?
【发布时间】:2020-05-16 07:18:48
【问题描述】:

我已经将一个用于删除不需要的行的 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 应用程序的单独实例)。谢谢大家!

【问题讨论】:

  • 使用 GetObject("Filename") 获取对 Excel 工作簿的引用..
  • 感谢您的评论!您能否让我知道 GetObject 和 Workbooks.Open 以打开工作簿有什么区别?我见过其他人写了GetObject,它可以打开工作簿,但实际上并没有看到使用它的区别/优势。
  • 您想打开一个文件,但您正在创建一个应用程序。然后出于未知原因复制此 App 对象。 GetObject("Fname!sheetname") 如果打开则切换到该文件,如果尚未打开则打开该文件.

标签: excel vba vbscript


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我使用的是 Excel 2007,Win 7 并且遇到了这个问题。后来我在另一台装有 Excel 365 和 Win 10 的电脑上试了试,看起来还不错……太奇怪了。使用Excel 2007和Win 7,如果我在开始运行这个程序后打开另一个工作簿,隐藏的实例会出现,我新打开的工作簿变得很慢,然后运行时有时会出错......还有一些工作簿打开很好,但有些与创建的实例共享相同的 Excel 应用程序......不确定这是否是 Excel 2007 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2023-04-01
相关资源
最近更新 更多