【问题标题】:How to turn found cell into a range?如何将找到的单元格变成一个范围?
【发布时间】:2016-10-17 00:06:25
【问题描述】:

如果您能提供帮助,我将不胜感激,因为我真的很想让它发挥作用。我这里有一些代码,旨在从电子表格的一部分中提取信息并将其粘贴到电子表格另一部分的表格中。

For i = 1 To 24
        Range("J11:J100").Select
        Set foundCell = Cells.Find(What:="PL " & i, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False)
        If Not foundCell Is Nothing Then
            foundCell.Activate
            foundCell.Copy
            Range("P" & (i + 10)).Select
            ActiveSheet.Paste
        End If
        Next

主要问题是我还想使用 foundCell 作为参考从周围的列中复制信息,例如。 foundCell.Offset(, -4).Copy

我添加了这个,但它不起作用(附录已标记):

    For i = 1 To 24
            Range("J11:J100").Select
            Set foundCell = Cells.Find(What:="PL " & i, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
                :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
                False, SearchFormat:=False)
            If Not foundCell Is Nothing Then
                foundCell.Activate
                foundCell.Copy
                Range("P" & (i + 10)).Select
                ActiveSheet.Paste
' BEGIN ADDITION
                foundCell.Offset(, -4).Copy
                Range("S" & (i + 10)).Select
                ActiveSheet.Paste
'END ADDITION
            End If
            Next

我进行了测试,发现 foundCell 现在引用的是数据粘贴到的范围,而不是找到它的原始范围。

谁能帮帮我?我对任何事情都持开放态度。我觉得最好的解决方案是将 foundCell 变成一个范围,但我不知道该怎么做。

【问题讨论】:

    标签: vba excel copy find range


    【解决方案1】:

    以下应该可以解决您的问题:

    For i = 1 To 24
        Set foundCell = Cells.Find(What:="PL " & i, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False)
        If Not foundCell Is Nothing Then
            foundCell.Copy Destination:=foundCell.Parent.Range("P" & (i + 10))
            ' BEGIN ADDITION
            If foundCell.Column > 4 Then
                foundCell.Offset(0, -4).Copy Destination:=foundCell.Parent.Range("S" & (i + 10))
            End If
            'END ADDITION
        End If
    Next i
    

    基本上,问题在于您的代码中的select。您可能想阅读以下有关如何在将来避免它们的帖子: How to avoid using Select in Excel VBA macros

    【讨论】:

    • 酷!有用! 'If foundCell.Column > 4 Then' 行是怎么回事?
    • 这一行只是为了良好的编码实践。假设foundCell 在列C 中。然后下一行代码会抛出错误,因为foundCell.Offset(0, -4) 将引用A 之前的列。由于没有这样的列,您会得到一个错误。我猜你很确定foundCell 应该总是在D 列中(或更高)。但是,您可以通过将值 PL 2 放入列 C 来测试它(例如 C1PL 2 然后运行带有 / 不带有 If 子句的代码,您会看到不同之处。
    • 嗯实际上我不知道它为什么停止工作......我仍然很困惑。出于某种原因,它只是复制某些值
    • 它复制的值会根据我在启动宏时选择的单元格而变化
    • 抱歉不清楚。不过,我真的很感激帮助。我赞成你的回答。谢谢拉尔夫。
    【解决方案2】:

    我认为这将满足您的需求。在 J11:J100 范围内找到所需的单元格后,它会查看与找到的单元格对应的 F 列中的单元格,并将它们都粘贴到所需的单元格中。

    Sub PasteTest()
    Dim i As Integer
    Dim SearchRange, foundCell As Range
    
        Set SearchRange = Range("J11:J100")
        With SearchRange
            For i = 1 To 24
                Set foundCell = .Cells.Find("PL " & i)
                If Not (foundCell Is Nothing) Then
                    Range("P" & (i + 10)) = foundCell
                    Set foundCell = foundCell.Offset(, -4)
                    Range("S" & (i + 10)) = foundCell
                End If
            Next
    End With
    
    End Sub
    

    与其他答案一样,我避免使用 select,因为它只会减慢代码速度。使用多个(命名的)范围允许您在不使用剪贴板的情况下复制数据。

    【讨论】:

    • 你知道是否有办法将链接引用粘贴到单元格而不是单元格本身中的数据?
    • 要实现这一点,只需将Range("P" & (i + 10)) = foundCell 更改为Range("P" & (i + 10)).Formula = "=" & foundCell.Address 并将Range("S" & (i + 10)) = foundCell 更改为Range("S" & (i + 10)).Formula = "=" & foundCell.Address
    • 太棒了!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多