2011-03-30 265 views
2

之间参照这里是我的问题:Excel的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,这是我的理解,总的工作表中第二行,但实际上是第一个行范围(A2:A999)。当我使用这个cellfound.Row引用r_ptypes.cells(cellfound.Row)时,它将它作为索引值并返回B3(P1-BQ900)而不是我想要的,即B2(S1 -RP003)。

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

回答

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.

+2

这只是一个丑陋的解决方法,而不是一个真正的解决方案中的行。当范围被移动时会发生什么,因为新的标题被插入到一张纸上?不要硬编码,他应该尝试计算范围开始到单元格A1的差异。 – froeschli 2011-03-30 04:23:41

+0

是的,这是我的问题..我想知道是否有办法找到偏移量,而不是绝对行号,然后再移动到操纵性解决方案... – Ashok 2011-03-30 04:25:27

+0

@froeschli,@Ashok,请参阅编辑。我太懒惰了,正如程序员所期望的那样。 XD – 2011-03-30 04:32:49

3

但丁的解决方案上面工作正常。另外,我设法使用内置的Excel函数Match来获取索引值,而不是使用范围的Find方法。在此列出以供参考。

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

使用上面,我现在可以指在r_ptypes

skuvalue = r_ptypes.Rows(indexval).Value