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
答案 0 :(得分:2)
下标超出范围
表示Worksheets()
属性找不到名为Sheet4
的工作表。
确保工作表名称在Sheet4
之前,之后或之间没有其他空格。如有任何疑问,请重命名以确保正确命名工作表。
在处理多个工作簿的情况下(或通常遵循一种好的做法),请使用以下命令指定工作表在哪个工作簿中:
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会做出猜测,并且可能会失败。 始终为所有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