下标超出范围(错误9)在ReDim在VBA

在“Shifts”类中尝试创build新成员时出现错误。 这个子部分是为了填充以下variables(在类的顶部声明):

Private ShiftMembers() As String Private ShiftCallSigns() As String Private ShiftAssignments() As String Private ShiftStatuses() As String Public Sub AddMember(ByVal Name As String, ByVal CallSign As String, ByVal Assignment As String, Optional ByVal Status As String) If IsEmpty(ShiftMembers) = False Then ReDim Preserve ShiftMembers(UBound(ShiftMembers) + 1) ReDim Preserve ShiftCallSigns(UBound(ShiftCallSigns) + 1) ReDim Preserve ShiftAssignments(UBound(ShiftAssignments) + 1) ReDim Preserve ShiftStatuses(UBound(ShiftStatuses) + 1) Else ReDim Preserve ShiftMembers(0) ReDim Preserve ShiftCallSigns(0) ReDim Preserve ShiftAssignments(0) ReDim Preserve ShiftStatuses(0) End If ShiftMembers(UBound(ShiftMembers)) = Name ShiftCallSigns(UBound(ShiftCallSigns)) = CallSign ShiftAssignments(UBound(ShiftAssignments)) = Assignment ShiftStatuses(UBound(ShiftStatuses)) = Status End Sub 

当我调用这个子,我得到一个“下标超出范围(错误9)”的消息。 有任何想法吗? 谢谢! 我创build了“IsEmpty()”检查,因为我相信如果数组有0个元素(右?),UBound将会抛出一个错误。

提前致谢!

-抢

问题是这些行:

 ReDim Preserve ShiftMembers(UBound(ShiftMembers) + 1) ReDim Preserve ShiftCallSigns(UBound(ShiftCallSigns) + 1) ReDim Preserve ShiftAssignments(UBound(ShiftAssignments) + 1) ReDim Preserve ShiftStatuses(UBound(ShiftStatuses) + 1) 

当没有界限被定义时被访问,所以UBound抛出错误。 IsEmtpy不会检查数组边界,如果您显式声明边界为0那么您将无法使用ReDim

为了解决这个问题,你可以分别跟踪你的初始化:

 Private ShiftMembers() As String Private ShiftCallSigns() As String Private ShiftAssignments() As String Private ShiftStatuses() As String Private IsInitialized As Boolean Public Sub AddMember(ByVal Name As String, ByVal CallSign As String, ByVal Assignment As String, Optional ByVal Status As String) If IsInitialized Then ReDim Preserve ShiftMembers(UBound(ShiftMembers) + 1) ReDim Preserve ShiftCallSigns(UBound(ShiftCallSigns) + 1) ReDim Preserve ShiftAssignments(UBound(ShiftAssignments) + 1) ReDim Preserve ShiftStatuses(UBound(ShiftStatuses) + 1) Else ' Preserve isn't really needed here. ReDim Preserve ShiftMembers(0) ReDim Preserve ShiftCallSigns(0) ReDim Preserve ShiftAssignments(0) ReDim Preserve ShiftStatuses(0) IsInitialized = True End If ShiftMembers(UBound(ShiftMembers)) = Name ShiftCallSigns(UBound(ShiftCallSigns)) = CallSign ShiftAssignments(UBound(ShiftAssignments)) = Assignment ShiftStatuses(UBound(ShiftStatuses)) = Status End Sub 

在上面,我使用了一个IsInitializedvariables(默认为False ),然后在数组边界被首次定义之后显式地设置为True

 Sub M_snb() On Error Resume Next y = UBound(shiftmembers) If Err.Number <> 0 Then y = -1 ReDim Preserve shiftmembers(y + 1) End Sub