Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
在VBA中搜索整个工作簿,然后将结果粘贴到另一个工作表中_Vba_Excel - Fatal编程技术网

在VBA中搜索整个工作簿,然后将结果粘贴到另一个工作表中

在VBA中搜索整个工作簿,然后将结果粘贴到另一个工作表中,vba,excel,Vba,Excel,首先,我会在该赊账的地方赊账。这是使用u/Joe的代码组合而成的,它来自Mr.Excel.com和exceltip.com 现在我已经解决了这个问题,我正在尝试创建一个搜索函数,它将在excel中搜索我的9页文档,以查找输入到搜索框中的值。然后将这些值粘贴到工作簿的第一页 我需要在代码中做哪些更改才能将其粘贴到搜索页面上的正确位置?我曾尝试在最后一个循环中更改内容,因为在那里我得到了“运行时错误91.Object variable或with block variable not set” 我用谷

首先,我会在该赊账的地方赊账。这是使用u/Joe的代码组合而成的,它来自Mr.Excel.com和exceltip.com

现在我已经解决了这个问题,我正在尝试创建一个搜索函数,它将在excel中搜索我的9页文档,以查找输入到搜索框中的值。然后将这些值粘贴到工作簿的第一页

我需要在代码中做哪些更改才能将其粘贴到搜索页面上的正确位置?我曾尝试在最后一个循环中更改内容,因为在那里我得到了“运行时错误91.Object variable或with block variable not set”

我用谷歌搜索了那个错误,但变量总是把我搞砸,所以这可能就是问题所在。 这是到目前为止我的代码

Sub Find_one()
'Find Function For ERF Spreadsheet'
'Type in Box, Press Button, Display the Results'
    Dim ws As Worksheet, Found As Range
    Dim myText As String, FirstAddress As String
    Dim AddressStr As String, foundNum As Integer

        myText = Range("D5")

            If myText = "" Then Exit Sub

                For Each ws In ThisWorkbook.Worksheets
                    With ws
                    'Do not search sheet1'
                        If ws.Name = "Sheet1" Then GoTo myNext

                            Set Found = .UsedRange.Find(What:=myText, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)

                        If Not Found Is Nothing Then
                            FirstAddress = Found.Address

                        Do
                            foundNum = foundNum + 1
                            AddressStr = AddressStr & .Name & " " & Found.Address & vbCrLf

                        Set Found = .UsedRange.FindNext(Found)

                        'Found.EntireRow.Copy _
                        'Destination:=Worksheets("Sheet4").Range("A65536").End(xlUp).Offset(1, 0)
                        Loop While Not Found Is Nothing And Found.Address <> FirstAddress
            End If

myNext:
                    End With

    Next ws

    If Len(AddressStr) Then

            Sheet8.Range("B18") = ws.Cells(x, 1)
            Sheet8.Range("C18") = ws.Cells(x, 2)
            Sheet8.Range("D18") = ws.Cells(x, 3)
            Sheet8.Range("E18") = ws.Cells(x, 4)
            Sheet8.Range("F18") = ws.Cells(x, 5)
            Sheet8.Range("G18") = ws.Cells(x, 6)
            Sheet8.Range("H18") = ws.Cells(x, 7)
            Sheet8.Range("I18") = ws.Cells(x, 8)
            Sheet8.Range("J18") = ws.Cells(x, 9)

    Else:
            MsgBox "Unable to find " & myText & " in this workbook.", vbExclamation
    End If

End Sub

来,试试这个。我重述了我如何解释第一部分。我不完全确定你想做什么,所以让我知道这是否有效或哪里出了问题

Sub FindOne()
    Dim k As Integer
    Dim myText As String, searchColumn As String
    Dim totalValues As Long
    Dim nextCell As Range

    k = ThisWorkbook.Worksheets.Count
    myText = Sheets(1).Range("D5").Value

    If myText = "" Then
        MsgBox "No Address Found"
        Exit Sub
    End If

    Select Case ComboBox1.Value
        Case "Equipment Number"
            searchColumn = "A"
        Case "Sequence Number"
            searchColumn = "B"
        Case "Repair Order Number(s)"
            searchColumn = "D"
        Else
            MsgBox "Please select a value for what you are searching by."
            End Sub
    End Select

    For i = 2 To k
        totalValues = Sheets(i).Range("A65536").End(xlUp).Row
        ReDim AddressArray(totalValues) As String

        For j = 0 To totalValues
            AddressArray(j) = Sheets(i).Range(searchColumn & j + 1).Value
        Next j

        For j = 0 To totalValues
            If (InStr(1, AddressArray(j), myText) > 0) Then
                Set nextCell = Sheets(1).Range("A65536").End(xlUp).Offset(1, 0)
                Range(nextCell, nextCell.Offset(0, 8)).Value = Sheets(i).Range("A" & j, "I" & j).Value
            End If
        Next j
    Next i

End Sub

另外,我也不知道代码的第二部分应该是什么,所以如果你想用
if Len(AddressStr)Then
来详细说明这一部分,我会很感激,因为这实际上甚至不能作为if…Then语句lol:)

