EXCEL自定义函数无法运行的原因:可以在VBA里运行的函数,在EXCEL用自定义函数为什么报错?

目录

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"   也运行不了

EXCEL自定义函数无法运行的原因:可以在VBA里运行的函数,在EXCEL用自定义函数为什么报错?_第1张图片

2 原因:函数名问题,EXCEL和VBA语法冲突的地方等

2.1 最容易发生的原因

  • VBA对函数名的限制很少
  • 但是EXCEL对自定义函数的函数名有很多限制
  • 可能是有一些内置函数(用户看不到的那种)或者有自定义函数命名规则但是未对用户说明
  • 现在用VBA的不是主流,这些问题查找答案都不容易
  1. EXCEL里,测试发现,自定义函数用2个字母等很容易无法使用,报错#REF
  2. 所以解决办法是,用长的函数名(尽量超过2-3个字母以上),中文函数名
  3. 下面的代码可以测试看结果,ty7() 这种换成 testmd7()就可以 等
  4. 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
  • 必须新建模块,否则,调用不到,工作表里定义的 函数

EXCEL自定义函数无法运行的原因:可以在VBA里运行的函数,在EXCEL用自定义函数为什么报错?_第2张图片


 

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

EXCEL自定义函数无法运行的原因:可以在VBA里运行的函数,在EXCEL用自定义函数为什么报错?_第3张图片

EXCEL自定义函数无法运行的原因:可以在VBA里运行的函数,在EXCEL用自定义函数为什么报错?_第4张图片

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

EXCEL自定义函数无法运行的原因:可以在VBA里运行的函数,在EXCEL用自定义函数为什么报错?_第5张图片

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

EXCEL自定义函数无法运行的原因:可以在VBA里运行的函数,在EXCEL用自定义函数为什么报错?_第6张图片

6  如果希望自定义函数能返回多个值呢?

  • 自定义函数 只能和 系统自带函数一样,只能改变1个单元格得内容?一般的是
  • 能同时改变多个格子嘛?像VBA一样?像VBA一样肯定不行
  • 普通公式肯定不行,只有数值公式可以,那也就意味着自定义函数当数组公式用就可以!
  • 但是在EXCEL输入 testc1(), 要横向选2个单元格,整体输入数组公式,ctrl+ shift +enter 输入

EXCEL自定义函数无法运行的原因:可以在VBA里运行的函数,在EXCEL用自定义函数为什么报错?_第7张图片

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的函数那些吧


 

你可能感兴趣的:(#,VBA实验,excel,vba)