Excel 具有可变范围的CountIfs

Excel 具有可变范围的CountIfs,excel,vba,Excel,Vba,尝试在每次迭代都会更改列的范围内执行CountIfs——使用固定列通过range(“a:a”)工作,但将其转换为数字或变量失败 我尝试了几种不同的方法来调整它——当我将它转换为一个固定的列(“a:a”)时,它可以工作,但任何其他方法都会导致它失败 有效: MRank=Application.WorksheetFunction.CountIfs(Sheets("Performance").Range("F:F"), Location, Sheets("Performance").Range("G:

尝试在每次迭代都会更改列的范围内执行
CountIfs
——使用固定列通过
range(“a:a”)
工作,但将其转换为数字或变量失败

我尝试了几种不同的方法来调整它——当我将它转换为一个固定的
列(“a:a”)
时,它可以工作,但任何其他方法都会导致它失败

有效:

MRank=Application.WorksheetFunction.CountIfs(Sheets("Performance").Range("F:F"), Location, Sheets("Performance").Range("G:G"), ">=" & MValue)
不起作用:

MRank=Application.WorksheetFunction.CountIfs(Sheets("Performance").Range("F:F"), Location, Sheets("Performance").Range(Cells(3, 7), Cells(1987, 7)), ">=" & MValue)
MRank=Application.WorksheetFunction.CountIfs(Sheets("Performance").Range("F:F"), Location, Sheets("Performance").Range(Cells(3, SelectedColumn), Cells(LastRow, SelectedColumn)), ">=" & MValue)
不起作用:

MRank=Application.WorksheetFunction.CountIfs(Sheets("Performance").Range("F:F"), Location, Sheets("Performance").Range(Cells(3, 7), Cells(1987, 7)), ">=" & MValue)
MRank=Application.WorksheetFunction.CountIfs(Sheets("Performance").Range("F:F"), Location, Sheets("Performance").Range(Cells(3, SelectedColumn), Cells(LastRow, SelectedColumn)), ">=" & MValue)

应返回同一区域中公制值等于或高于所选值的位置计数。

这将包含Danny&JVDV的评论


在您的工作公式中,使用了整列,这使得计算/填充等所需的时间更长。在可能的情况下,使用精确、统一的范围是相当理想的

窃取您的工作代码来构建:

Application.WorksheetFunction.CountIfs(Sheets("Performance").Range("F:F"), Location, Sheets("Performance").Range("G:G"), ">=" & MValue)
分解这些,我会输入一些变量来设置范围:

Application.CountIfs(LocRng, Location, MValRng, ">=" & MValue)
使用变量帮助定义范围,例如:

sr = 3 'from example, starting row
lr = 1987 'from example, last row
With ws 'Danny's suggestion to post
    set LocRng = .cells(sr,"F").Offset(lr-sr)
    set MValRng = .cells(sr,"G").Offset(lr-sr)
End with
MRank = Application.CountIfs(LocRng, Location, MValRng, ">=" & MValue)

由于您没有说明
MValue
Location
是什么,我假设您已经在其他地方定义了它们,并且它们正在按预期工作。

这将包含Danny&JVDV的评论


在您的工作公式中,使用了整列,这使得计算/填充等所需的时间更长。在可能的情况下,使用精确、统一的范围是相当理想的

窃取您的工作代码来构建:

Application.WorksheetFunction.CountIfs(Sheets("Performance").Range("F:F"), Location, Sheets("Performance").Range("G:G"), ">=" & MValue)
分解这些,我会输入一些变量来设置范围:

Application.CountIfs(LocRng, Location, MValRng, ">=" & MValue)
使用变量帮助定义范围,例如:

sr = 3 'from example, starting row
lr = 1987 'from example, last row
With ws 'Danny's suggestion to post
    set LocRng = .cells(sr,"F").Offset(lr-sr)
    set MValRng = .cells(sr,"G").Offset(lr-sr)
End with
MRank = Application.CountIfs(LocRng, Location, MValRng, ">=" & MValue)

由于您没有显示
MValue
Location
是什么,我假设您在其他地方定义了它们,并且它们按预期工作。

像“COUNTIF”参数这样的公式期望相同大小的范围工作。另一件事。我认为您应该声明您的工作表:
Dim ws as worksheet
设置变量
set ws=
ActiveWorkbook.Sheets(“Performance”)`然后在代码行中使用
ws.Range(ws.Cells(),ws.Cells())
而不是
Range(Cells(),Cells())
。否则,
Cells()
将被引用到
ActiveSheet
,而不是您选择的单元格want@DannyPapadopulos因此,如果我使用上面的代码,我还必须做一个测试(“性能”)。在每次细胞引用之前?是的,很明显。或者您可以使用工作簿.Worksheet(“wsName”)将代码放在此处,使用
.Cells
而不是
Cells
,然后以
结束。每次不引用某个对象时,默认情况下,它将被引用到活动对象,或者根本不起作用。类似“COUNTIF”参数的公式期望相同大小的范围起作用。另一件事。我认为您应该声明您的工作表:
Dim ws as worksheet
设置变量
set ws=
ActiveWorkbook.Sheets(“Performance”)`然后在代码行中使用
ws.Range(ws.Cells(),ws.Cells())
而不是
Range(Cells(),Cells())
。否则,
Cells()
将被引用到
ActiveSheet
,而不是您选择的单元格want@DannyPapadopulos因此,如果我使用上面的代码,我还必须做一个测试(“性能”)。在每次细胞引用之前?是的,很明显。或者您可以使用工作簿.Worksheet(“wsName”)
将代码放在此处,使用
.Cells
而不是
Cells
,然后以
结束。每次不引用某个对象时,默认情况下该对象将被引用到活动对象,或者根本不工作