标题:请教各位关于Excel 的 Union
只看楼主
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
结帖率:100%
 问题点数:0 回复次数:10 
请教各位关于Excel 的 Union
但是这样少量多次反复循环操作的话,合并3万次不到1秒。
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
复制代码

上面的代码来自 网上的,请问如何转换为VFP,且速度一样快。
搜索更多相关主题的帖子: For Union Set Excel Next 
2021-11-24 11:03
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
set rng = [a1]

set rng = Union(rgn,cells(r))
这二句为何意???

只求每天有一丁点儿的进步就可以了
2021-11-24 13:16
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:0 
应该是无解,可能Excel的合并区域Union 就是轻量级应用,多了就是卡。

另外发现1楼代码本身也有问题,即:Set rng = [a1] 放在循环内,没有实际意义。

谢谢,这个话题可以不用研究了,关闭吧。
2021-11-24 16:21
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用easyppt在2021-11-24 16:21:37的发言:

应该是无解,可能Excel的合并区域Union 就是轻量级应用,多了就是卡。

另外发现1楼代码本身也有问题,即:Set rng = [a1] 放在循环内,没有实际意义。

谢谢,这个话题可以不用研究了,关闭吧。

关键是要求“速度一样快”,这一定是无解了
随便写个速度肯定不一样快的示例

程序代码:
oExcel = CREATEOBJECT("Excel.Application")
oExcel.DisplayAlerts = 0
oExcel.WorkBooks.Add
tms = SECONDS()
RAND(-1)
n = 10
FOR i=1 TO n
    rng = oExcel.Range("A1")
    FOR j=1 TO 30
        r = INT(RAND()*n) + 1
        rng = oExcel.Union(rng, oExcel.Cells(r))
    ENDFOR 
ENDFOR
? SECONDS()-tms
rng.Interior.color = 0xFF
oExcel.Visible = 1

2021-11-24 18:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
EXCEL2003列数最大是256
n=1000时要70多秒
程序代码:
tms = SECONDS()
RAND(-1)
n = 1000
nCols = 256
FOR i=1 TO n
    rng = oExcel.Range("A1")
    FOR j=1 TO 30
        r = INT(RAND()*nCols) + 1
        rng = oExcel.Union(rng, oExcel.Cells(r))
    ENDFOR 
ENDFOR
? SECONDS()-tms

2021-11-24 18:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
FOR i=1 TO 1000
    rng = oExcel.Range("A1")
ENDFOR
这个循环的是什么意思
2021-11-24 19:25
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:40
帖 子:749
专家分:2475
注 册:2011-5-8
得分:0 
这个好像只是测试机器性能的一个函数。
Union()作用微软帮助文件有说明
Set rng = [a1]
放在循环中是有意义的,保证每次进入内循环前rng指向A1。因为内循环结束后,rng的指向不定。

dBase有人接盘了。
2021-11-24 20:45
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:0 
谢谢各位老师!
2021-11-24 22:41
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用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


2021-12-06 16:08
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:0 
吹版主的VBA技术太好了!  

有些操作人员不懂怎么启用宏,还要教,麻烦,所以启用宏不是很方便。
2021-12-06 17:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507626-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.101637 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved