有人可以向我解释一下这段代码吗?

-5 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 = 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
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗?

Dav*_*ens 5

这看起来会告诉你关于这个Dictionary对象:

http://www.snb-vba.eu/VBA_Dictionary_en.html

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

http://msdn.microsoft.com/en-us/library/office/aa164502(v=office.10).aspx

你的代码正在做什么......

创建字典对象并分配给变量 d

Set d = CreateObject("scripting.dictionary")
Run Code Online (Sandbox Code Playgroud)

将指定范围常量的值分配给范围数组, a

a = Range(rng)
Run Code Online (Sandbox Code Playgroud)

确定范围数组中的最小值和最大值, a

mx = Application.Max(a): mn = Application.Min(a)
Run Code Online (Sandbox Code Playgroud)

对数组进行Redimension,c以便在mn和之间保存适当数量的值mx

ReDim c(1 To mx - mn + 1, 1 To 1)
Run Code Online (Sandbox Code Playgroud)

将范围数组a中的每个项放入字典对象中,d

For i = 1 To UBound(a): d(a(i, 1)) = 1: Next i
Run Code Online (Sandbox Code Playgroud)

从循环mnmx,基本上检查,如果在字典中存在此值d,并且如果不是,把该值的数组中c.

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

将数组打印c到工作表

Range("d2").Resize(k) = c
Run Code Online (Sandbox Code Playgroud)

更新:可能修改为:

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
Run Code Online (Sandbox Code Playgroud)