VBA中的静态variables

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

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 

我现在遇到的问题是数据将需要导入到这张表中的date,所以当我保存这个文件,然后重新打开,然后导入更多的文件标识符/计数为文件导入重新启动在1,我不想发生。 我希望能够继续添加更多的文件,并继续执行代码,我不想清除所有导入的数据并重新启动。 任何想法,我怎么能做到这一点? TIA。

我会创build一个独立的函数来pipe理序列。 将值存储在“工作簿名称”条目中。

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

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

快速解决这个问题的方法是将标识符/计数的值存储在单元格中,并隐藏/locking单元格。 单元格内的值在重新启动后不会改变,但您仍然可以在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 

您也可以创build一个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