我想在新表格中创建一个汇总表,目前我只是非常粗暴地做这件事。我将来会尝试更优雅的解决方案。
无论如何,这是我到目前为止的代码:
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"
如果除了解决错误之外,还有人希望使代码更优雅,那将不胜感激。
答案 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