Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 爱疯

[已解决]单元格赋值提速

[复制链接]
发表于 2010-8-25 11:08 | 显示全部楼层

上面我的代码错误点在

Dim Col As Byte

改成

Dim Col As Integer就可以了,平时对Col的定义习惯了,整行选择的时候overflow;了

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2010-8-25 11:10 | 显示全部楼层

如果区域存在N个单元格,是不是:

读N次、写1次的时间 < 读N次、写N次的时间

[em09]
[此贴子已经被作者于2010-8-25 11:12:32编辑过]
回复

使用道具 举报

 楼主| 发表于 2010-8-25 11:16 | 显示全部楼层

如果可以字典:

key的值是单元格(不是单元格的值)

item为key中单元格的地址。

这样就是读N次,写1次了,就能提速,是吗?

[em09]
回复

使用道具 举报

 楼主| 发表于 2010-8-25 11:18 | 显示全部楼层

当然,还是没断了幻想捷径的念头[em11]
回复

使用道具 举报

发表于 2010-8-25 11:33 | 显示全部楼层    本楼为最佳答案   

又快了一点,编写了一个改写地址的函数

Sub aa()
    Dim Rng As Range
    Dim ArrTemp() As String
    Dim RowN&, ColN&
    Application.ScreenUpdating = False
    t = Timer
    For Each Rng In Selection.AreaS
        RowN = Rng.Rows.Count
        ColN = Rng.Columns.Count
        ReDim ArrTemp(1 To RowN, 1 To ColN) As String
        With Rng
            For i = 1 To RowN
                ArrTemp(i, 1) = .Item(i, 1).Address
                For j = 2 To ColN
                    ArrTemp(i, j) = MyAdd(ArrTemp(i, j - 1))
                Next j
            Next i
            .Value = ArrTemp
        End With
    Next Rng
    MsgBox Timer - t
    Application.ScreenUpdating = True
End Sub
Function MyAdd(Add)
    Dim Arr() As String
    Dim strC$
    Dim Temp$
    Dim BlnJW As Boolean
    Arr = Split(Add, "$")
    strC$ = Arr(1)
    BlnJW = True
    For i = Len(strC$) To 1 Step -1
        Temp$ = Mid$(strC$, i, 1)
        If BlnJW Then
            If Temp$ = "Z" Then
                Mid$(strC$, i, 1) = "A"
                BlnJW = True
            Else
                Mid$(strC$, i, 1) = Chr(Asc(Temp$) + 1)
                BlnJW = False
            End If
        End If
    Next i
    If BlnJW Then strC$ = "A" & strC$
    MyAdd = "$" & strC & "$" & Arr(2)
End Function

回复

使用道具 举报

 楼主| 发表于 2010-8-25 11:44 | 显示全部楼层

测试范围:A1:D20000

1楼:约13.22秒

6楼:约3.32秒

15楼:约2.31秒

.... 只求了解大概,更快的原理为什么啊[em19][em19]

[此贴子已经被作者于2010-8-25 11:45:33编辑过]
回复

使用道具 举报

 楼主| 发表于 2010-8-25 11:52 | 显示全部楼层

请问

For Each x In Selection

For Each Rng In Selection.AreaS

的区别是什么呀?

[em09]
回复

使用道具 举报

 楼主| 发表于 2010-8-25 12:02 | 显示全部楼层


Sub bb()
    Dim d As Object
    Dim x As Range
    Dim t As Single
    Dim arr
   
    arr = Selection
    Application.ScreenUpdating = False
    t = Timer
    Set d = CreateObject("scripting.dictionary")
    For Each x In Selection
        d(x) = x.Address
    Next x
    '
    '待补充:一行转为区域的方法
    '
    Selection.Cells(1).Resize(20000, 4) = d.items
    MsgBox Timer - t
    Application.ScreenUpdating = True

End Sub

先这样测试,字典也是可以完成的。具体,还得再想。

回复

使用道具 举报

 楼主| 发表于 2010-8-25 12:04 | 显示全部楼层

下班吃饭去了,

谢谢阿木、DJ,学习!!

啊,为了提高一点速度,竟然要这么大力气[em11]

[此贴子已经被作者于2010-8-25 12:06:39编辑过]
回复

使用道具 举报

发表于 2010-8-25 12:50 | 显示全部楼层

要提高速度,应该遵循以下几个原则:

1、减少对象的访问(包括属性的读取和写入)

2、关闭屏幕刷新

3、减少循环(总运算次数)

4、减少某些内置函数的使用,尽量用基本的运算符

5、减少数组元素的访问(需要多次访问同一数组元素的,可以用临时变量代替)

6、赋值时候标明变量类型

7、尽量用地址方式传递变量的值

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-14 01:20 , Processed in 0.305421 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表