VBA ActiveCell.Offset意外的结果 – 跳过单元格
在工作表模块中,我得到了下面的代码片段的意外结果。
它正确地做“标签5”和“数量”单元,但“说明”放置在单元格L22
而不是B22
我在每个阶段的行号上做了一个debug.print
,它们正在递增。 A21
是一个合并的单元格。 如果有任何问题, L22
也在工作表的打印区域之外。
如果我取消注释ActiveCell.Offset(lineNumber, 0).Select
select它select正确的A22
单元格,但然后将Qty
和Description
放入单元格A23
和B23
哪些在适当的列,但错误的行。
Sub test() On Error Resume Next Dim lineNumber As Integer lineNumber = 0 Worksheets(1).range("A21").Select ActiveCell.Offset(lineNumber, 0).value = "Label 5" 'A21 lineNumber = lineNumber + 1 ActiveCell.Offset(lineNumber, 0).value = "Qty" 'A22 ActiveCell.Offset(lineNumber, 1).value = "Description" 'B22 -- Prints to L22 lineNumber = lineNumber + 1 End Sub
这就是为什么你不应该使用Active*
, Select
和Offset
。 分别使用硬对象引用{null}和Cells
或Range
。 你正在编写一个固定的布局,所以只需要硬编码:
Sub test() With Worksheets(1) .Range("A21").Value = "Label 5" `On merged ranges, just use the top left cell. .Range("A22").Value = "Qty" .Range("B22").Value = "Description" End With End Sub
如果您需要重新使用它,则可以将合并的“标题”单元格所在的位置的行parameter passing给它:
Private Sub WriteHeaders(targetSheet As Worksheet, titleRow As Long, heading As String) With targetSheet .Cells(titleRow, 1).Value = heading .Cells(titleRow + 1, 1).Value = "Qty" .Cells(titleRow + 1, 2).Value = "Description" End With End Sub
那么你可以这样调用它:
WriteHeaders Worksheets(1), 21, "Label 5"