【发布时间】:2019-08-25 03:18:06
【问题描述】:
我正在尝试遍历与某些帐户代码相关的交易分类账和标签成本。例如,帐户代码 123 将被标记为“硬件/软件”成本。我首先生成了通过读取每个单元格来梳理分类帐的代码(一个非常懒惰的解决方案)。这个过程花费了大约 12-17 分钟来标记分类帐中的所有成本。我现在正在尝试实现一个数组解决方案,通过一个数组读取帐户代码来标记所有成本,然后如果它满足 If/Then 语句的要求,则在另一个数组中标记成本。
下面的代码循环访问帐户代码并标记“杂项”成本、“硬件”成本和“非支出”成本。
我怎样才能使代码工作,以便我可以通过一系列带有帐户代码的 If/Then 语句来根据帐户代码是什么来指定标记?当我尝试在下面代码中的第二个 If/Then 语句中分配“Not Expense”标签时,我不断收到错误消息(“数组下标超出范围”):
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' 作为'不是费用'
我希望此代码有所帮助,因为它只是梳理了一堆其他帐户代码的整体代码的一小部分。
【问题讨论】:
-
没有理由逐个单元格地读取元素,只需使用
arTesting = rng.Value。这将产生一个二维数组(即使对于单列,在这种情况下,第二个索引始终为 1)但这比 1500 +ReDim Preserves快很多(尤其是因为ReDim Preserve在这种情况下不需要,因为您可以在开始之前Dim数组一次)。 -
另外,
If arTesting(i) = 182 Or 160 Or 250 Or 258 Or 180并不代表您认为的意思。这不是If arTesting(i) = 182 Or arTesting(i) =160 Or arTesting(i) =250 Or arTesting(i) =258 Or arTesting(i) =180的简写(我怀疑你的意思)。 -
@JohnColeman 那种错误感觉就像忘记
If arTesting(i) = 182 Or 160 Or 250 Or 258 Or 180与If arTesting(i) = 182 Or arTesting(i) =160等一样基本。您的解决方案效果很好 - 非常感谢您的帮助!