Как исправить: «индекс вне диапазона», ошибка времени выполнения «9» - PullRequest
0 голосов
/ 30 октября 2019

Впервые в VBA, проблема выглядит следующим образом:

Set NoMonths = Worksheets("Sheet4").Range("C13")

Не уверен, почему, как в ячейке c13 на листе 4, содержится числовое значение, например, 5.

Может кто-топомогите пожалуйста.

Полный код:

Sub DefferedRev()

    Set NoMonths = Worksheets("Sheet4").Range("C13")
    Dim i As Integer
    Dim q As Integer


    If Worksheets("Sheet13").Range("B40") = Worksheets("Sheet13").Range("C82") Then
        For i = 5 To 7
            Cells(48, i).Value = 0
        Next i
    Else
        For i = 5 To 7
            q = (i Mod NoMonths) - 5
            Dim VectorToSum() As String
            ReDim VectorToSum(1 To q)
            For w = 1 To q
                VectorToSum(w) = (Worksheets("Sheet13").Cells(38, i).Value * Worksheets("Sheet13").Cells(7, i).Value) / (NoMonths * NoMonths - w)
            Next w
            ValueIn = Application.WorksheetFunction.Sum(VectorToSum)

            Cells(48, i).Value = ValueIn
        Next i
    End If

End Sub

1 Ответ

2 голосов
/ 30 октября 2019

Индекс вне диапазона

означает, что свойство Worksheets() не может найти лист с именем Sheet4.

  1. Убедитесь, чтоимя листа не имеет дополнительных пробелов до, после или между Sheet4. В случае каких-либо сомнений переименуйте его, чтобы обеспечить правильное наименование листа.

  2. В случае работы с несколькими рабочими книгами (или в целом в соответствии с рекомендациями) укажите, в какую рабочую книгу входит ваша рабочая таблица:

    Set NoMonths = ThisWorkbook.Worksheets("Sheet4").Range("C13") 'ThisWorkbook is the workbook this code is in
    

Кроме того, я рекомендую использовать Option Explicit и объявить все ваши переменные proplery, прежде чем использовать их. Например:

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

Далее, если вы используете Cells(48, i).Value = 0, вы не определяете, в какой книге эта ячейка. Так что Excel делает предположение, и он может потерпеть неудачу. Всегда укажите рабочую книгу / рабочий лист для всех Range, Cells, Rows, Columns объектов.

Thisworkbook.Worksheets("Sheet13").Cells(48, i).Value = 0

Лучший подход - установить рабочие листы в переменнуючтобы сделать ваш код коротким, чистым и использовать эту переменную повторно.

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

ws.Cells(48, i).Value = 0

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


Таким образом, в конце ваш код должен выглядеть примерно так:

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
        'For i = 5 To 7
        '    ws.Cells(48, i).Value = 0
        'Next i

        'this loop can be written at once (faster!)
        'replace it with the following line
        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(1 To q)

            Dim w As Long
            For w = 1 To q
                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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...