如何使用特定单词在excel中复制一行并粘贴到另一张excel工作表?

如何使用特定单词在excel中复制一行并粘贴到另一张excel工作表?,excel,vba,Excel,Vba,我检查了很多不同的帖子,似乎找不到我要找的确切代码。此外,我以前从未使用过VBA,所以我尝试从其他帖子中获取代码,并输入我的信息以使其工作。还没有运气。在工作中,我们有一个Excel的工资系统。我正在尝试搜索我的名字“Clarke,Matthew”,然后复制该行并将其粘贴到我保存在桌面上的工作簿“Total hours”扩展timrau在其评论中所说的内容,您可以使用自动筛选功能查找包含您姓名的行。(请注意,我假设您打开了源工作簿) 正如您所看到的,我为您的工作簿的特定设置添加了占位符。经过尝试

我检查了很多不同的帖子,似乎找不到我要找的确切代码。此外,我以前从未使用过VBA,所以我尝试从其他帖子中获取代码,并输入我的信息以使其工作。还没有运气。在工作中,我们有一个Excel的工资系统。我正在尝试搜索我的名字
“Clarke,Matthew”
,然后复制该行并将其粘贴到我保存在桌面上的工作簿
“Total hours”

扩展timrau在其评论中所说的内容,您可以使用自动筛选功能查找包含您姓名的行。(请注意,我假设您打开了源工作簿)


正如您所看到的,我为您的工作簿的特定设置添加了占位符。

经过尝试和测试。

Sub Sample()
    Dim wb1 As Workbook, wb2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim copyFrom As Range
    Dim lRow As Long '<~~ Not Integer. Might give you error in higher versions of excel
    Dim strSearch As String

    Set wb1 = ThisWorkbook
    Set ws1 = wb1.Worksheets("yourSheetName")

    strSearch = "Clarke, Matthew"

    With ws1

        '~~> Remove any filters
        .AutoFilterMode = False

        '~~> I am assuming that the names are in Col A
        '~~> if not then change A below to whatever column letter
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        With .Range("A1:A" & lRow)
            .AutoFilter Field:=1, Criteria1:="=*" & strSearch & "*"
            Set copyFrom = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
        End With

        '~~> Remove any filters
        .AutoFilterMode = False
    End With

    '~~> Destination File
    Set wb2 = Application.Workbooks.Open("C:\Sample.xlsx")
    Set ws2 = wb2.Worksheets("Sheet1")

    With ws2
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lRow = .Cells.Find(What:="*", _
                          After:=.Range("A1"), _
                          Lookat:=xlPart, _
                          LookIn:=xlFormulas, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Row
        Else
            lRow = 1
        End If

        copyFrom.Copy .Rows(lRow)
    End With

    wb2.Save
    wb2.Close
End Sub
子样本()
将wb1设置为工作簿,将wb2设置为工作簿
将ws1标注为工作表,将ws2标注为工作表
从As范围变暗复制
只要“我假设这些名字都是A列的”就可以了
“~~>如果不是,则将下面的A更改为任何列字母
lRow=.Range(“A”&.Rows.Count).End(xlUp).Row
带.Range(“A1:A”和lRow)
.AutoFilter字段:=1,标准1:=“=*”&strSearch&“*”
设置copyFrom=.Offset(1,0).SpecialCells(xlCellTypeVisible).EntireRow
以
“~~>删除任何筛选器
.AutoFilterMode=False
以
“~~>目标文件
设置wb2=Application.Workbooks.Open(“C:\Sample.xlsx”)
设置ws2=wb2.工作表(“表1”)
与ws2
如果Application.WorksheetFunction.CountA(.Cells)为0,则
lRow=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
其他的
lRow=1
如果结束
copyFrom.Copy.Rows(lRow)
以
wb2.保存
wb2.关闭
端接头
快照


我知道这很古老,但对于其他正在寻找如何实现这一点的人来说,这可以用更直接的方式实现:

Public Sub ExportRow()
    Dim v
    Const KEY = "Clarke, Matthew"
    Const WS = "Sheet1"
    Const OUTPUT = "c:\totalhours.xlsx"
    Const OUTPUT_WS = "Sheet1"

    v = ThisWorkbook.Sheets(WS).Evaluate("index(a:xfd,match(""" & KEY & """,a:a,),)")
    With Workbooks.Open(OUTPUT).Sheets(OUTPUT_WS)
        .[1:1].Offset(.[counta(a:a)]) = v
        .Parent.Save: .Parent.Close
    End With
End Sub

如果您在单个列中搜索关键字(例如,所有“
Clarke,Matthew
”都在a列),那么Excel的筛选功能应该可以工作。也许发布您的搜索结果会给我们提供更好的帮助。你也可以研究一下
VLOOKUP
函数。看看这个修改它以满足你的需要:)或者这个@SiddharthRout你对这个问题的回答对我来说很有用。从谷歌到工作宏在2分钟内,你的链接尽管
ActiveSheet.AutoFilter.Range.Offset(1).Copy
这样做不正确:)请查看我在评论中发布的两个链接。@Siddharth我发现
AutoFilter.Range
工作正常
SpecialCells(xlCellTypeVisible)
也应该可以工作,但是我在返回空白单元格时遇到了一些问题。对于所有反馈,都返回.TY。我正试图使用第二个宏,但现在在这一行收到一条错误消息。自动筛选字段:=1,标准1:=“=*”&strearch&“*”。。。。告诉我“运行时错误1004:范围的自动筛选方法失败”。有什么建议吗?你在这里设置了什么
与.Range(“A1:A”&lRow)
?我保留了相同的设置,然后我尝试了A1:A50,假设它表示A列第1-50行的范围。仍然没有运气。。我刚刚意识到这张表是受保护的,现在当我试图在那张表上运行宏时,它说我不能。还有别的办法吗?我不确定这些表格是否允许使用宏。我该如何发送或发布它?我怀疑我能从这些电脑上找到答案。我还使用一个未受保护的启用宏的文件运行了宏,它确实起了作用。当我试图在其他受保护的文件上使用相同的宏时,我会遇到一个错误,我需要取消对它的保护才能这样做。您没有该工作表的密码吗?
Public Sub ExportRow()
    Dim v
    Const KEY = "Clarke, Matthew"
    Const WS = "Sheet1"
    Const OUTPUT = "c:\totalhours.xlsx"
    Const OUTPUT_WS = "Sheet1"

    v = ThisWorkbook.Sheets(WS).Evaluate("index(a:xfd,match(""" & KEY & """,a:a,),)")
    With Workbooks.Open(OUTPUT).Sheets(OUTPUT_WS)
        .[1:1].Offset(.[counta(a:a)]) = v
        .Parent.Save: .Parent.Close
    End With
End Sub