以下是引用easyppt在2021-11-24 16:21:37的发言:
应该是无解,可能Excel的合并区域Union 就是轻量级应用,多了就是卡。
另外发现1楼代码本身也有问题,即:Set rng = [a1] 放在循环内,没有实际意义。
谢谢,这个话题可以不用研究了,关闭吧。
应该不是什么轻量级、重量级的问题
VFP的CREATEOBJECT("Excel.Application")是跨进程调用,相对在EXCEL的VBA是快不了的。
可以考虑动态创建EXCEL的宏代码,VFP启动这个宏,这样应该与EXCEL调用宏差不多。
这里测试test2()显示1秒多
程序代码:
TEXT TO vbaCode TEXTMERGE NOSHOW PRETEXT 7
sub test2()
tms = timer
for i = 1 to 1000
set rng = [a1]
for j = 1 to 30
r = int(rnd * 10000) + 1
set rng = union(rng, cells(r))
next
next
msgbox format(timer - tms, "0.000s ")
end sub
ENDTEXT
oExcel = CREATEOBJECT("Excel.Application")
regKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\"+oExcel.Version+"\Excel\Security\AccessVBOM"
se = CREATEOBJECT("WScript.Shell")
se.RegWrite(regKey, 1, "REG_DWORD")
oExcel.DisplayAlerts = 0
oExcel.WorkBooks.Add
myModule = oExcel.ActiveWorkbook.VBProject.VBComponents.Add(1) && vbext_ct_StdModule = 1
myModule.CodeModule.AddFromString(vbaCode)
oExcel.Run("test2")
oExcel.ActiveWorkbook.VBProject.VBComponents.Remove(myModule)
se.RegWrite(regKey, 0, "REG_DWORD")
oExcel.Visible = 1