Excel精英培训网

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

[已解决]随机问题-怎么打乱顺序才好

[复制链接]
 楼主| 发表于 2010-2-11 10:22 | 显示全部楼层

QUOTE:
以下是引用搁浅2008在2010-2-11 9:38:00的发言:
Sub tt()
    Dim arr
    Dim arr2
    Dim i As Long
    Dim j As Long
    Dim m As Long
    Dim d As Object
    Set d = CreateObject("scripting.dictionary")
    Do
        m = Int(Rnd() * 9 + 1)
        d(m) = ""
    Loop Until d.Count = 9
    arr = d.keys
    ReDim arr2(1 To 3, 1 To 3)
    For i = 1 To 3
        For j = 1 To 3
            arr2(i, j) = arr(i * 3 + j - 4)
        Next j
    Next i

    Range("A1:C3") = arr2
End Sub

     Dim x
    '
    '
    '
    For Each x In arr2
        x = arr(i)
        i = i + 1
    Next x

我想这样替换蓝色的部分,为什么不行呢[em03]

回复

使用道具 举报

发表于 2010-2-11 10:36 | 显示全部楼层

嘿嘿 我还一个问题呢 

    Dim d As Object
    Set d = CreateObject("scripting.dictionary")声明字典 不可以x=d.keys(1)

和 手工引用SCRRUN.DLL 然后Dim d As New Dictionary 声明字典 可以x=d.keys(1)

回复

使用道具 举报

发表于 2010-2-11 10:39 | 显示全部楼层

QUOTE:
以下是引用爱疯在2010-2-11 10:22:00的发言:

     Dim x
    '
    '
    '
    For Each x In arr2
        x = arr(i)
        i = i + 1
    Next x

我想这样替换蓝色的部分,为什么不行呢[em03]

这个for传递的是值,不是地址。

因为这里X是个单独的变量,这个X变量与arr2的地址是不一样的。你改变的始终是X的值,而不是真正存放arr2的内存的值。

所以通过这个方式是不能改变数组的值的。

回复

使用道具 举报

 楼主| 发表于 2010-2-11 11:09 | 显示全部楼层

QUOTE:
以下是引用amulee在2010-2-11 10:39:00的发言:

这个for传递的是值,不是地址。

因为这里X是个单独的变量,这个X变量与arr2的地址是不一样的。你改变的始终是X的值,而不是真正存放arr2的内存的值。

所以通过这个方式是不能改变数组的值的。

哦,又去看了1次for each帮助:

  • 非数组中for each,x才是一个元素(对象);
  • 数组中,x就是一个Variant 变量。

所以这儿,即使不理解“x就是一个Variant 变量”是什么含义,但至少肯定不是arr2中的数组元素,是这样吧?那“x就是一个Variant 变量”的到底是什么意思呀?

[此贴子已经被作者于2010-2-11 11:09:52编辑过]
回复

使用道具 举报

发表于 2010-2-11 11:29 | 显示全部楼层

group必要参数。对象集合或数组的名称(用户定义类型的数组除外)。
用户定义的除外[em06]
回复

使用道具 举报

发表于 2010-2-11 11:38 | 显示全部楼层

看看这个有帮助么?
Sub Test1()
    Dim x As Range  '指定了x的类型
    Range("A1:C3").Clear
    i = 1
    For Each x In Range("A1:C3")
        x = i       'range对象的value属性赋值
        i = i + 1
    Next x
End Sub
Sub Test2()
    Dim x   '未指定x的类型
    Range("A1:C3").Clear
    i = 1
    For Each x In Range("A1:C3")
        x = i       '给x变量赋值,同时改变了类型
        i = i + 1
    Next x
End Sub
Sub Test3()
    Dim x
    Range("A1:C3").Clear
    i = 1
    For Each x In Range("A1:C3")
        x.Value = i       '给x变量的value属性赋值
        i = i + 1
    Next x
End Sub
Sub Test4() '在数组中遍历。由于数组中元素类型不确定,x为Variant类型。
    Dim x
    Call Test1
    i = 1
    For Each x In Range("A1:C3").Value
        '当到这里的时候x的值已经等于数组中的元素了,但是x与数组是两个不同的变量。
        '所以改变下面x的值之后只能改变x变量,不能改变数组变量
        x = i      '给x变量的赋值
        i = i + 1
    Next x
End Sub

回复

使用道具 举报

 楼主| 发表于 2010-2-11 13:59 | 显示全部楼层

谢谢阿木!

不声明x数据类型的话,在数组中遍历,

从首次执行for each这1句后,x由empty变为double型,再执行循环体(x=i),x=i后,x又变为int型 ...

也就说x将从empty,变为double,再变为int(或其他数据类型),...,总之是会变的,这样,x只能被动的成为variant数据类型,无法有什么特别意义了。

通过16楼的比较,我觉得这就是14楼解答。是吧[em04]

回复

使用道具 举报

发表于 2010-2-12 11:19 | 显示全部楼层

好多方法哦,值得好好学习。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-1 16:45 , Processed in 0.197393 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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