Excel VBA - 引用范围

时间:2011-03-30 04:04:36

标签: excel excel-vba excel-2007 vba

这是我的问题:

我有两个范围,r_products和r_ptypes来自两个不同的表,但长度相同,即

Set r_products = Worksheets("Products").Range("A2:A999")
Set r_ptypes = Worksheets("SKUs").Range("B2:B999")

我在r_products中搜索某些东西,我要在r_ptypes中的相同位置选择值。 Find方法的结果存储在cellfound中。现在,请考虑以下数据:

Sheet: Products
   A          B        C          D 
1  Product
2  S1
3  P1
4  P2
5  S2
6  S3

Sheet: SKUs
   A         B         C          D
1           SKU
2           S1-RP003
3           P1-BQ900
4           P2-HE300
5           S2-NB280
6           S3-JN934

现在,当我搜索S1时,cellfound.Row给出了值2,据我所知,这是整个工作表中的第2行,但实际上是范围中的第1行(A2:A999)。

当我使用这个cellfound.Row值来引用r_ptypes.cells(cellfound.Row)时,它将它作为一个Index值并返回B3(P1-BQ900)而不是我想要的,即B2(S1- RP003)。

我的问题是如何找到cellfound中的索引号?如果不可能,我如何使用行号从r_ptypes中提取数据?

2 个答案:

答案 0 :(得分:3)

Dante上面的解决方案运行正常。此外,我设法使用内置的Excel函数匹配而不是使用范围的查找方法来获取索引值。在此处列出以供参考。

indexval = Application.WorksheetFunction.Match("searchvalue", r_products, 0)

使用上面的内容,我现在能够引用r_ptypes中的行

skuvalue = r_ptypes.Rows(indexval).Value

答案 1 :(得分:0)

因为.Row始终返回工作表的绝对行号,而不是范围内的偏移量(即索引)。

所以,只需要减去一些工作来处理它。

对于你的例子,

r_ptypes.Cells(cellfound.Row - r_ptypes.Cells(1).Row + 1)

还是有点整洁(?)

With r_ptypes
    .Cells(cellfound.Row - .Cells(1).Row + 1)
End With

即,获取cellfound与第一个单元格和+ 1之间的行差异,因为Excel会计算1中的单元格。