excel vba为同一个sub中的下一个变量赋值

时间:2014-08-26 22:45:46

标签: excel vba variables excel-vba

我有一个sub,每当我运行它时我都会获得值。我想做的是每次子运行时向另一个添加一个变量。例如,我在sub中有x,a,b,c变量。

让我们说子运行4次,每次运行时,x得到以下值:1。“5”2。“2”3。“7”4。“11”

x将值转发给a。 a,b和c写入单元格,结果应为| 5 | | - | | - |

在第二次运行时,b应该得到a的值,a应该得到新x的值。比我们得到的结果:| 2 | | 5 | | - |

第三次运行,我们也有一个c:| 7 | | 2 | | 5 |

第四名:| 11 | | 7 | | 2 |

逻辑上这可以通过c = b,b = a,a = x来解决; cell = a& b&角

然而结果却是无稽之谈。

代码:

Sub getpingms_switch_Click()
Dim x As Integer: Dim y As Integer
Dim c As Range
Dim p1 As String
Dim p2 As String
Dim p3 As String
Dim ms As String

p2 = "*"
p3 = "*"

For Each c In Sheets("Topology").UsedRange.Cells


    If c.Value = "Switch$" Then
        y = c.Column + 1: x = c.Row + 2
        DoEvents
        Do Until IsEmpty(Cells(x, y)) 'IsEmpty is a function that stops the Do Until when the cell is empty

            If Left(Cells(x, y), 7) = "172.21." Then

                ms = sPing(Cells(x, y)) 'sPing gets the ms of the pinged pc
                p3 = p2
                p2 = p1
                p1 = ms

                    Cells(x, y + 1) = p1 & " ms " & "| " & p2 & "ms | " & p3 & " ms"
                If p1 = "timeout" Then
                    Cells(x, y + 1).Interior.ColorIndex = "3"
                ElseIf p1 < 16 And p1 > -1 Then
                    Cells(x, y + 1).Interior.ColorIndex = "4"
                ElseIf p1 > 15 And p1 < 51 Then
                    Cells(x, y + 1).Interior.ColorIndex = "6"
                ElseIf p1 > 50 And p1 < 4000 Then
                    Cells(x, y + 1).Interior.ColorIndex = "45"
                Else
                    Cells(x, y + 1).Interior.ColorIndex = "15"
                End If
            End If
                x = x + 1

        Loop

    End If

    Next c

End Sub

从技术上讲,我在第一次运行后得到以下结果:

“18 ms | ms | * ms”

“1 ms | 18ms | ms”

-

“1 ms | 1ms | 18 ms”

“24 ms | 1ms | 1 ms”

-

“1 ms | 24ms | 1 ms”

“1 ms | 1ms | 24 ms”

“2 ms | 1ms | 1 ms”

-

“2 ms | 2ms | 1 ms”

“1 ms | 2ms | 2 ms”

-

“1 ms | 1ms | 2 ms”

“1 ms | 1ms | 1 ms”

-

“1 ms | 1ms | 1 ms”

“1 ms | 1ms | 1 ms”

“1 ms | 1ms | 1 ms”

-

“51 ms | 1ms | 1 ms”

“1 ms | 51ms | 1 ms”

-

-

“0 ms | 1ms | 51 ms”

“0 ms | 0ms | 1 ms”

我们怎么能解决这个问题?

编辑:我弄清楚为什么我会得到这些结果,但我无法知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

您想要的是在模块范围内声明的static变量。只要代码运行,静态变量就会保留其值。

Private Static variable As Integer

Private Sub Counter()
    variable = variable + 1
End Sub

Public Sub Main()
    Dim i as Integer
    For i = 0 To 10
        Counter
        MsgBox variable
    Next
End Sub

每次执行此代码时,它都会递增变量计数器。

现在,如果您不打算在循环中运行您的函数,并且想要通过按钮单击来执行此操作,则静态变量将在代码运行完毕后丢失它的值。在这种情况下,我建议将中间值存储在隐藏的工作表中。

如果您希望真正花哨,您可以添加对Access的引用并使用TempVar来完成同样的事情。