在这里,试试这个。我重述了我如何解释第一部分。我不完全确定你想做什么,所以让我知道这是否有效或哪里出了问题

Sub FindOne()
    Dim k As Integer
    Dim myText As String, searchColumn As String
    Dim totalValues As Long
    Dim nextCell As Range

    k = ThisWorkbook.Worksheets.Count
    myText = Sheets(1).Range("D5").Value

    If myText = "" Then
        MsgBox "No Address Found"
        Exit Sub
    End If

    Select Case ComboBox1.Value
        Case "Equipment Number"
            searchColumn = "A"
        Case "Sequence Number"
            searchColumn = "B"
        Case "Repair Order Number(s)"
            searchColumn = "D"
        Else
            MsgBox "Please select a value for what you are searching by."
            End Sub
    End Select

    For i = 2 To k
        totalValues = Sheets(i).Range("A65536").End(xlUp).Row
        ReDim AddressArray(totalValues) As String

        For j = 0 To totalValues
            AddressArray(j) = Sheets(i).Range(searchColumn & j + 1).Value
        Next j

        For j = 0 To totalValues
            If (InStr(1, AddressArray(j), myText) > 0) Then
                Set nextCell = Sheets(1).Range("A65536").End(xlUp).Offset(1, 0)
                Range(nextCell, nextCell.Offset(0, 8)).Value = Sheets(i).Range("A" & j, "I" & j).Value
            End If
        Next j
    Next i

End Sub

另外,我也不知道代码的第二部分应该是什么,所以如果你想用
if Len(AddressStr)Then
来详细说明这一部分,我会很感激,因为这甚至不能作为if…Then语句lol:)

如果你试图附加图片,看起来他们没有通过。我已经修好了。我想问题是,看你的工作簿的附加图片,你的工作表名称是字母和“搜索”,但你指的是基于“工作表1”和“工作表4”的工作表。尝试用工作表(“C”)或ws.Name=“Search”等工作表的实际名称替换这些名称。或者,如果您不想使用它们的名称,可以使用工作表(1)或工作表(4)引用它们的位置。@Dexloft我添加了调试器停止位置的图片。问题在最后一个循环中。我正在寻找如何获取第一个循环收集的字符串,然后将该字符串放到另一张工作表上。如果您尝试附加图片,看起来它们没有通过。我已将其修复。我认为一个问题是,在查看工作簿的附加图片时,您的工作表名称是字母和“搜索”,但您参考的是基于“Sheet1”和“Sheet4”的图纸。尝试用工作表(“C”)或ws.Name=“Search”等工作表的实际名称替换这些名称。或者,如果您不想使用它们的名称,可以使用工作表(1)或工作表(4)引用它们的位置。@Dexloft我添加了调试器停止位置的图片。问题在最后一个循环中。我在寻找如何将第一个循环收集到的字符串,然后将该字符串放到另一张纸上。因此,它起到了一定的作用。。现在它只搜索一列,但它需要搜索A-J。我试图自己修复它,但在遵循您的代码时遇到问题。它也需要在B18而不是A2通过。再说一次,我不知道如何适应。那么现在它也只给出了一个它发现的例子。为了解释这个项目,我有一个分布在工作簿中的零件数据库。我需要创建一个搜索页面,任何人都可以进入该页面并键入他们正在查找的内容,然后所有结果都会在第一个页面上弹出。此外,为了回答如果Len(AddressStr),我将在我的原始帖子中添加该区域的原始代码。它还可以帮助您了解我希望这段代码做什么。最初,它提供消息框中的所有位置。我想把这些地点的信息放在第一页我的搜索结果区域。我们能不能更改搜索表,让某人进去说“我有一个设备号X”,然后他们搜索?像一个选择他们要搜索的值的选项吗?这比搜索工作簿中的每个单元格都要快。我想象一个组合框,每个列标题都是一个选项,旁边是一个空范围(在本例中为D5)。您也尝试过手动执行此操作吗?看起来工作表有9列数据,但A-J是10列你是这样想的吗?我不知道它到底是如何工作的,但如果你对此有信心,我真的很喜欢这个主意。而且,我猜这意味着A-I。我们不必搜索日期。所以它有点奏效。。现在它只搜索一列,但它需要搜索A-J。我试图自己修复它,但在遵循您的代码时遇到问题。它也需要在B18而不是A2通过。再说一次,我不知道如何适应。那么现在它也只给出了一个它发现的例子。为了解释这个项目,我有一个分布在工作簿中的零件数据库。我需要创建一个搜索页面,任何人都可以进入该页面并键入他们正在查找的内容,然后所有结果都会在第一个页面上弹出。此外,为了回答如果Len(AddressStr),我将在我的原始帖子中添加该区域的原始代码。它还可以帮助您了解我希望这段代码做什么。最初,它提供消息框中的所有位置。我想把这些地点的信息放在第一页我的搜索结果区域。我们能不能更改搜索表,让某人进去说“我有一个设备号X”,然后他们搜索?像一个选择他们要搜索的值的选项吗?这比搜索工作簿中的每个单元格都要快。我想象一个组合框,每个列标题作为一个选项,旁边是一个空范围(在本例中为D5)