【问题标题】:Find Copy and Paste in VBA macro在 VBA 宏中查找复制和粘贴
【发布时间】:2016-02-16 17:02:07
【问题描述】:

我正在尝试编写一个宏,它可以从一张纸上搜索数据并将其复制到另一张纸上。

但现在我遇到了一个问题,因为我想在两次搜索之间复制数据并将多个单元格中的整个数据粘贴到一个单元格中。

例如上图中我的宏:

  1. 搜索“--------------”和“*****END OF RECORD”
  2. COPIES 介于两者之间的所有内容,此处为第 29 行和第 30 行以及 A、B、C 列中的示例数据
  3. 粘贴将多个单元格 A29、B29、C29 和 A30、B30、C30 中的所有数据粘贴到表 2 中的单个单元格中,例如单元格 E2。

  4. 此模式在 A 列中再次出现,因此我想搜索下一次出现并执行所有步骤 1、2、3,这次我将其粘贴到 Sheet2 的单元格 E3 中。

下面是代码: 我能够搜索我的模式,但很难在这些搜索模式之间提供对单元格的引用,然后将所有数据复制到一个单元格。

 x = 2: y = 2: Z = 7000: m = 0: n = 0

Do
x = x + 1
If ThisWorkbook.Sheets("lic").Range("A" & x) = "---------------------" Then m = x
If ThisWorkbook.Sheets("lic").Range("A" & x) = "****** END OF RECORD" Then n = x
If (n > 0) Then

    Do
    For i = m To n
    ThisWorkbook.Sheets("lic").Range("A" & i + 1).Copy
    ThisWorkbook.Sheets("lic").Range("B" & i + 1).Copy
    ThisWorkbook.Sheets("lic").Range("C" & i + 1).Copy


'If (n > 0) Then ThisWorkbook.Sheets("Sheet1").Range("E" & y) = ThisWorkbook.Sheets("lic").Range("A" & m + 1, "C" & n - 1): y = y + 1
'If (n > 0) Then ThisWorkbook.Sheets("Sheet1").Range("E" & y).Resize(CopyFrom.Rows.Count).Value = CopyFrom.Value: y = y + 1
Loop While Not x > Z

'Driver's Licence #:Driver's Licence #:Driver's Licence #:

x = 2: y = 2: Z = 7000: counter = 1
Do
x = x + 1
If ThisWorkbook.Sheets("lic").Range("A" & x) = "Driver's Licence #:" Then counter = counter + 1
If (counter = 2) Then ThisWorkbook.Sheets("Sheet1").Range("B" & y) = ThisWorkbook.Sheets("lic").Range("C" & x): y = y + 1: counter = 0
If x = Z Then Exit Sub
Loop
End Sub

【问题讨论】:

    标签: vba copy find paste


    【解决方案1】:

    考虑到搜索正常,关于复制的事情你只需要做:

    Sheet2.Range("E2").value = ThisWorkbook.Sheets("lic").Range("A" & i + 1).value & ";" & ThisWorkbook.Sheets("lic").Range("B" & i + 1).value & ";" & ThisWorkbook.Sheets("lic").Range("C" & i + 1).value
    

    结果将类似于:AIR COO;大号数据;一个

    --------更新---------

    很难理解你的代码,所以我正在写一个新的。基本上是将在 sheet1 上找到的内容复制到 sheet2。

    Sub Copy()
    
    Dim count As Integer 'Counter of loops to the for
    Dim Z As Integer 'Limit of (?)
    Dim h As Integer 'Count the filled cells on sheet2
    Dim y As Integer 'Counter the columns to be copied
    
    Z = 7000
    h = 1
    
    
    'Assuming that the "----" will always be on the top, the code will start searching on the second row
    'if it's not true, will be needed to validate this to.
    For count = 2 To Z
    
        If Sheet1.Cells(count, 1).Value <> "****** END OF RECORD" Then
    
            If Sheet1.Cells(count, 1).Value <> "" Then
    
                For y = 1 To 3 'In case you need to copy more columns just adjust this for.
    
                    Sheet2.Cells(h, 1).Value = Sheet2.Cells(h, 1).Value & Sheet1.Cells(count, y).Value
    
                Next y
    
                h = h + 1
    
            End If
    
        Else
    
            MsgBox "END OF RECORD REACHED"
            Exit Sub
    
        End If
    
    Next count
    
    End Sub
    

    也许我没有得到完整的想法,但这可能对你有用。

    【讨论】:

    • 非常感谢 Felipe,它的工作原理。我面临的唯一挑战是,如果我们正在处理来自单元格 A1 B1 C1 的数据,我实际上想从更多范围内复制数据,就像上面的代码一样。我希望灵活地从 A1 B1 C1 A2 B2 C2 、 A3 B3 C3 等复制数据。那是我正在使用变量 i ,但问题是:我不确定如何在此范围内使用 Do 或 For 循环。
    【解决方案2】:

    我完全不确定你想在最终输出中看到什么,所以这是一个有根据的猜测:

    Sub DenseCopyPasteFill ()
    
      Dim wsFrom, wsTo As Worksheet
      Dim ur As Range
      Dim row, newRow As Integer
      Dim dataOn As Boolean
      Dim currentVal As String
    
      dataOn = False
      newRow = 3
    
      Set wsFrom = Sheets("Sheet1")
      Set wsTo = Sheets("Sheet2")
      Set ur = wsFrom.UsedRange
    
      For row = 1 To ur.Rows.Count
        If wsFrom.Cells(row, 1).Value2 = "--------------" Then
          dataOn = True
        ElseIf wsFrom.Cells(row, 1).Value2 = "***** END OF RECORD" Then
          newRow = newRow + 1
          dataOn = False
        ElseIf dataOn Then
          currentVal = wsTo.Cells(newRow, 5).Value2
          wsTo.Cells(newRow, 5).Value2 = currentVal & _
              wsFrom.Cells(row, 1) & wsFrom.Cells(row, 2) & _
              wsFrom.Cells(row, 3)
        End If
    
      Next row
    End Sub
    

    如果您不使用 Windows 剪贴板就可以逃脱,我会的。在这里,我演示了如何简单地添加或附加值,而不是复制/粘贴。

    【讨论】:

    • 谢谢汉波恩。 .我很抱歉没有很好地解释我的问题..非常感谢您的回复。我将尝试使用此代码。但对我来说它有点复杂......谢谢
    【解决方案3】:

    添加这个子:

    Sub copy_range(rng As Range)
    Dim str As String
    str = rng.Cells(1).Value & rng.Cells(2).Value & rng.Cells(3).Value
    Range("E" & Range("E" & Rows.Count).End(xlUp).Row + 1).Value = str
    End Sub
    

    那么你的 for 循环应该是这样的:

    For i = m To n
        copy_range ThisWorkbook.Sheets("lic").Range("A" & i + 1 & ":C" & i + 1)
    Next i
    

    【讨论】:

    • 谢谢卡米尔,我会试一试,然后告诉你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多