在活动单元格行中选择范围

时间:2018-10-23 15:15:12

标签: excel vba excel-vba range offset

我已经看到了其他一些与我的问题类似的问题,并且尝试了几种不同的解决方案,但结果仍然很奇怪。我的代码在AA列的另一个工作簿中找到了一个值,然后我想将该行从C列复制到BC列并粘贴到当前工作簿中。除了从C列复制到BC之外,所有代码均有效。由于某种原因,它开始复制AC列中的行。我尝试了一个标准范围,但我认为它是相对于活动单元格而言的相对范围,我不知道是否有一种方法可以处理负列字母,因此我尝试了Offset和.Cells,但都没有选择正确的范围。这是我尝试过的代码的几个示例:

Private Sub ComboBox1_Change()

Dim checknum As String
Dim chkrow As String
Dim Rng As Range

prfile1 = Worksheets("setup").Range("B10").Value
prfile2 = Worksheets("setup").Range("B7").Value
filepath = Worksheets("setup").Range("e10").Value

checknum = ComboBox1.Value

'Workbooks.Open filepath & prfile2
Windows(prfile2).Activate
Worksheets("MRegister").Select

With Worksheets("MRegister").Range("AA:AA")
    Set Rng = .Find(What:=checknum, _
                        After:=.Cells(.Cells.Count), _
                        LookIn:=xlFormulas, _
                        LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:=False)
            Rng.Select
            .Range(.Cells(ActiveCell.Row, -24), .Cells(ActiveCell.Row, 28)).Select
            Selection.Copy
End With

Windows(prfile1).Activate
Sheets("ReprintOld").Range("M203:BM203").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Application.CutCopyMode = False
Windows(prfile2).Activate
Sheets("MRegister").Range("A1").Select
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
Sheets("ReprintOld").Range("A1").Select

End Sub

偏移量:

.Range(ActiveCell.Offset(0, -24), ActiveCell.Offset(0, 28)).Select

对于标准范围:

.Range("C" & ActiveCell.Row & ":BC" & ActiveCell.Row).Select

您会认为所有这些都可以使用,但是它们都在活动单元格右侧的几列中开始了选择。

3 个答案:

答案 0 :(得分:1)

问题是此行:.Range(.Cells(ActiveCell.Row, -24), .Cells(ActiveCell.Row, 28)).Select

由于With语句引用了With Worksheets("MRegister").Range("AA:AA"),因此它试图查找“ AA”列的.Range属性。

如果将其重写为Worksheets("MRegister").Range(.Cells(ActiveCell.Row, -24), .Cells(ActiveCell.Row, 28)).Select之类的字样,它应该可以工作。

答案 1 :(得分:1)

问题是,正如user3561813提到的那样,您在With语句的末尾有一个Range对象。也许最简单的解决方案是使用:

Intersect(Rng.Entirerow, .Worksheet.Range("C:BC")).Copy

答案 2 :(得分:1)

.find之后的内容如何?

Rng.offset(0,3-rng.column).resize(1,53).copy

Rng是对具有所需校验数的单元格的引用,将零行偏移并返回C列,然后将其大小调整为1列乘53列(C到BC)并复制它。

在复制之前,您应该检查发现是否可行:

如果不是rng则为空

您不需要选择