excel 将值和行号复制到另一张图纸

0sgqnhkj  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(95)

我有一段代码,它查找一个文本字符串,并将它找到的每个示例的整个单元格内容复制到另一个工作表上的一列。原始数据可能包含重复的数据,所以我想在粘贴单元格值的列旁边添加行号。
这可能吗?
在下面的示例中,它搜索工作表“源代码”的A列中包含“AIN:”的任何单元格,并将其复制到工作表“AIN”的A列中的下一个空单元格。希望能够将复制的值的行号添加到工作表“AIN”的B列
问候你,亚当

Dim SrchRng As Range, cel As Range
Dim lastRow As String
Set SrchRng = Worksheets("Source Code").Range("A:A")

Sheets("Source Code").Select
For Each cel In SrchRng
    If InStr(1, cel.Value, "AIN:") > 0 Then
        cel.Copy
        lastRow = Worksheets("AIN").Cells(Rows.Count, "A").End(xlUp).Row + 1
        Worksheets("AIN").Range("A" & lastRow).PasteSpecial Paste:=xlPasteValues
    End If
Next cel

在这里搜索,但找不到类似的问题。找到了如何从谷歌获取行号,但到目前为止尝试了下面的方法,它卡住了...(rownum上的“无效限定符”。复制行)

For Each cel In SrchRng
    If InStr(1, cel.Value, "AIN:") > 0 Then
        cel.Copy
        rownum = cel.Row
        lastRow = Worksheets("AIN").Cells(Rows.Count, 
"A").End(xlUp).Row + 1
        Worksheets("AIN").Range("A" & lastRow).PasteSpecial Paste:=xlPasteValues
        rownum.Copy
        Worksheets("AIN").Range("B" & lastRow).PasteSpecial Paste:=xlPasteValues
    End If
Next cel
2vuwiymt

2vuwiymt1#

当然有可能。
对您的代码的一些评论和改进:

  • 如果你只想复制单元格的内容,请使用Value-属性。不要使用Copy&Paste,这会降低代码的速度。
  • 不需要在工作表上使用select。Range(SrchRng)已经知道您要在哪个工作表上工作。
  • lastRow声明为number(Long,不要使用Integer)。
  • 你只需要找到你的目标工作表中使用的最后一行一次,之后,只需将lastRow的值增加1。
  • 要访问下一个(或下一个,或上一个,你明白的)单元格,使用函数Offset,例如Range("A" & lastRow).Offset(0, 1)(偏移0行和1列)。
  • 我使用With-子句访问目标工作表,这避免了重复指定ThisWorkbook.Worksheets("AIN")。注意.Cells.Range前面的点。
  • 你正在遍历A列的所有单元格(〉200万个),这将花费相当长的时间。你应该把它限制在真正使用的单元格上。有几种方法可以做到这一点(例如,计算最后一行,类似于你在目标工作表中所做的)。我展示了一种不同的方法,使用Intersect
  • 循环遍历col A的所有单元格的另一种方法是使用Find并循环遍历结果,或者设置AutoFilter并循环遍历可见单元格。

你的代码可能看起来像这样:

Dim SrchRng As Range, cel As Range
Set SrchRng = Intersect(ThisWorkbook.Worksheets("Source Code").Range("A:A"), _
                        ThisWorkbook.Worksheets("Source Code").UsedRange)

With ThisWorkbook.Worksheets("AIN")
    Dim lastRow As Long
    lastRow = .Cells(Rows.Count, "A").End(xlUp).row

    For Each cel In SrchRng
        If InStr(cel.Value, "AIN:") > 0 Then
            lastRow = lastRow + 1
            .Range("A" & lastRow).Value = cel.Value
            .Range("A" & lastRow).Offset(0, 1).Value = cel.row
        End If
    Next cel
End With

相关问题