我有一个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。
答案 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