【问题标题】:Dictionary value of key from another array另一个数组中键的字典值
【发布时间】:2019-04-12 17:03:02
【问题描述】:

已回答...必须等待 2 天才能接受自己的回答


背景:

我有一个从 Excel 中的数据集生成的数组(“arr”);我使用该数组来填充另一个数组(“zrr”),其中该填充的一个方面是使用字典(“dcdept”)。

字典已正确填充(通过debug.print dcdept(ActualKey) 测试;填充后dcdept(4000)="Value" 和测试debug.print dcdept(4000) 在即时窗口中打印出单词“Value”。

我最初是通过 .cells(i,) 引用使用源数据集,但有几十万行,我试图在 VBA 中保留活动以加快速度。

我的代码没有生成错误/警报。


问题:

当尝试使用来自 arr (dcdept(arr(i-2,16))) 的字典键填充 zrr (zrr(i-1,3)) 中的元素时,我没有得到任何值输出。


问题:

有没有人有任何建议/解决方案来解决给定数据的问题?


有问题的代码:

Public arr As Variant, brr As Variant, crr As Variant, drr As Variant, lrs As Long
Private Sub changes()
    Dim i As Long, x As Long, y As String, z As String, dcdept As Scripting.Dictionary, zrr As Variant, a As Long
    'set-up dictionary for department
    Set dcdept = New Scripting.Dictionary
    dcdept(4000) = "Value"
    'generate array to store new values
    With Sheets("Conversion")
        .Columns(16).NumberFormat = "0"
        lrs = .Cells(.Rows.Count, 1).End(xlUp).Row
        arr = .Range(.Cells(2, 1), .Cells(lrs, 17)).Value '17 = Q
        ReDim zrr(lrs, 4)
        For i = 2 To lrs
            ReDim Preserve zrr(lrs, 4)
            Select Case Left(arr(i - 1, 17), 3)
                Case "QTE"
                    x = 7
                Case "ZNA"
                    x = 5
            End Select
            zrr(i - 2, 0) = Right(arr(i - 1, 17), x)
            If InStr(arr(i - 1, 9), " Milestone ") Then
                y = Left(arr(i - 1, 9), 2) & " " & arr(i - 1, 10)
            Else
                y = arr(i - 1, 9) & " " & arr(i - 1, 10)
            End If
            zrr(i - 2, 1) = y
            If IsEmpty(arr(i - 1, 14)) Then
                zrr(i - 2, 2) = "N"
            Else
                zrr(i - 2, 2) = "Y"
            End If
            a = Val(arr(i - 1, 16))
            z = dcdept(a)
            zrr(i - 2, 3) = z
            Debug.Print a
            Debug.Print z
        Next i
        'append data to sheet
        .Cells(2, "R").Resize(lrs, 3).Value = zrr  'SHOULD BE Resize(lrs,4), per answer
    End With
End Sub

【问题讨论】:

  • 我认为这行zrr(i-1,3) = dcdept(arr(i-2,16)) 正在向字典中添加一个新项目 - 你可以在本地窗口中查看吗?您可以改为循环遍历字典项?
  • @SJR 感谢您的意见;它没有出现(从测试中)字典本身受到影响/附加。现在尝试将该循环键入代码中,看看是否可以解决此问题。大多数我的测试都让我回想起我的数据有问题,我似乎无法从中理解......该表最初是用@格式化的,否则我在尝试转置更大的数组时会出错超过 9101 行,然后我将某些列设置回 "yyyy/mm/dd""0"
  • @SJR 刚刚对 debug.print 进行了另一项测试,这看起来与写回数组 zrr 相关联
  • 我不确定你是否测试过,但在字典中,关键的类型很重要。所以dcdept(4000)dcdept("4000")会有区别。如果将值作为文本读入数组,则它不会识别键的整数值。如果您已经对此进行了测试,那么我在识别问题时会遇到一些麻烦。您是否有机会发布更多相关代码以便我们跟进?
  • 我刚刚在您的代码中也看到了这一点。我真的打了自己的额头

标签: arrays excel vba dictionary


【解决方案1】:

好的,这不是答案,而是我评论的说明。我没想到会发生这种情况。我设置了一个简单的场景,希望与你的类似:

Sub x()

Dim oDic As Object, v1(1 To 2), v2(1 To 2), v, i As Long

Set oDic = CreateObject("Scripting.Dictionary")

v1(1) = "Fred"
v1(2) = 1000

oDic(1) = v1(1) 'key 1, item "Fred
oDic(2) = v1(2) 'key 2, item 1000

之后的本地人窗口如下所示


然后添加这一行

v2(1) = oDic(v1(1))

然后立即窗口显示如下:


添加这一行

v2(2) = oDic(v1(2))

然后立即窗口显示如下:

【讨论】:

  • 这是一些有趣的信息...如果我理解正确,这表明使用 v2 变体实际上确实在 oDic 库中创建了新条目。输出给定键的值的解决方法是什么?我尝试使用建议的循环(当我尝试 j = 0 到 dcdept.count 时,excel 不断崩溃,如果 dcdept.keys(j) = arr(i-1,16) 然后 z = dcdept.keys(j),退出)
  • 解决了愚蠢的问题,这是固定的。再次感谢您提供的意见和列出的有关其中一些词典如何运作的课程。
【解决方案2】:

我是个白痴……

.Cells(2, "R").Resize(lrs, 3).Value = zrr 

应该是

.Cells(2, "R").Resize(lrs, 4).Value = zrr

2天不能接受我自己的回答;在此期间请原谅“未回答”的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多