Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Excel2007VBA查找函数。试图在两张工作表之间找到数据并将其放入第三张工作表中_Vba_Excel 2007 - Fatal编程技术网

Excel2007VBA查找函数。试图在两张工作表之间找到数据并将其放入第三张工作表中

Excel2007VBA查找函数。试图在两张工作表之间找到数据并将其放入第三张工作表中,vba,excel-2007,Vba,Excel 2007,全部, 我试图编写一个宏来搜索Sheet2中Sheet1第2列中的所有单元格,并将找到的行复制到Sheet2 到目前为止,我得到的是: Sub CopyUnique() Application.DisplayAlerts = False Set QA_14 = Sheets("QA 14Feb") Set Prod_14 = Sheets("Prod 14Feb") Set Prod_O14 = Sheets("Sheet1") Counter = 1 D

全部,

我试图编写一个宏来搜索Sheet2中Sheet1第2列中的所有单元格,并将找到的行复制到Sheet2

到目前为止,我得到的是:

Sub CopyUnique()
   Application.DisplayAlerts = False

   Set QA_14 = Sheets("QA 14Feb")
   Set Prod_14 = Sheets("Prod 14Feb")
   Set Prod_O14 = Sheets("Sheet1")
   Counter = 1

   Dim Found As Range
   Dim QARange As Range
   For Row = 1 To Prod_14.UsedRange.Rows.Count

       Set QARange = QA_14.Cells(2, 1)
       Set Found = QARange.Find(What:=Prod_14.Cells(Row, 2).Text, After:=QA_14.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

       If Not Found Is Nothing Then
            Prod_14.UsedRange.Range(Cells(Row, 1), Cells(Row, Prod_14.UsedRange.Columns.Count)).Copy Prod_O14.Range("A" & LTrim(Str(Counter)))

            Counter = Counter + 1
       End If

    Next

End Sub
问题发生在具有查找功能的线路上。只是给出了一个类型不匹配错误。我尝试过将所有变量拆分成单独的行,但它们不是问题的一部分

有什么想法吗


谢谢

我认为这个问题的根源在于xlText不是lookin的有效选项。我相信您需要xlvalue或xlFormulas

还有两件事要考虑。Sheet1不是一个好的变量名。每个工作表都有一个CodeName属性,该属性在工作表的选项卡名称更改时不会更改。默认情况下,这些代码名是Sheet1、Sheet2等。这可能不会导致问题,但最好避免

在“下一步”中,按Sheet1.UsedRange.Count递增行数,这是所用范围内单元格数的计数。你可能应该使用

For Row = 1 to Sheet1.UsedRange.Rows.Count
编辑

这是另一个程序,我认为它符合你的要求

Sub CopyUnique()

    Dim shQa14 As Worksheet
    Dim shProd14 As Worksheet
    Dim shProdO14 As Worksheet
    Dim rCell As Range
    Dim rFound As Range

    Set shQa14 = Sheets("QA 14Feb")
    Set shProd14 = Sheets("Prod 14Feb")
    Set shProdO14 = Sheets("Sheet1")

    For Each rCell In Intersect(shProd14.UsedRange, shProd14.Columns(2)).Cells
        If Not IsEmpty(rCell.Value) Then
            Set rFound = shQa14.Cells.Find(rCell.Value, , xlValues, xlPart)

            If Not rFound Is Nothing Then
                Intersect(rFound.EntireRow, rFound.Parent.UsedRange).Copy _
                    shProdO14.Cells(shProdO14.Rows.Count, 1).End(xlUp).Offset(1, 0)
            End If
        End If
    Next rCell

End Sub
我没有指定太多的Find参数,只指定我关心的参数。

您使用的after参数无效。删除它,您将不再收到类型不匹配错误。第一个问题得到了回答,现在我们有了其他。。。我正在检查如何正确设置此值

我相信,如果你能更好地解释你想要实现的目标,我们就可以改进我们的帮助和建议

Rgds

编辑:

似乎After需要在被搜索的范围内(我相信这不是你想要的)

这段代码不会引起错误,尽管我相信它也不会做您想要的事情。如果你能给我们一个更好的例子,说明你需要什么,我们也许能进一步帮助你

提示#1:下次提交代码时,我会要求您在代码中包含所使用变量的声明(您使用的是Option Explicit,对吧?)。特别是在类型不匹配错误中,变量类型可能会导致问题

提示#2:我建议看一看匈牙利符号

Sub test()

    Dim qa_14 As Worksheet
    Dim prod_14 As Worksheet
    Dim prod_o14 As Worksheet
    Dim iCounter As Integer
    Dim iRow As Integer
    Dim rngAfter As Excel.Range
    Dim rngWhat As Excel.Range

    Dim Found As Range
    Dim QARange As Range

    Set qa_14 = Sheets("QA 14Feb")
    Set prod_14 = Sheets("Prod 14Feb")
    Set prod_o14 = Sheets("Sheet1")
    iCounter = 1

    For iRow = 1 To prod_14.UsedRange.Rows.Count

        Set QARange = qa_14.Cells(2, 1)

        Set rngAfter = QARange.Cells(1, 1)

        Set Found = QARange.Find(What:=prod_14.Cells(iRow, 2).Text, After:=rngAfter, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

        If Not Found Is Nothing Then

            prod_14.UsedRange.Range(Cells(iRow, 1), Cells(iRow, prod_14.UsedRange.Columns.Count)).Copy prod_o14.Range("A" & LTrim(Str(iCounter)))

            iCounter = iCounter + 1

       End If

    Next

End Sub

做了所有这些改变。没用。更新了原始问题中的代码。