VBA中的静态变量

时间:2017-07-21 16:03:01

标签: excel vba excel-vba

我有一个excel工作簿,用户将文本文件导入“数据导入表”。导入的文件数取决于用户要导入的文件的方式。到目前为止,我的工作簿工作得很好,但我遇到了一个问题。当用户导入文件时,标识符(即1,2,3等)被分配给该数据集。然后,用户从下拉框中选择一个选项,将自动生成计算和绘图。用户还可以选择“清除所有数据”,当选择此项时,将清除所有工作表,如果用户导入新文件(单击“清除所有数据”按钮后),标识符值将重新开始为1.这是我的代码用于标识符/计算已导入的文件数量..

Public Sub Macro(Optional reset As Boolean = False)

Static i As Integer
If reset Then
i = -1
i = i + 1
Exit Sub
End If

i = i + 1

Worksheets("Hidden").Cells(i + 1, 1).FormulaR1C1 = "=" & i

Worksheets("Hidden").Cells(2, 2).FormulaR1C1 = "=" & i

End Sub

我现在遇到的问题是数据需要在以后导入到此工作表中,所以当我保存此文件并重新打开它然后导入更多文件时,文件导入的标识符/计数重新开始于1不想发生。我希望能够继续添加更多文件并继续使用代码,我不想清除所有导入的数据并重新启动。关于我如何做到这一点的任何想法? TIA。

3 个答案:

答案 0 :(得分:1)

我创建了一个独立的功能来管理序列。将值存储在“工作簿名称”条目中。

注意 - 如果您必须管理多个序列,则可以将序列的名称提升为参数,而不是在函数中使用常量。

Function NextSequence(Optional reset As Boolean = False)
    Const COUNTER_NAME As String = "NM_COUNTER"
    Dim nm As Name, i

    On Error Resume Next
    'is the name already created?
    Set nm = ThisWorkbook.Names(COUNTER_NAME)
    On Error GoTo 0

    If nm Is Nothing Then
        'not there yest - create it...
        Set nm = ThisWorkbook.Names.Add(COUNTER_NAME, 0)
    End If

    If Not reset Then
        i = Evaluate(nm.RefersTo)
        i = i + 1
        nm.RefersTo = i
    Else
        nm.RefersTo = 0 
        i = 0 '<< or 1 if you want NextSequence(True) to
              '   return the first sequence value
    End If

    NextSequence = i
End Function

用法:

Public Sub Macro(Optional reset As Boolean = False)

    Dim i 
    i = NextSequence(reset)
    If reset Then Exit Sub

    With Worksheets("Hidden")
        .Cells(i + 1, 1).Value = i
        .Cells(2, 2).Value = i
    End With

End Sub

答案 1 :(得分:0)

快速解决此问题的方法是将标识符/计数的值存储在单元格内并隐藏/锁定单元格。单元格内的值在重新启动时不会改变,但您仍然可以在VBA内操作它。

非常快速地感觉它应该是什么样的(可能是空洞的,因为我没有我需要的所有信息。)

Public Sub Macro(Optional reset As Boolean = False)

Static i As Integer
i = ActiveWorkBook.Sheets("Ressource").Range("A1").Value
If reset Then
i = -1
i = i + 1
Exit Sub
End If

i = i + 1

Worksheets("Hidden").Cells(i + 1, 1).FormulaR1C1 = "=" & i

Worksheets("Hidden").Cells(2, 2).FormulaR1C1 = "=" & i

End Sub

答案 2 :(得分:0)

您还可以创建CustomDocumentProperty来保存序列号。您可以将布尔值传递给要重置的方法:

最后,辅助函数将检查属性是否存在,以便在未添加时添加。

Public Sub SequenceNumber(Optional ByVal Reset As Boolean = False)
    If Not PropertyExists("Identifier") Then
        ThisWorkbook.CustomDocumentProperties.Add Name:="Identifier", _
                                                  LinkToContent:=False, _
                                                  Type:=msoPropertyTypeNumber, _
                                                  Value:=0
    End If

    Dim p As Object
    Set p = ThisWorkbook.CustomDocumentProperties("Identifier")

    If Reset Then p.Value = 0 Else p.Value = p.Value + 1
End Sub

'Property Exists?
Private Function PropertyExists(ByVal propertyName As String) As Boolean
    Dim p As Object
    For Each p In ThisWorkbook.CustomDocumentProperties
       If p.Name = propertyName Then
           PropertyExists = True
           Exit Function
       End If
    Next p
End Function

要打电话:

SequenceNumber
SequenceNumber Reset:=True