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