Excel中引用变量的Range区域

想要实现的功能:

在excel单元各种输入公式=countif(myRange(4,column(),$a$1,column()),"X"),来统计当前所在列的第4行到指定行(单元格$a$1中为具体的行数)之间的单元格区域内单元格值为X的单元格的个数。

现有的做法:

自定义一个myRange函数,代码如下:
Public Function myRange(a, b, c, d)
Dim i, m, n, k
a = i
b = m
c = n
d = k
myRange = Range(Cells(i, m), Cells(n, k))
End Function
但公式得到的结果为#value!

请问为什么?我的错误在哪里?怎么样可以很好地实现该功能呢?

求高手解答!!!在线等!谢谢!

    因为要用VB做循环,所以Range的边界必须要用变量。

    程序大概是这样的,一堆xls文件,每个有n个sheets, 每个sheet的表头基本上是一样的,但记录的数据有多有少,开始和结束的行列数都不同。

    所以要用VB做循环,依次把文件打开,定位到每个sheet中数据区的第一行一列和最后一行一列,读出iRow和iColumn,调用excel的Average函数把平均值算出来。

    现在其他都弄好了,就是调用函数中的单元格区域/范围的引用总是搞不定,VB不认那个,表达式写上去,正行立马就变成红的了。 
      

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-09-16
range()里面有两种都可以
1.
一个表示单元格(区域)地址的字符串,比如"a1:b10",只要计算结果满足这种字符串,就可以
range("a2:"
&
"c"
&
20),其中除了运算符(&)的任何一部分都可以是变量
2.
range(cells1,cells2),表示左上角为单元格cells1到右下角为cells2的一个矩形区域。变量可以在cells(row,column)中
第2个回答  2013-11-17

不能这么反回引用范围。这样试试。

Function myRange(a, b, c)
d = Split(Cells(1, c).Address, "$")(1)
'd = "F"
myRange = d & a & ":" & d & b
End Function

然后公式用=countif(INDIRECT(myRange(4,$a$1,column()),"X")

column()重复,删掉一个

追问

非常感谢您的回答,通过您的办法,实现了我想要的功能,您能帮我解释一下
d = Split(Cells(1, c).Address, "$")(1)
'd = "F"
的意思吗?
d=...意思是要提取出列的字母,但(1)是什么意思呢?
‘d="F"就完全搞不明白了。

追答

d = Split(Cells(1, c).Address, "$")(1)
(1)第1个字母,‘d="F"这个是没用的,测示用忘了删。

第3个回答  2013-11-17
你赋值写反了,改一下,我给你简化一下吧
Public Function myRange(a, b, c, d)
myRange = Range(Cells(a, b), Cells(c, d))
End Function
你再试试追问

非常感谢您的回答,但是引用公式=countif(myRange(4,column(),$a$1,column()),"a")报错,用公式=countif(indirect(myRange(4,column(),$a$1,column())),"a")也 不行,求指导,谢谢。

第4个回答  推荐于2018-03-10
很多问题:
1,统计个数,那么countif在哪儿呢?
2,统计值为x的单元格,那么x在哪儿呢?
3,为什么要赋值呢?
4,为什么要这么多参数?列是所在列,行信息也有,除了x,其实根本不需要其他参数。

Function myRange(a)
myRange = Application.WorksheetFunction.CountIf(Range(Cells(4, ActiveCell.Column), Cells([a1], ActiveCell.Row)), a)
End Function追问

非常感谢您的回答,用您的办法,非常轻松地把问题给搞定了,但我还是想搞明白怎样用公式=countif(myRange(...),"a"),因为可能还会用到公式=sumif(myRange(...),"a")或求平均值等,这样子只需要定义一个函数myRange就可以通用了。求指导,谢谢!

追答

要达到你的功能,不要自定义函数。可以写:
=COUNTIF(INDIRECT(ADDRESS(4,COLUMN(),4,2)&":"&ADDRESS($A$1,COLUMN(),4,2,)),"X")
(自定义函数会大大减慢运算速度)

关于myrange(),正如楼下所言,你赋值写反了。
Function myRange(a, b, c, d)
Dim i, m, n, k
i = a
m = b
n = c
k = d
myRange = Range(Cells(i, m), Cells(n, k))
End Function

本回答被提问者和网友采纳
相似回答