[英]VBA ActiveCell.Offset unexpected results - skipping cells
在工作表模块中,下面的代码段使我得到了意外的结果。
它可以正确执行“标签5”和“数量”单元格,但“描述”放置在单元格L22
而不是在B22
我在每个阶段的行号上执行了debug.print
,并且它们正在递增。 A21
是合并的单元格。 如果重要的话, L22
也在工作表的打印区域之外。
如果我取消注释ActiveCell.Offset(lineNumber, 0).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
如果需要重用此参数,则可以向其传递行参数,以获取合并的“标题”单元格所在的位置:
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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.