0

当前的问题:

我的代码曾经部分工作,直到我向 sheet2 添加额外数据,现在当它失败并调试时将我发送到:

Set partsheet = Worksheets("Sheet1").Range("A1", Range("A65536").End(xlUp)) 

此代码的实用程序:

我基本上在不同的工作表中有两列:我想比较 & 当类似的导入数据:

Sheet1 - column1 是作业编号

Sheet1 - column2 是零件号

对于相同的作业编号,您可以有多个部分 - 这意味着作业编号在第 1 列中重复出现

Sheet2 - column1 与 sheet1 的作业编号相同,但数据从不重复

Sheet2 - column2 是特定于每个作业编号的 ID 号(因此为什么在这种情况下作业编号不会重复)

因此,我想使用公共作业编号作为参考点从 Sheet2 - column2 导入数据。当我将数据导入 Sheet1 - column3 时,唯一的 ID 号将不得不重复 column1(sheet1) 中重复的作业编号 - 因此是双 for 循环。

我所说的用于部分工作的意思是:

从代码仅部分工作开始,我认为这是因为 sheet1 - column1 中的某些作业编号在 sheet2 - column1 中没有相应的值(数据不完美)。也许我需要为 if 语句的 else 部分添加代码,但我不确定是什么。

vba 代码:

Option Explicit

Sub testFil()
    Dim Jobref_in_partsheet As Range
    Dim Jobref_in_jobsheet As Range
    Dim partsheet As Range
    Dim jobsheet As Range
    Dim MyRow As Long
    Dim MyOtherRow As Long

    Set partsheet = Worksheets("Sheet1").Range("A1", Range("A65536").End(xlUp))
    Set jobsheet  = Worksheets("Sheet2").Range("A1", Range("A65536").End(xlUp))

    For Each Jobref_in_partsheet In partsheet
        For Each Jobref_in_jobsheet In jobsheet
            If Jobref_in_partsheet.Value = Jobref_in_jobsheet.Value Then
                MyRow = Jobref_in_partsheet.Row
                MyOtherRow = Jobref_in_jobsheet.Row
                Worksheets("Sheet1").Cells(MyRow, 3) = Worksheets("Sheet2").Cells(MyOtherRow, 2)
            Else
                 'Do nothing
            End If
        Next
    Next
End Sub

我真的很感激我能得到的任何帮助。

4

2 回答 2

0

答案更新:

我认为这可能更容易使用 =VLOOKUP 来完成,这只是一个普通的 excel 函数。基本上,您需要将此公式应用于 Sheet1 C 行中的每个单元格。

'Psudeo Code
=VLOOKUP([look up value] A1, [range to look in] Sheet2!A:B, [row to return] 2, [use exact match] false)

在使用 VLOOKUP 之前,您需要阅读它,但希望我的一点伪代码可以告诉您,您是否可以将它实际用于您的目的。如果您像我说的那样实现它,那么基本上它将使用第一个值(A1)来查找另一个范围(A:B 的第一列)中的某些内容。如果找到匹配项,它将返回第二列中的内容(因此是 2,因此是 A:B 的 B 列)。False 只是告诉程序你不想要相似的匹配,你只想要完全相同的匹配。

是的,VLOOKUP 令人困惑,因为所有人都出去了,但它非常有用。

这将比使用 VBA 完成相同的任务容易得多。我想这可能会或可能不会真正回答您的问题,但我想我会提出它,以防您没有考虑到它。

老了,错了,回答:

在创建范围时,我倾向于确保将所有内容都转换为字符串。例如:

Set partsheet = Worksheets("Sheet1").Range("B1:" & Range("B65536").End(xlUp).Address)

Range("B65536").End(xlUp).Address 将返回表示该列顶部地址的字符串。例如,如果顶部是“B31”,那么“B1:”和 Range(“B65536”).End(xlUp).Address 应该返回“B1:B31”作为范围。

于 2012-12-20T15:46:39.433 回答
0
Worksheets("Sheet1").Range("A1", Range("A65536").End(xlUp))

这里有一个问题:您正在尝试创建一个Range对象,该对象的第一个单元格A1属于Sheet1,最后一个单元格是A活动工作表中列中使用的最后一个单元格。您可以猜到,Sheet1活动工作表可以是不同的工作表,并且您不能创建属于多个工作表的范围。

您应该为最后一个单元格明确提供父表:

Worksheets("Sheet1").Range("A1", Worksheets("Sheet1").Range("A65536").End(xlUp))

使用.Address并不是真正的解决方法,因为它可能会导致从一张表中提取的地址用于另一张表。

于 2012-12-20T17:07:34.133 回答