【发布时间】: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")如果打开则切换到该文件,如果尚未打开则打开该文件.