将变量分配给数组时,为什么会出现数组下标超出范围的错误?
When assigning a variable to an array, why am I getting an array subscript out of range error?
我正在尝试遍历与某些帐户代码相关的交易和标记成本的分类帐。例如,帐户代码 123 将被标记为 'Hardware/Software' 费用。我首先生成了通过读取每个单元格来梳理分类帐的代码(一个非常懒惰的解决方案)。这个过程花了大约 12-17 分钟来标记分类帐中的所有成本。我现在正在尝试实现一个数组解决方案,通过一个数组读取帐户代码来标记所有成本,然后在另一个数组中标记成本(如果它满足 If/Then 语句的要求)。
下面的代码循环访问帐户代码并标记 'misc' 成本、'hardware' 成本和 'not expense' 成本。
如何使代码工作,以便我可以使用帐户代码通过一系列 If/Then 语句来根据帐户代码指定标记?当我尝试在以下代码的第二个 If/Then 语句中分配 'Not Expense' 标记时,我不断收到错误消息 ("array subscript out of range"):
Sub arrayTest()
Dim arTesting() As Variant
Dim arTag1(1 To 1550) As Variant 'this is just a test range
Dim arTag2(1 To 1550) As Variant 'this is just a test range
Dim rng, cell As Range
Dim HWSWTag, miscTag, notExpenseTag As String
Dim x As Integer
Set rng = Range("G2:G1551")
miscTag = "Misc"
HWSWTag = "HW/SW"
notExpenseTag = "Not Expense"
x = 1
'Read in the range of account codes
For Each cell In rng
ReDim Preserve arTesting(x)
arTesting(x) = cell.Value
x = x + 1
Next cell
'Now tag the costs to arTag1 and arTag2
Dim i As Long
i = 1
For i = LBound(arTesting) To UBound(arTesting)
If arTesting(i) = 716 Then
arTag1(i) = miscTag
arTag2(i) = HWSWTag
End If
If arTesting(i) = 182 Or 160 Or 250 Or 258 Or 180 Then
arTag1(i) = notExpenseTag 'This is where I get the error
End If
'Debug.Print arTesting(i)
Next i
'Now paste the tags into the worksheet
Range("AL2:AL1551").Value = WorksheetFunction.Transpose(arTag1)
Range("AM2:AM1551").Value = WorksheetFunction.Transpose(arTag2)
End Sub
我希望输出将帐户代码为“716”的所有费用标记为 'misc' 和 'HW/SW',并使用帐户代码“182”、“160”、“250”标记费用, '258', '180' 为 'Not Expense'
我希望这段代码能有所帮助,因为它只是梳理了一堆其他帐户代码的整体代码的一小部分。
以下内容应该可以完成您似乎想要做的事情。它进行了一些更改:
- 它正确声明了 3 个字符串变量,而不是 2 个变体和 1 个字符串
- 它读取 1 行代码中的值
- 它使用
Select Case
而不是 If
语句,其条件并不意味着您可能的意思。 x = 1 Or 2 Or 3
意味着 (x = 1) Or 2 Or 3
(这几乎不是你想要的)而不是预期的 x = 1 Or x = 2 Or x = 3
代码如下:
Sub arrayTest()
Dim arTesting() As Variant
Dim arTag1(1 To 1550, 1 To 1) As Variant 'this is just a test range
Dim arTag2(1 To 1550, 1 To 1) As Variant 'this is just a test range
Dim rng As Range, cell As Range
Dim HWSWTag As String, miscTag As String, notExpenseTag As String
Dim i As Long
Set rng = Range("G2:G1551")
miscTag = "Misc"
HWSWTag = "HW/SW"
notExpenseTag = "Not Expense"
arTesting = rng.Value
For i = LBound(arTesting,1) To UBound(arTesting,1)
Select Case arTesting(i,1)
Case 716:
arTag1(i, 1) = miscTag
arTag2(i, 1) = HWSWTag
Case 182, 160, 250, 258, 180:
arTag1(i, 1) = notExpenseTag
End Select
Next i
Range("AL2:AL1551").Value = arTag1
Range("AM2:AM1551").Value = arTag2
End Sub
我正在尝试遍历与某些帐户代码相关的交易和标记成本的分类帐。例如,帐户代码 123 将被标记为 'Hardware/Software' 费用。我首先生成了通过读取每个单元格来梳理分类帐的代码(一个非常懒惰的解决方案)。这个过程花了大约 12-17 分钟来标记分类帐中的所有成本。我现在正在尝试实现一个数组解决方案,通过一个数组读取帐户代码来标记所有成本,然后在另一个数组中标记成本(如果它满足 If/Then 语句的要求)。
下面的代码循环访问帐户代码并标记 'misc' 成本、'hardware' 成本和 'not expense' 成本。
如何使代码工作,以便我可以使用帐户代码通过一系列 If/Then 语句来根据帐户代码指定标记?当我尝试在以下代码的第二个 If/Then 语句中分配 'Not Expense' 标记时,我不断收到错误消息 ("array subscript out of range"):
Sub arrayTest()
Dim arTesting() As Variant
Dim arTag1(1 To 1550) As Variant 'this is just a test range
Dim arTag2(1 To 1550) As Variant 'this is just a test range
Dim rng, cell As Range
Dim HWSWTag, miscTag, notExpenseTag As String
Dim x As Integer
Set rng = Range("G2:G1551")
miscTag = "Misc"
HWSWTag = "HW/SW"
notExpenseTag = "Not Expense"
x = 1
'Read in the range of account codes
For Each cell In rng
ReDim Preserve arTesting(x)
arTesting(x) = cell.Value
x = x + 1
Next cell
'Now tag the costs to arTag1 and arTag2
Dim i As Long
i = 1
For i = LBound(arTesting) To UBound(arTesting)
If arTesting(i) = 716 Then
arTag1(i) = miscTag
arTag2(i) = HWSWTag
End If
If arTesting(i) = 182 Or 160 Or 250 Or 258 Or 180 Then
arTag1(i) = notExpenseTag 'This is where I get the error
End If
'Debug.Print arTesting(i)
Next i
'Now paste the tags into the worksheet
Range("AL2:AL1551").Value = WorksheetFunction.Transpose(arTag1)
Range("AM2:AM1551").Value = WorksheetFunction.Transpose(arTag2)
End Sub
我希望输出将帐户代码为“716”的所有费用标记为 'misc' 和 'HW/SW',并使用帐户代码“182”、“160”、“250”标记费用, '258', '180' 为 'Not Expense'
我希望这段代码能有所帮助,因为它只是梳理了一堆其他帐户代码的整体代码的一小部分。
以下内容应该可以完成您似乎想要做的事情。它进行了一些更改:
- 它正确声明了 3 个字符串变量,而不是 2 个变体和 1 个字符串
- 它读取 1 行代码中的值
- 它使用
Select Case
而不是If
语句,其条件并不意味着您可能的意思。x = 1 Or 2 Or 3
意味着(x = 1) Or 2 Or 3
(这几乎不是你想要的)而不是预期的x = 1 Or x = 2 Or x = 3
代码如下:
Sub arrayTest()
Dim arTesting() As Variant
Dim arTag1(1 To 1550, 1 To 1) As Variant 'this is just a test range
Dim arTag2(1 To 1550, 1 To 1) As Variant 'this is just a test range
Dim rng As Range, cell As Range
Dim HWSWTag As String, miscTag As String, notExpenseTag As String
Dim i As Long
Set rng = Range("G2:G1551")
miscTag = "Misc"
HWSWTag = "HW/SW"
notExpenseTag = "Not Expense"
arTesting = rng.Value
For i = LBound(arTesting,1) To UBound(arTesting,1)
Select Case arTesting(i,1)
Case 716:
arTag1(i, 1) = miscTag
arTag2(i, 1) = HWSWTag
Case 182, 160, 250, 258, 180:
arTag1(i, 1) = notExpenseTag
End Select
Next i
Range("AL2:AL1551").Value = arTag1
Range("AM2:AM1551").Value = arTag2
End Sub