При назначении переменной для массива, почему я получаю индекс массива вне диапазона ошибок? - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь просмотреть список транзакций и тэгов, связанных с определенными кодами счетов. Например, код учетной записи 123 будет помечен как стоимость «Аппаратное / программное обеспечение». Сначала я создал код, который просматривал книгу, читая каждую ячейку (очень ленивое решение). Этот процесс занял ~ 12-17 минут, чтобы пометить все расходы в бухгалтерской книге. Сейчас я пытаюсь реализовать решение для массива, чтобы пометить все затраты, прочитав коды счетов через один массив, а затем пометить затраты в другом массиве, если он соответствует требованиям оператора If / Then.

Приведенный ниже код циклически перебирает коды счетов и помечает затраты «разное», «оборудование» и «не расходы».

Как я могу заставить код работать так, чтобы я мог пройти через серию операторов If / Then с кодом учетной записи, чтобы задать тегирование на основе того, что код учетной записи? Я продолжаю получать сообщение об ошибке («индекс массива вне диапазона»), когда пытаюсь назначить тег «Not Expense» во втором операторе If / Then в приведенном ниже коде:

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» как «не за счет»

Надеюсь, этот код поможет, так как он является небольшой частью общего кода, который прочесывает множество других кодов учетных записей.

1 Ответ

1 голос
/ 03 апреля 2019

Следующее должно делать то, что вы пытаетесь сделать.Он вносит несколько изменений:

  1. Он правильно объявляет 3 строковые переменные, а не 2 варианта и 1 строку
  2. Он считывает значения в 1 строке кода
  3. Этоиспользует 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
...