Excel VBA 设置项作为类属性 Get 和 Let 的默认值

问题描述 投票:0回答:1

我创建这个课程是为了进行实验。我的目标是看看我是否可以读取/写入这种格式的数据:

x = AppInventory(r,c): AppInventory(r,c) = x
x = AppInventory("A1"): AppInventory("A1") = x
x = AppInventory(cellRng): AppInventory(cell(rnd) = x

添加

.Item: x = AppInventory.Item(r,c)

时有效

但是我希望消除

.Item()
,这可以默认为.Item吗?

是否有人曾经默认 Item 以便您不必输入它?或者还有其他更简单的方法吗?我尝试在主代码中使用 Get/Let 和 Property,但这不起作用,因为 r,c 与字符串文本被证明是一个问题,因为有时我使用 1 个参数,有时使用 2 个参数。

任何想法表示赞赏。谢谢。

类名:AppInventory

    Private ws As Worksheet
    Private targetCell As Range
        
    Private Sub Class_Initialize()
        Set ws = ThisWorkbook.Worksheets("AppInventory")
    End Sub
    
    Public Property Get Item(Index1 As Variant, Optional Index2 As Variant) As Variant
        Set targetCell = GetTargetCell(Index1, Index2)
        Item = targetCell.Value
    End Property
        
    Public Property Let Item(Index1 As Variant, Optional Index2 As Variant, ByVal Value As Variant)
        Set targetCell = GetTargetCell(Index1, Index2)
        targetCell.Value = Value
    End Property
        
    Private Function GetTargetCell(Index1 As Variant, Optional Index2 As Variant) As Range
        Select Case VarType(Index1)
            Case vbInteger, vbLong ' Numeric, likely row number
                Set GetTargetCell = ws.Cells(Index1, Index2)
            Case vbString ' String, like "A1"
                Set GetTargetCell = ws.Range(Index1)
            Case vbObject ' Range object
                Set GetTargetCell = ws.Range(Index1.Address)
            Case Else
                MsgBox "Invalid input"
        End Select
    End Function

到目前为止我的想法失败了:

Public Default Property Get Item(Index1 As Variant, Optional Index2 As Variant) As Variant
Default Public Property Get Item(Index1 As Variant, Optional Index2 As Variant) As Variant

我什至尝试导出该类并在

Attribute Item.VB UserMemID = 0
之前添加
Get Item()
,然后将其重新导入以查看是否有效。我想我曾经让它工作过一次,但是当我用简单的注释修改类时,我认为它消失了,我无法再次让它工作。

excel vba class get let
1个回答
0
投票

您提供的代码看起来您没有创建类的实例。

x = AppInventory(r,c): AppInventory(r,c) = x
x = AppInventory("A1"): AppInventory("A1") = x
x = AppInventory(cellRng): AppInventory(cell(rnd) = x

除非您将 AppInventory 设置为 PredeclaredId,否则上面的代码将不起作用。

尝试以下方法

Dim MyInv as AppInventory
Set myInv = new AppInventory
myInv.Item(r,c)=x

如果将 Item 设置为默认成员,则可以消除 .Item。

许多类属性在 VBA 中不可用,这意味着您必须导出代码,设置属性,然后重新导入。

更简单的方法是安装适用于 VBA 的免费且出色的 Rubberduck 插件。该插件允许您通过使用前缀为“@

”的注释来设置属性
'\@DefaultMember
Public Property Get Item(Index1 As Variant, Optional Index2 As Variant) As Variant
        Set targetCell = GetTargetCell(Index1, Index2)
        Item = targetCell.Value
    End Property
        
    Public Property Let Item(Index1 As Variant, Optional Index2 As Variant, ByVal Value As Variant)
        Set targetCell = GetTargetCell(Index1, Index2)
        targetCell.Value = Value
    End Property

您需要运行 Rubberduck 解析来更新属性。

祝你好运

© www.soinside.com 2019 - 2024. All rights reserved.