cells()。value = ...应用程序或对象定义的错误

时间:2016-11-01 03:31:24

标签: excel vba

我想在新表格中创建一个汇总表,目前我只是非常粗暴地做这件事。我将来会尝试更优雅的解决方案。

无论如何,这是我到目前为止的代码:

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"

如果除了解决错误之外,还有人希望使代码更优雅,那将不胜感激。

3 个答案:

答案 0 :(得分:2)

关接一个。 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

如果您的代码按预期工作,请在Code Review上的新问题中描述您的工作代码。

答案 1 :(得分:0)

@Mat的Mug选择 off-by-one 错误,@ kpg987将"i"用作字符串文字而不是变量,但是你的代码可以改进。

以下是我所做的一些更改:

  • 将程序范围限定为私人或公共

  • 使用有意义的名称

  • 使用常量确定每个块的每行的起始行和数量。 StartingPoint = -5不是很有用,而START_ROW = 1非常清楚它是什么以及它实际上会从哪里开始。

  • 调整公式以使用常量。

  • 明确引用目标工作簿,否则将使用活动工作簿。

  • 使用add命令时设置对添加的工作表的引用。

  • 使用带有With命令的强类型引用,因为With Worksheets("datasummary")将被延迟绑定)

  • 将camelCasing用于变量名称

<强>结果:

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

答案 2 :(得分:0)

“无循环”方法:

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