VBA中的静态变量

VBA中的静态变量,vba,excel,Vba,Excel,我有一个excel工作簿,用户在其中将文本文件导入“数据导入表”。导入的文件数取决于用户希望导入的文件的方式。到目前为止,我的练习册工作得很好,但我遇到了一个困难。当用户导入文件时,将为该数据集分配一个标识符(即1、2、3等)。然后用户从下拉框中选择一个选项,计算和绘图将自动生成。用户还可以选择“清除所有数据”,选择此选项后,所有工作表都将被清除,如果用户导入新文件(单击“清除所有数据”按钮后),则标识符值将在1处重新启动。这是我的代码,用于标识/计算导入了多少文件 Public Sub Mac

我有一个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.

一个快速修复方法是将标识符/计数的值存储在单元格内,并隐藏/锁定单元格。单元内的值在重新启动时不会更改,但您仍然可以在VBA内对其进行操作

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


我将创建一个独立的函数来管理序列。将该值存储在工作簿名称条目中

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

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 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

创建工作簿级别名称并将值存储在该名称中。该值将与工作簿一起保存。您能详细说明一下吗?我从来没有听说过工作簿级别的名称!在模块代码中设置为公共的字符串变量,但在任何子代码或函数之前,我是否也需要维护以前的代码并将其添加到中?它如何知道i在哪个单元格中?您将使用该函数仅为i提供下一个值,因此类似于
i=NextSequence()
-每次调用它时,该值都将递增1,除非调用
NextSequence(True)
,在这种情况下,该值将被重置。也许这不是最适合您所做的。好吧,当我调用此函数时,我需要调用NextSequence(),当我希望它保持并继续时,但如果我希望它重新启动,我需要调用NextSequence(True)?当我现在运行代码时,工作表中没有I值。。
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