VBA ActiveCell.Offset意外的结果 – 跳过单元格

在工作表模块中,我得到了下面的代码片段的意外结果。

它正确地做“标签5”和“数量”单元,但“说明”放置在单元格L22而不是B22

我在每个阶段的行号上做了一个debug.print ,它们正在递增。 A21是一个合并的单元格。 如果有任何问题, L22也在工作表的打印区域之外。

如果我取消注释ActiveCell.Offset(lineNumber, 0).Selectselect它select正确的A22单元格,但然后将QtyDescription放入单元格A23B23哪些在适当的列,但错误的行。

 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 

offsetissue

这就是为什么你不应该使用Active*SelectOffset 。 分别使用硬对象引用{null}和CellsRange 。 你正在编写一个固定的布局,所以只需要硬编码:

 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"