目录
1目标问题:
为什么VBA里,function可以运行的代码,在EXCEL用自定义函数,会返回错误值?
2 先说结论
2.1 最容易发生的原因
2.2 其他原因梳理
3 自定义函数返回值的情况
4 这3个自定义函数都会返回错误值,因为单元格的语法是VBA的,不符合EXCEL公式语法
5 可以正常运行,且返回值正确的 自定义函数
6 如果希望自定义函数能返回多个值呢?
7 那其他改动呢? 自定义函数能做的大概就是EXCEL的函数那些吧
1问题:为什么VBA里,function可以运行的代码,在EXCEL用自定义函数会返回错误值?
例子1
- 比如下面这段代码,在VBA里运行的好好的
- 在excel里 用= 自定义函数运行,就返回错误值,而且也不允许,去改变其他单元格得值,为啥呢,比如像这种 Cells(3, 6) = "aaa" 也运行不了
2 原因:函数名问题,EXCEL和VBA语法冲突的地方等
2.1 最容易发生的原因
- VBA对函数名的限制很少
- 但是EXCEL对自定义函数的函数名有很多限制
- 可能是有一些内置函数(用户看不到的那种)或者有自定义函数命名规则但是未对用户说明
- 现在用VBA的不是主流,这些问题查找答案都不容易
- EXCEL里,测试发现,自定义函数用2个字母等很容易无法使用,报错#REF
- 所以解决办法是,用长的函数名(尽量超过2-3个字母以上),中文函数名
- 下面的代码可以测试看结果,ty7() 这种换成 testmd7()就可以 等
- ff2 修改为 testff2就可以
Function testmd6(a, b)
testmd6 = a + b
End Function
Function testmd7(a, b) '起名问题
testmd7 = testmd6(a, b)
End Function
Function ty7(a, b)
ty7 = testmd6(a, b)
End Function
Function testmd8(a, b)
Call testmd6(a, b)
End Function
Public Function ff1(a As Integer, b As Integer) As Integer
ff1 = a + b
Cells(1, 1) = "abc"
End Function
Public Function ff2(a As Integer) As Integer
ff2 = a * 10
End Function
Public Function testff1(a As Integer, b As Integer) As Integer
testff1 = a + b
End Function
Public Function testff2(a As Integer) As Integer
testff2 = a * 10
End Function
Public Function Testthisout(number As Double) As Double
Testthisout = number * number
'Testthisout = result
End Function
Function fff3()
ff3 = 100
Debug.Print 100
End Function
Sub t2()
Debug.Print ff1(1, 2)
Debug.Print ff2(9)
Debug.Print Testthisout(3)
End Sub
2.2 其他原因梳理
- EXCEL和VBA:自定义函数,其实受限制很多,远比不了VBA
- 为啥在VBA里,点运行,好好的代码,在EXCEL里用 = 自定义函数名的方法调用,发现返回格子错误值?而且很多操作也不执行?因为那是在VBA里运行,是在VBA得环境下才能运行了,现在在 excel 自定义公式,当然可能不行
- 能在VBA里执行的,不一定可以在EXCEL作为自定义函数执行,尤其是两者有些语法有差异,有的函数甚至不互通,差异更大
- 自定义函数,是运行在EXCEL环境里得,语法受到EXCEL公式得语法限制,比如像这种 Cells(3, 6) = "aaa" 是运行不了得,因为这cells() 就不是excel得内置公式啊
- 自定义函数,不要用EXCEL保留词。比如 function sum111() ,这样VBA写对了函数,在EXCEL运行还是会报错!!!
- 也就是说,自定义公式,虽然是用VBA写得,但是必须得能在EXCEL里运行,得符合EXCEL得语法,不符合得就运行不了,或者返回值报错
- 其他一些报错的可能:
- 需要写成function 不能写成过程sub
- 必须新建模块,否则,调用不到,工作表里定义的 函数
3 自定义函数返回值的情况
- 下面这些VBA函数,虽然都可以作为自定义函数在EXCEL里用,但各有不同
- 没用返回值得,EXCEL里自定义函数,EXCEL里会返回0
- 有返回值得,会返回自定义函数得返回值
Function testA1()
'如果没用返回值,就相当于testA1返回了空值 null none,EXCEL调用为自定义函数会返回0
'但是自定义函数要在EXCEL写法为 =testa1() 不能写成 =testa1否则会报错
End Function
Function testA2()
'如果没用返回值,就相当于testA2返回了空值 null none,EXCEL调用为自定义函数会返回0
b = 100
End Function
Function testA3()
'有返回值,EXCEL调用为自定义函数会testA3得返回值
testA3 = 100
End Function
自定义函数,不要用EXCEL保留词。比如 function sum111() ,这样VBA写对了函数,在EXCEL运行还是会报错!!!
- 用 sum111 怎么都不对
- 改成 test111就OK
4 这3个自定义函数都会返回错误值,因为单元格的语法是VBA的,不符合EXCEL公式语法
'下面3个报错都因为,EXCEL里指定范围得写法和VBA不同
Function testB1()
Cells(3, 6) = "testB1"
End Function
Function testB2()
Range("f5") = "testB2"
End Function
Function testB3()
[f7] = "testB3"
End Function
5 可以正常运行,且返回值正确的 自定义函数
- 难道没有用VBA写得自定义函数,直接改变EXCEL内容得方法? 有,但是不能像VBA那么方便,用rang() 或者cells() 语法随便改
- 自定义函数写在那个单元格,其实就是改变了单元格了吧!因为自定义函数也是 EXCEL函数的一种,必须符合EXCEL公式的各种限制,而EXCEL公式本身也不提供,函数返回值之外得直接修改 EXCEL单元格得办法!
'这个没问题,因为这里没涉及到excel里得操作
Function testB4()
Debug.Print "testB4"
End Function
'可以带参数,参数可以直接在EXCEL自定义函数时指定为其他单元格
Function testB5(a, b)
testB5 = (a + b)
End Function
Function testB6(a As Integer, b As Integer) As Integer
testB6 = (a + b)
End Function
6 如果希望自定义函数能返回多个值呢?
- 自定义函数 只能和 系统自带函数一样,只能改变1个单元格得内容?一般的是
- 能同时改变多个格子嘛?像VBA一样?像VBA一样肯定不行
- 普通公式肯定不行,只有数值公式可以,那也就意味着自定义函数当数组公式用就可以!
- 但是在EXCEL输入 testc1(), 要横向选2个单元格,整体输入数组公式,ctrl+ shift +enter 输入
Function testC1(a, b)
Dim c1()
ReDim c1(1 To 2)
c1(1) = a + b
c1(2) = a - b
testC1 = c1()
End Function
7 那其他改动呢? 自定义函数能做的大概就是EXCEL的函数那些吧