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