Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用.Find和Offset调试VBA代码?_Vba_Excel - Fatal编程技术网

如何使用.Find和Offset调试VBA代码?

如何使用.Find和Offset调试VBA代码?,vba,excel,Vba,Excel,我正在练习VBA,我的代码需要一些帮助/更正。 在这个任务中,我将创建一个搜索工具,从组合框中查找每个工作表中的选定值。每个结果都列在第一页上 问题: 在代码中,我定义了.Find方法,范围为rFound。在每个工作表上,搜索值位于D列。我想将行从列B复制到E。我已经评论了一次尝试,我是如何尝试用偏移量选择该范围的,但我收到了一个错误。为什么以及如何解决这个问题 当我想粘贴(列出)结果时,我希望它从第1页第3行列K开始。运行代码后,它选择正确的目标,但不粘贴任何内容。如何解决这个问题 我还尝试在

我正在练习VBA,我的代码需要一些帮助/更正。 在这个任务中,我将创建一个搜索工具,从组合框中查找每个工作表中的选定值。每个结果都列在第一页上

问题:

  • 在代码中,我定义了
    .Find
    方法,范围为
    rFound
    。在每个工作表上,搜索值位于
    D列
    。我想将行从列
    B
    复制到
    E
    。我已经评论了一次尝试,我是如何尝试用偏移量选择该范围的,但我收到了一个错误。为什么以及如何解决这个问题

  • 当我想粘贴(列出)结果时,我希望它从第1页第3行列
    K
    开始。运行代码后,它选择正确的目标,但不粘贴任何内容。如何解决这个问题

  • 我还尝试在每次搜索结果后复制文档标题,但我将其注释掉了,请忽略带有
    getOwner
    的行

    Dim ws As Worksheet, OutputWs As Worksheet, wsLists As Worksheet
    Dim rFound As Range ', getOwner As Range
    Dim strName As String
    Dim count As Long, LastRow As Long
    Dim IsValueFound As Boolean
    'Dim cboSelectName As ComboBox
    Dim a As String
    
    
    IsValueFound = False
    Set OutputWs = Worksheets("Teszt")    '---->change the sheet name as required
    LastRow = OutputWs.Cells(Rows.count, "A").End(xlUp).Row
    Set wsLists = Worksheets("Lists")
    
    a = ComboBox1.Value
    
    On Error Resume Next
    strName = a
    If strName = "" Then Exit Sub
    For Each ws In Worksheets
        If ws.Name <> "Output" Then
            With ws.UsedRange
                Set rFound = .Find(What:=strName, After:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole)
                If Not rFound Is Nothing Then
                    Application.Goto rFound, True
                    IsValueFound = True
                    'MsgBox rFound.Row
                    rFound.EntireRow.Copy
                    'Rfound keres - rFound.Range(rFound(Offset(-2,")),rFound.Offset(1,"")).Copy  ' ---> This is a suggestion
                    OutputWs.Cells(LastRow + 2, 11).PasteSpecial xlPasteAll
                    'getOwner.Range(K2, R2).Copy        ' attempt to copy the header for each search result
                    'getOwner.Cells(LastRow + 1, 6).Paste
                    Application.CutCopyMode = False
                    LastRow = LastRow + 1
                End If
            End With
        End If
    Next ws
    On Error GoTo 0
    If IsValueFound Then
       OutputWs.Select
       MsgBox "Search Complete!"
    Else
        MsgBox "Value not found"
    End If
    
    Dim ws As Worksheet,OutputWs As Worksheet,wslist As Worksheet
    Dim rFound As Range',getOwner As Range
    将strName设置为字符串
    按长度计算,最后一行按长度计算
    Dim IsValueFound为布尔值
    'Dim cboSelectName作为组合框
    像线一样变暗
    IsValueFound=False
    设置OutputWs=工作表(“Teszt”)”--->根据需要更改工作表名称
    LastRow=OutputWs.Cells(Rows.count,“A”).End(xlUp).Row
    设置wsLists=工作表(“列表”)
    a=ComboBox1.Value
    出错时继续下一步
    strName=a
    如果strName=“”,则退出Sub
    对于工作表中的每个ws
    如果ws.Name是“输出”,那么
    使用ws.UsedRange
    设置rFound=.Find(What:=strName,After:=.Cells(1,1),LookIn:=xlValues,LookAt:=xlWhole)
    如果没有找到,那就什么都不是了
    Application.Goto-rFound,True
    IsValueFound=True
    'MsgBox rFound.Row
    rFound.EntireRow.Copy
    'Rfound keres-Rfound.Range(Rfound(Offset(-2)”),Rfound.Offset(1)”)。Copy'-->这是一个建议
    OutputWs.Cells(LastRow+2,11).PasteSpecial xlPasteAll
    'getOwner.Range(K2,R2).Copy'尝试复制每个搜索结果的标题
    'getOwner.Cells(LastRow+1,6).粘贴
    Application.CutCopyMode=False
    LastRow=LastRow+1
    如果结束
    以
    如果结束
    下一个ws
    错误转到0
    如果找到了,那么
    OutputWs.Select
    MsgBox“搜索完成!"
    其他的
    MsgBox“未找到值”
    如果结束
    
    您正在选择整行,但正在将其粘贴到K列。如果您复制整行,则只能将其复制到A列。这就是它不起作用的原因。因此,我建议您使用偏移部分。 在偏移量中,第一部分是行,第二部分是列。 你可以这样做

    Dim sth as Range
    set sth = .range(.rfound.offset(0,-2),.rfound.offset(0,1)).copy
    

    但是我不确定。这方面不是很好。

    我不完全确定你在哪里复制什么,但是复制
    rFound
    的行到列
    K
    输出
    的单元格
    应该是
    应用程序。Intersect(rFound.EntireRow,rFound.sheet.Range(“B:E”)。复制OutputWs.cells(LastRow+2,“K”)
    。或
    rFound.EntireRow.Cells(1,“B”)、rFound.EntireRow.Cells(1,“E”)、Copy OutputWs.Cells(LastRow+2,“K”)
    。或
    rFound.EntireRow.Cells(1,“B”)。Resize(1,4)。Copy OutputWs.Cells(LastRow+2,“K”)
    。最后一个正在使用rFound.EntireRow.Cells(1,“B”)。Resize(1,4)。复制不幸的是,搜索没有…你能告诉我为什么代码不搜索下拉列表值吗?在我的excel工作表中,我想列出每个工作表上出现的所有名称,这些名称是从下拉列表中选择的。我在第2页的每行中创建了一个类似4个相同名称的示例。当我运行代码时,它只显示第一个r结果。这是为什么?它们都在工作,并且做完全相同的事情。因为
    Find
    一次只找到一个匹配项。如果你想要所有匹配项,你可以。