Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在EXCEL中创建新工作表时自动声明对象类变量_Excel_Vba - Fatal编程技术网

在EXCEL中创建新工作表时自动声明对象类变量

在EXCEL中创建新工作表时自动声明对象类变量,excel,vba,Excel,Vba,使用选项卡创建新工作表时,如何声明-private-class变量。它必须自动完成。我认为使用 私有子工作簿\新闻纸(ByVal Sh作为对象)-来自Wookbook对象的事件 Sub Workbook_NewSheet(ByVal Sh As Object) Dim sh.privateVariableOfSheet As Integer Declare New sh.privateVariableOfSheet2 As Integer End

使用选项卡创建新工作表时,如何声明-private-class变量。它必须自动完成。我认为使用 私有子工作簿\新闻纸(ByVal Sh作为对象)-来自Wookbook对象的事件

    Sub Workbook_NewSheet(ByVal Sh As Object)
        Dim sh.privateVariableOfSheet As Integer
        Declare New sh.privateVariableOfSheet2 As Integer
    End Sub
当然,上述两个“声明”都失败了


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

让我们看一个类-
clsFoo
,它有一个带有getter和setter的
Range
类型的单一属性:

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
现在,在
工作簿
代码模块中,您有:

  • 一个
    Public
    变量,我们将其设置为
    Dictionary
  • 可以从
    工作簿\u Open
    或其他地方调用用于实例化
    词典的
  • 工作簿\新闻纸的事件处理程序
事件处理程序创建
clsFoo
的新实例,并从新的
工作表
中将其属性设置为
范围
,然后将其添加到字典中(并检查它是否因某些新原因已存在)

工作簿模块中的代码:

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
这使得您只需使用一些
工作表
对象作为
字典
中的键,即可检索创建
工作表
时存储的
范围
。您可以像这样参考公共
词典

ThisWorkbook.SheetFooDic(ThisWorkbook.Worksheets("Sheet2")).SomeRange.Address
并获得:

$A$1

可以将上一个选定单元格的地址存储为字符串。因此,请求对象变量可能会产生误导。无论哪种方法,最简单的方法都是在每个工作表的代码中声明一个公共变量(例如,
PrevCell为String
,或者如果您喜欢或需要该值,则声明为Range),并在每个工作表的选择\u更改事件过程中设置该变量

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    PrevCell = Target.Cells(1)     ' or .Address
End Sub
由于您可能会发现避免记录多个单元格的选择很有用,因此我的上述过程只记录第一个单元格的地址,从而避免在工作表上执行复制/粘贴操作时经常出现的错误

现在,插入新图纸时,不要使用Add方法。而是复制一张现有的图纸,并按照您想要的方式进行清理。这样,新工作表就已经有了变量和设置它的代码


我无法想象您在任何情况下都需要前一个单元格,除非工作表被激活,但如果在这种情况下我的想象力不足,您可以使用工作表的
CodeName
属性为每个工作表声明一个带有元素的全局数组进行标识。如上文所示,该数组将由Selection_Change事件过程设置,但当数组未知的工作表尝试注册其最新选择时,它必须是新工作表,并且该数组将扩展以包含它。执行此操作的代码通过上述相同方法从其他工作表继承。

另一种方法是使用
工作表的集合。例如:

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

您希望获得哪种类型的变量/类?什么类型的事件?@Shai Rado:都在代码示例中:当启动/创建新的Sheet时,会触发工作簿新闻单例程(事件)。我想在这个新的工作表中声明一个变量(键入Range以引用工作表的第二个最后选择-供以后使用),而不使用VBAeditor。如果不自动使用VBE将代码添加到工作表中,则无法执行此操作。如果可以,复制已有变量的现有工作表会更容易。“我不太清楚你为什么要这么做。”罗尼。我需要为我在某个时间拥有的许多工作表中的每一张记录上一个选定的单元格,而不是当前的单元格,我认为使用变量“oldSelectedCell”可以做到这一点。因为您试图在运行时向对象添加属性,这是不正常的很好的解决方案,也许就是我要用的。虽然我认为它可以用更少的“工作”来完成(正如我写的一种Dim/Declare…),但希望它能有所帮助。关于“工作量”——就我个人而言,这似乎比向工作表中注入一些代码要简单。你需要把“硬编码”的代码保存在某个地方,并随着时间的推移进行维护。你很忙。我喜欢这个。但是很高兴看到你的其他治疗使用类。