如何在没有重复代码(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”,则结束
结束子项“添加”