如何在没有重复代码(VBA)的情况下编写or语句

如何在没有重复代码(VBA)的情况下编写or语句,vba,Vba,我知道在大多数其他语言中,您可以编写表达式if(ptr==NULL | | ptr->foo()){something bad casted}来测试变量的有效性和您想要执行的测试。VBA不允许您这样做。因此,我绞尽脑汁想找到一种方法来编写以下代码,而不必1)使用错误捕获作为条件分支的手段,2)不复制代码 Type Vector vData() as Variant vSize as Long End Type Sub add(v as Vector, elem as Variant

我知道在大多数其他语言中,您可以编写表达式
if(ptr==NULL | | ptr->foo()){something bad casted}
来测试变量的有效性和您想要执行的测试。VBA不允许您这样做。因此,我绞尽脑汁想找到一种方法来编写以下代码,而不必1)使用错误捕获作为条件分支的手段,2)不复制代码

Type Vector
   vData() as Variant
   vSize as Long
End Type

Sub add(v as Vector, elem as Variant)
   Dim oldSize as Long
   if v.vSize = 0 Or UBound(v.vData) >= v.vSize then
      oldSize = v.vSize
      ReDim Preserve v.vData(0 to (oldSize * 2 + 1))
      v.vData(oldSize) = elem
      v.vSize = v.vSize + 1
   else
      v.vData(v.vSize) = elem
      v.vSize = v.vSize + 1
   end if
End Sub
现在,无论vSize是否为0(如果vData从未变暗),代码都将在UBound行上崩溃。我唯一能看到的另一种方法是执行一个额外的elseif语句来检查UBound,但这将重复向量大小加倍的代码


如果您认为这是重复的:。这涉及到和语句(非或)的替代方案。嵌套的ifs(又名和语句)不会像或会复制代码。

如果我理解正确,您需要检查数组是否已分配

其中一个选择是这样做(不管看起来有多奇怪):

如果(不是MyArray)0,则“则”表示已分配

答案摘自-有关更多想法,请参阅。

使用SnowGroommer的答案,我发布了完整的解决方案:

这是一个名为Vector的类

Private data() As Variant
Private size As Long

Property Get vSize() As Long
    vSize = size
End Property

Property Let vData(ByVal index As Long, elem As Variant)
    If index < 0 Then Exit Property
    If index < size Then
        data(index) = elem
    Else
        Me.add elem, index
    End If
End Property

Property Get vData(ByVal index As Long) As Variant
    If index < 0 Or (Not Not data) = 0 Then
        vData = Nothing
        Exit Property
    End If
    vData = data(index)
End Property

Public Sub add(elem As Variant, Optional index As Long = -1)
    If index > -2 Then
        If index = -1 Then
            If size = 0 Or (Not Not data) = 0 Then
                ReDim data(0)
                data(size) = elem
                size = size + 1
                Exit Sub
            Else 'size <> 0
                ReDim Preserve data(0 To size * 2 + 1)
                data(size) = elem
                size = size + 1
            End If
        Else 'index <> -1
            If index >= size Then
                ReDim Preserve data(0 To index)
                data(index) = elem
                size = index + 1
            Else 'index < vSize
                data(index) = elem
            End If 'index >= vSize
        End If 'index = -1
    End If 'index > -2
End Sub 'add
Private data()作为变量
私人规模
属性Get vSize()的长度为
vSize=大小
端属性
属性Let vData(ByVal索引为长,elem为变量)
如果索引<0,则退出属性
如果索引<大小,则
数据(索引)=元素
其他的
添加元素,索引
如果结束
端属性
属性获取vData(ByVal索引长度)作为变量
如果索引<0或(非数据)=0,则
vData=无
退出属性
如果结束
vData=数据(索引)
端属性
公共子添加(元素作为变量,可选索引作为Long=-1)
如果索引>-2,则
如果索引=-1,则
如果大小=0或(非数据)=0,则
重拨数据(0)
数据(大小)=元素
尺寸=尺寸+1
出口接头
Else的大小为0
重拨保留数据(0到大小*2+1)
数据(大小)=元素
尺寸=尺寸+1
如果结束
埃尔斯指数-1
如果索引>=大小,则
重拨保留数据(0到索引)
数据(索引)=元素
大小=索引+1
Else的索引=vSize,则结束
如果'index=-1,则结束
如果“索引>-2”,则结束
结束子项“添加”