强制Python脚本不等待VBA宏结束
我在一个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