想要实现的功能:
在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不认那个,表达式写上去,正行立马就变成红的了。
不能这么反回引用范围。这样试试。
Function myRange(a, b, c)然后公式用=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"这个是没用的,测示用忘了删。
非常感谢您的回答,但是引用公式=countif(myRange(4,column(),$a$1,column()),"a")报错,用公式=countif(indirect(myRange(4,column(),$a$1,column())),"a")也 不行,求指导,谢谢。
非常感谢您的回答,用您的办法,非常轻松地把问题给搞定了,但我还是想搞明白怎样用公式=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