强制Python脚本不等待VBA宏结束

1 投票
2 回答
1110 浏览
提问于 2025-04-18 08:43

我在一个Python脚本中运行一个很长的Excel VBA宏(大约需要10到15分钟)。我想为最终用户制作一个进度条。为了让宏和Python脚本之间能够沟通,我尝试在一个文本文件中写入VBA宏的进度百分比,然后在我的.py文件中把这个数字用在进度条(用Qt做的)上。问题是:Python脚本会等到宏完成后才去读取文本文件的值。我想找一种方法,让Python在不等宏完成的情况下,直接执行下一个命令。以下是我尝试过但没有成功的.py代码:

from PyQt4 import QtGui, QtCore
import sys

import progress
import win32com.client

class Progress(QtGui.QDialog, progress.Ui_Progress):
    def __init__(self, parent=None):
        super(Progress, self).__init__(parent)
        self.setupUi(self)
        self.progressBar.setValue(0)

    def main(self):
        self.show()

    def evolution(self, a):
        self.progressBar.setValue(a)

if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    progress = Progress()
    progress.main()
    xl=win32com.client.Dispatch("Excel.Application")
    xl.Workbooks.Open(Filename="filename",ReadOnly=1)
    xl.Application.ScreenUpdating = False
    xl.Application.Run("myscript")
    while a < 100
        file = open('newfile.txt', 'r')
        a = int(file.read())
        progress.evolution(a)
        file.close()
    app.exec_()


def main():
    pass

2 个回答

1

如果你不想在VB脚本中制作进度条,像其他人建议的那样,你可以使用线程。我觉得改一下VBA会更好,但如果你出于某种原因真的不想这样做,下面的修改应该可以解决问题:

import threading
import time
... # imports, progress class unchanged

# probably want to add arguments to make generic, but not required
def run_vba_script():
    xl=win32com.client.Dispatch("Excel.Application")
    xl.Workbooks.Open(Filename="filename",ReadOnly=1)
    xl.Application.ScreenUpdating = False
    xl.Application.Run("myscript")

if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    progress = Progress()
    progress.main()

    vb_thread = threading.Thread(target=run_vba_script)
    vb_thread.start()

    while vb_thread.is_alive():
        file = open('newfile.txt', 'r')
        a = int(file.read())
        progress.evolution(a)
        file.close()
        # only check once a second to not eat your file system and processor alive
        time.sleep(1)
    app.exec_()
2

为什么不直接在Excel的VBA代码中创建一个用户表单作为进度条呢?

http://www.ehow.com/how_7764247_create-progress-bar-vba.html

撰写回答