使用选项卡创建新工作表时,如何声明 - private - 类变量。它必须自动完成。我认为通过使用它来声明它是个好主意 Private Sub Workbook_NewSheet(ByVal Sh As Object) - 来自Wookbook对象的事件
Sub Workbook_NewSheet(ByVal Sh As Object)
Dim sh.privateVariableOfSheet As Integer
Declare New sh.privateVariableOfSheet2 As Integer
End Sub
以上'声明'当然都失败了!
为了完整性,如何从普通模块中引用此变量。
答案 0 :(得分:1)
让我们来一些类 - clsFoo
- 它有一个类型为Range
的属性,带有一个getter和setter:
Private m_rngSomewhere As Range
Public Property Get SomeRange() As Range
Set SomeRange = m_rngSomewhere
End Property
Public Property Set SomeRange(rng As Range)
Set m_rngSomewhere = rng
End Property
现在,在Workbook
代码模块中:
Public
Dictionary
变量
Sub
来实例化Dictionary
- 可以从Workbook_Open
或其他地方调用Workbook_NewSheet
事件处理程序创建clsFoo
的新实例,并将其属性设置为新Range
中的Worksheet
,然后将其添加到字典中(并检查它是否已经有一些新的原因)。
工作簿模块中的代码:
Option Explicit
Public SheetFooDic As Object
Public Sub InitialiseSheetFooDic()
Set SheetFooDic = CreateObject("Scripting.Dictionary")
End Sub
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim rng As Range
Dim cls As clsFoo
If Not SheetFooDic.Exists(Sh) Then
Set rng = Sh.Range("A1")
Set cls = New clsFoo
Set cls.SomeRange = rng
SheetFooDic.Add Sh, cls
End If
End Sub
这使得您只需使用一些Worksheet
对象作为Dictionary
的密钥,以便检索创建Range
时存储的Worksheet
。您可以像这样引用公开Dictionary
:
ThisWorkbook.SheetFooDic(ThisWorkbook.Worksheets("Sheet2")).SomeRange.Address
得到:
$A$1
答案 1 :(得分:1)
另一种方法是使用Worksheet
的{{3}}集合。例如:
Option Explicit
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.CustomProperties.Add Name:=Sh.Name, Value:=99
End Sub
然后您可以在子程序中使用它:
Option Explicit
Sub Test()
Dim var As Variant
var = ThisWorkbook.Worksheets("Sheet13").CustomProperties(1)
MsgBox var
End Sub
答案 2 :(得分:0)
您可以将最后选择的单元格的地址存储为字符串。因此,要求一个对象变量可能会产生误导。无论哪种方式,最简单的方法是在每个工作表的代码中声明一个公共变量(例如PrevCell As String
或As Range,如果您更喜欢或需要该值),并在每个工作表的Selection_Change事件过程中设置该变量。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
PrevCell = Target.Cells(1) ' or .Address
End Sub
由于您可能发现避免记录多个单元格的选择很有用,因此上述过程只记录第一个单元格的地址,以避免在工作表上执行复制/粘贴操作时经常出现的错误。
现在,当您插入新工作表时,请不要使用Add方法。而是复制现有的工作表并按照您希望的方式进行清理。通过这种方式,新工作表将具有变量和设置它的代码。
我无法想象除了激活工作表之外的任何情况下你需要前一个单元格,但如果我的想象力不足,你可以使用每个工作表的元素声明一个全局数组,使用工作表'CodeName
属性用于标识。此数组将由Selection_Change事件过程设置,如上所示,但是当数组未知的工作表尝试注册其最新选择时,它必须是新工作表,并且数组已扩展为包含它。执行此操作的代码通过上述相同的方法从其他工作表继承。