在EXCEL

时间:2017-03-23 07:21:04

标签: excel-vba vba excel

使用选项卡创建新工作表时,如何声明 - 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

以上'声明'当然都失败了!

为了完整性,如何从普通模块中引用此变量。

3 个答案:

答案 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事件过程设置,如上所示,但是当数组未知的工作表尝试注册其最新选择时,它必须是新工作表,并且数组已扩展为包含它。执行此操作的代码通过上述相同的方法从其他工作表继承。