如何解决:“下标超出范围”,运行时错误“ 9”

时间:2019-10-30 11:32:51

标签: excel vba

VBA的新功能,问题似乎在下面,

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

不能确定为什么在sheet4的c13单元格中包含数字值,例如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 个答案:

答案 0 :(得分:2)

  

下标超出范围

表示Worksheets()属性找不到名为Sheet4的工作表。

  1. 确保工作表名称在Sheet4之前,之后或之间没有其他空格。如有任何疑问,请重命名以确保正确命名工作表。

  2. 在处理多个工作簿的情况下(或通常遵循一种好的做法),请使用以下命令指定工作表在哪个工作簿中:

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

另外,我建议使用Option Explicit并声明所有变量的属性,然后再使用它们。例如:

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

此外,如果使用Cells(48, i).Value = 0,则不会定义此单元格在哪个工作簿中。因此,Excel会做出猜测,并且可能会失败。 始终为所有RangeCellsRowsColumns对象指定一个工作簿/工作表。

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

更好的方法是将工作表设置为一个变量,以使您的代码简短,干净并重新使用该变量。

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

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

最后,我强烈建议使用有意义的变量名称和工作表名称。 Sheet13Sheet4是名字的非常糟糕的选择。选择一个好名字应该是您要做的第一件事。因为如果这样做,您将不得不在代码中的任何地方进行更改。


所以最后您的代码应该是这样的:

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