Определение проблемы пустого массива - PullRequest
0 голосов
/ 01 ноября 2019

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

ReDim VectorToSum(0 To q-1)

Я не уверен, почему. Это полный код:

Option Explicit

Public Sub DefferedRev()
    Dim NoMonths As Range
    Set NoMonths = ThisWorkbook.Worksheets("Sheet4").Range("C13")

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet13")


    If ws.Range("B40").Value = ws.Range("C82").Value Then
        ws.Range(ws.Cells(48, 5), ws.Cells(48, 7)).Value = 0
    Else
        Dim i As Long
        For i = 5 To 7
            Dim q As Long
            q = (i Mod NoMonths) - 5

            Dim VectorToSum() As String
            ReDim VectorToSum(0 To q-1)

            Dim w As Long
            For w = 0 To q-1
                VectorToSum(w) = (ws.Cells(38, i).Value * ws.Cells(7, i).Value) / (NoMonths * NoMonths - w)
            Next w

            ws.Cells(48, i).Value = Application.WorksheetFunction.Sum(VectorToSum)
        Next i
    End If
End Sub

Я пробовал это:

            q = (i Mod NoMonths) - 5

            Dim VectorToSum() As Long


            Dim w As Long
            For w = 0 To q
            ReDim VectorToSum(w)
                VectorToSum(w) = (ws.Cells(38, i).Value * ws.Cells(7, i).Value) / (NoMonths * NoMonths - w)
            Next w

            ws.Cells(48, i).Value = Application.WorksheetFunction.Sum(VectorToSum)
        Next i

, но я просто получаю ошибку времени выполнения 5 в следующей строке:

ws.Cells(48, i).Value = Application.WorksheetFunction.Sum(VectorToSum)

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

@ JohnColeman

сделал ваши предложения, теперь я получаю ошибку времени выполнения 6 в этой строке:

                Sum = Sum + (ws.Cells(38, i).Value * ws.Cells(7, i).Value) / (NoMonths * NoMonths - w)

Как вы думаете, в чем проблема сейчас? полный код:

Option Explicit

Public Sub DefferedRev()
    Dim NoMonths As Range
    Set NoMonths = ThisWorkbook.Worksheets("Licence Central").Range("C13")

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("73 Licence C")


    If ws.Range("B40").Value = ws.Range("C82").Value Then
        ws.Range(ws.Cells(48, 5), ws.Cells(48, 7)).Value = 0
    Else
        Dim i As Long
        For i = 5 To 7
            Dim q As Integer
            q = (i - 5 Mod NoMonths)

           ' Dim VectorToSum() As String
            'ReDim VectorToSum(0)

            Dim w As Long
            Dim Sum As Long
            Sum = 0
            For w = 0 To q
                Sum = Sum + (ws.Cells(38, i).Value * ws.Cells(7, i).Value) / (NoMonths * NoMonths - w)
            Next w

            ws.Cells(48, i).Value = Sum
        Next i

    End If
End Sub

0 голосов
/ 01 ноября 2019

Ваш массив представляет собой одно измерение, поэтому вы можете удалить проблемы, связанные с Redim, переключившись на scripting.dictionary (или ArrayList)

Для Scripting.Dictionary вам необходимо добавить ссылку на MicrosoftScritpting Runtime

Для списка массивов вам нужно добавить ссылку на mscorlib, к которой вам нужно будет перейти по адресу C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ mscorlib.dll (или Frameword64если вы используете 64-разрядную версию Office)

Public Sub DefferedRev()
    Dim NoMonths As Range
    Set NoMonths = ThisWorkbook.Worksheets("Sheet4").Range("C13")

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet13")


    If ws.Range("B40").Value = ws.Range("C82").Value Then
        ws.Range(ws.Cells(48, 5), ws.Cells(48, 7)).Value = 0
    Else
        Dim i As Long
        For i = 5 To 7
            Dim q As Long
            q = (i Mod NoMonths) - 5

            Dim VectorToSum As Scripting.Dictionary
            Dim w As Long
            Set VectorToSum = New Scripting.Dictionary

            For w = 0 To q - 1
                VectorToSum.Add w, (ws.Cells(38, i).Value * ws.Cells(7, i).Value) / (NoMonths * NoMonths - w)
            Next w

            ws.Cells(48, i).Value = Excel.Application.WorksheetFunction.Sum(VectorToSum.Items)
        Next i
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...