Индекс вне диапазона
означает, что свойство Worksheets()
не может найти лист с именем Sheet4
.
Убедитесь, чтоимя листа не имеет дополнительных пробелов до, после или между Sheet4
. В случае каких-либо сомнений переименуйте его, чтобы обеспечить правильное наименование листа.
В случае работы с несколькими рабочими книгами (или в целом в соответствии с рекомендациями) укажите, в какую рабочую книгу входит ваша рабочая таблица:
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