Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 能给我解释一下这个代码吗?_Excel_Vba - Fatal编程技术网

Excel 能给我解释一下这个代码吗?

Excel 能给我解释一下这个代码吗?,excel,vba,Excel,Vba,我有下面的工作VBA代码。它在一个新列中列出了序列中缺少的数字,但我现在不知道代码是如何工作的。我不理解For循环和scripting.dictionary Const rng As String = "$a$2:$a$218" Dim d As Object, a, c() Dim i As Long, mx As Long, mn As Long Set d = CreateObject("scripting.dictionary") a = Range(rng) mx = Applic

我有下面的工作VBA代码。它在一个新列中列出了序列中缺少的数字,但我现在不知道代码是如何工作的。我不理解For循环和scripting.dictionary

Const rng As String = "$a$2:$a$218"
Dim d As Object, a, c()
Dim i As Long, mx As Long, mn As Long

Set d = CreateObject("scripting.dictionary")
a = Range(rng)

mx = Application.Max(a): mn = Application.Min(a)

ReDim c(1 To mx - mn + 1, 1 To 1)


For i = 1 To UBound(a): d(a(i, 1)) = 1: Next i

For i = mn To mx
    If d(i) <> 1 Then k = k + 1: c(k, 1) = i
Next i


Range("d2").Resize(k) = c
Const rng As String=“$a$2:$a$218”
尺寸d作为对象,a,c()
Dim i为长,mx为长,mn为长
Set d=CreateObject(“scripting.dictionary”)
a=范围(rng)
mx=Application.Max(a):mn=Application.Min(a)
雷迪姆c(1对mx-mn+1,1对1)
对于i=1到UBound(a):d(a(i,1))=1:下一个i
对于i=mn到mx
如果d(i)1,那么k=k+1:c(k,1)=i
接下来我
范围(“d2”)。调整大小(k)=c

有人能帮我吗?

这个外观将告诉您有关
字典的内容
对象:

您还可以在此处查看文档:

你的代码正在做什么

创建dictionary对象并分配给变量
d

Set d = CreateObject("scripting.dictionary")
a = Range(rng)
mx = Application.Max(a): mn = Application.Min(a)
ReDim c(1 To mx - mn + 1, 1 To 1)
For i = 1 To UBound(a): d(a(i, 1)) = 1: Next i
将指定范围常数中的值分配给范围数组,
a

Set d = CreateObject("scripting.dictionary")
a = Range(rng)
mx = Application.Max(a): mn = Application.Min(a)
ReDim c(1 To mx - mn + 1, 1 To 1)
For i = 1 To UBound(a): d(a(i, 1)) = 1: Next i
确定范围数组中的最小值和最大值,
a

Set d = CreateObject("scripting.dictionary")
a = Range(rng)
mx = Application.Max(a): mn = Application.Min(a)
ReDim c(1 To mx - mn + 1, 1 To 1)
For i = 1 To UBound(a): d(a(i, 1)) = 1: Next i
重新确定数组
c
的尺寸,以便它将在
mn
mx
之间保留适当数量的值

Set d = CreateObject("scripting.dictionary")
a = Range(rng)
mx = Application.Max(a): mn = Application.Min(a)
ReDim c(1 To mx - mn + 1, 1 To 1)
For i = 1 To UBound(a): d(a(i, 1)) = 1: Next i
将范围数组
a
中的每个项放入字典对象
d

Set d = CreateObject("scripting.dictionary")
a = Range(rng)
mx = Application.Max(a): mn = Application.Min(a)
ReDim c(1 To mx - mn + 1, 1 To 1)
For i = 1 To UBound(a): d(a(i, 1)) = 1: Next i
mn
循环到
mx
,基本上检查字典
d
中是否存在该值,如果不存在,则将该值放入数组
c

For i = mn To mx
    If d(i) <> 1 Then k = k + 1: c(k, 1) = i
Next i
更新:可能修改为:

Const rng As String = "$a$2:$a$218"
Sub DoThis()
Dim d As Object, a, c()
Dim i As Long, mx As Long, mn As Long

Set d = CreateObject("scripting.dictionary")
a = Range(rng)

mx = Application.Max(a): mn = Application.Min(a)

For i = mn To mx: d(i) = True: Next i

For i = 1 To UBound(a, 1)
    '# You should not actually NEED to use the If d.Exists, 
    ' you can probably just do:
    ' d.Remove(a(i, 1))
    ' but just in case, I test to see if it exists:
    If d.Exists(a(i, 1)) Then d.Remove(a(i, 1))
Next i

Range("d2").Resize(UBound(d.Keys()) + 1) = Application.Transpose(d.Keys())
End Sub

我我并不感到奇怪,因为编写它的人使用了一些非常隐晦的命名约定(例如,
rng
是“传统上”的
范围对象,而不是字符串),
a
不是很有描述性(可以改为“initialValuesArr”)。不管怎样,David Zemens的回答很好地解决了这个问题谢谢你的详细解释,这正是我想要的,现在我可以在理解代码的同时使用它了^ ^没问题!我发布的修订版应该做同样的事情,但它绕过了其中两个循环,通过直接将字典的
Keys()
(已经是一个数组!)打印到工作表中,我们避免了使用变量
c