我创建这个课程是为了进行实验。我的目标是看看我是否可以读取/写入这种格式的数据:
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()
,然后将其重新导入以查看是否有效。我想我曾经让它工作过一次,但是当我用简单的注释修改类时,我认为它消失了,我无法再次让它工作。
您提供的代码看起来您没有创建类的实例。
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 解析来更新属性。
祝你好运