在第一次选择之前,循环不会初始化

时间:2015-01-21 16:41:26

标签: excel excel-vba vba

使用此very helpful example作为起点(谢谢Gary的学生!),我无法初始化代码,因此它识别出第一个更改。在我旁边的桌子上有一大堆头发,因为我现在已经试图解决这个问题2天.......

基本上,我在表格中有一个范围(B1:B200)。通过数据验证(下拉列表),用户可以选择此范围内的单元格的两个值。当他们选择一个值时,我想知道单元格已经改变了(让我们说B12),并根据新值(选择1或选择2),第一个单元格row(单元格A12)将其值设置为两个不同计数器之一。

首次打开工作簿并且用户在该范围内进行选择时,它不会"看到"第一次更改,但记录每个后续更改并正确设置单元格A中的值,然后递增相应的计数器。

另一个约束: 如果用户选择了值并且设置了单元格A,则它们随后不能将B值从1更改为2(否则计数器将继续递增)。

这有意义吗?

这是我正在使用的代码。非常感谢,您可以提供任何帮助:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Interesting As Range
    Dim I As Long, J As Long, K As Long, INTL As Long, DOMESTIC As Long

    ' These are the values for the two counters, stored in another sheet in
    ' the book:
    INTL = Worksheets("MASTER").Range("A8")
    DOMESTIC = Worksheets("MASTER").Range("A5")

    K = 1
    Set Interesting = Range("B1:B200")
    If init = 0 Then
        MemoryOfThingsPast = Interesting
        init = 1
        Exit Sub
    End If

    If Intersect(Target, Interesting) Is Nothing Then Exit Sub

    K = 1
    ' MsgBox "2. init: " & init & "  v1: " & v1 & "  v2: " & v2

    For I = LBound(MemoryOfThingsPast, 1) To UBound(MemoryOfThingsPast, 1)
        For J = LBound(MemoryOfThingsPast, 2) To UBound(MemoryOfThingsPast, 2)
            ' MsgBox "3. init: " & init & "  v1: " & v1 & "  v2: " & v2

            v1 = Interesting(K)
            v2 = MemoryOfThingsPast(I, J)

            If v1 <> v2 Then
                If Not IsEmpty(Cells(K, 1)) Then
                    If v1 = "INTERNATIONAL" And Left(Cells(K, 1), 1) = "D" Then
                        MsgBox "DOMESTIC counter is already set"
                    ElseIf v1 = "DOMESTIC" And Left(Cells(K, 1), 1) = "I" Then
                        MsgBox "INTERNATIONAL counter is already set"
                    End If
                Else
                    If v1 = "INTERNATIONAL" And IsEmpty(Cells(K, 1)) Then
                        Worksheets("MASTER").Range("A8") = INTL + 1
                        Cells(K, 1) = "I-" & INTL
                        MsgBox "INTL Counter has been set."
                    ElseIf v1 = "DOMESTIC" And IsEmpty(Cells(K, 1)) Then
                        Worksheets("MASTER").Range("A5") = DOMESTIC + 1
                        Cells(K, 1) = "D-" & DOMESTIC
                        MsgBox "DOMESTIC Counter has been set."
                    End If
                End If
            End If
            K = K + 1
        Next J
    Next I

    MemoryOfThingsPast = Interesting
End Sub

2 个答案:

答案 0 :(得分:0)

在开头附近有一对Exit Sub可能导致问题。我怀疑它是第一个,init = 0第一次运行。

答案 1 :(得分:0)

我在发布后的第二天就找到了答案,而且效果很好:

我把代码放在运行工作簿打开时将字符串写入检查范围内的单元格中(我把单词&#34; REPORT&#34;在单元格B1中),这实际上是有效的,第一次改变工作表。

每次打开本书并且只运行一次时就会发生这种情况。由于它位于页面顶部和表格之外,因此它不会干扰数据,但它可以解决第一次进入循环的问题。难题。它实际上是对数组的第一次更改(范围(B:B))。在那之后,&#34;第一&#34;拾取(实际上是第二个!),并正确设置计数器。

变得怪异.......

希望这有助于那里的人。