cells()。value = …应用程序或对象定义的错误
我想在新的表格中创build一个汇总表,而现在我只是在粗暴地做这个工作。 我将在未来尝试更优雅的解决scheme。
无论如何,这是我到目前为止的代码:
Sub createsummarytable() Worksheets.Add().Name = "datasummary" With Worksheets("datasummary") Dim i As Long Dim Startpoint As Long Startpoint = -5 For i = 1 To 40 .Cells(Startpoint + (5 * i), 1).Value = "Block" & "i" Next i End With End Sub
我得到的错误标题行: .Cells(Startpoint + (5 * i), 1).Value = "Block" & "i"
如果有人想让代码更加优雅,除了解决错误,这将不胜感激。
关接一个。 Excel中没有列/行0; -5 + (5 * 1)
评估为0:
.Cells(0, 1).Value = 42 'same error
你需要调整+1:
For i = 1 To 40 .Cells(Startpoint + (5 * i) + 1, 1).Value = "Block" & i Next i
如果您的代码按预期工作,请在代码审阅的新问题中描述您的工作代码。
@Mat's Mug拿起了closures的错误,@ kpg987把"i"
当成了string而不是variables,但是你的代码可以改进。
以下是我所做的一些更改:
-
将程序适用于私人或公共
-
使用有意义的名字
-
使用常量来确定每个块的每行的起始行和编号。
StartingPoint = -5
是没有用的,而START_ROW = 1
很清楚它是什么以及它在哪里开始。 -
调整公式以使用常量。
-
明确指向目标工作簿,否则将使用活动工作簿。
-
使用add命令时,设置对添加的工作表的引用。
-
With
命令使用强types引用,因为With Worksheets("datasummary")
将会延迟绑定) -
将camelCasing用于variables名称
结果:
Private Sub createSummaryTable() Const WORKSHEET_NAME As String = "datasummary" Const START_ROW As Long = 1 Const BLOCK_COLUMN as Long = 1 Const BLOCK_SIZE As Long = 5 Const BLOCK_COUNT As Long = 40 Const BLOCK_PREFIX As String = "Block" Dim dataSummary As Worksheet Set dataSummary = ThisWorkbook.Worksheets.Add With dataSummary .Name = WORKSHEET_NAME Dim blockCounter As Long For blockCounter = 1 To BLOCK_COUNT .Cells(START_ROW + (BLOCK_SIZE * (blockCounter - 1)), BLOCK_COLUMN).Value = BLOCK_PREFIX & blockCounter Next blockCounter End With End Sub
一个“无回路”的方法:
Private Sub createSummaryTable2() Dim dataSummary As Worksheet With ThisWorkbook.Worksheets.Add .Name = "datasummary" With .Range("A1").Resize((40 - 1) * 5 + 1) .FormulaR1C1 = "=IF(MOD(ROW(),5)=1,""Block"" & int(ROW()/5)+1,"""")" .Value = .Value End With End With End Sub