2017-04-05 67 views
1

我试图在自动过滤的电子表格上运行PercentRank函数,以使其仅在可见单元上运行。我试图定义一个范围对象即:VBA函数仅在可见范围

Dim x As Range 
x = ActiveSheet.Range("K1:K6027").Rows.SpecialCells(x1CellTypeVisible) 

,然后使用该范围内的功能,即尝试:

PercentRank = WorksheetFunction.PercentRank(Range(x, *value to be ranked*)) 

但是,代码返回“编译错误:参数不可选”消息。我假设这是由于percentrank函数的语法需要两个参数来设置它运行的值的范围,但是我只是在概念上不清楚如何将其转换为代码。任何帮助将非常感激。

+2

1.您获得的错误,因为你要包括在范围内的第二个标准,')'是在错误的空间。 2.“x”已经是一个范围对象,所以你不需要Range():'WorksheetFunction.PercentRank(x,*值被排名*)'3.我不认为百分比排名可以与不相关的范围一起工作。所以你可能需要写出代码来长时间在vba中进行这项工作,你可能需要遍历整个范围。 –

+0

让vba长时间工作(如果需要)的替代方法是将脱节的范围复制到工作表中的随机列,使其连续,然后调用“PercentRank”。仍然是一个解决方法,但可能更清洁,更少的代码。 –

+0

@ScottHoltzman我不知道,这是一个简单的循环来计算低于第二个标准的数字,并将其除以该范围内的单元格数量。或者,正如我想到的那样,Loop通过这些组并使用countif()来计算并除以单元的总数。两种方法都很快。 –

回答

2

您需要Set x并使用它。此外,您需要括号围绕转变:

Set x = ActiveSheet.Range("K1:K6027").Rows.SpecialCells(xlCellTypeVisible) 
MyPercentRank = WorksheetFunction.PercentRank(x, *value to be ranked*) 
+0

我不认为PercentRank会与不相关的范围一起工作。 –

+0

@ScottCraner它的确如此。 –

+0

@peh所以它。 –