目录

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的不是主流,这些问题查找答案都不容易
  1. EXCEL里,测试发现,自定义函数用2个字母等很容易无法使用,报错#REF
  2. 所以解决办法是,用长的函数名(尽量超过2-3个字母以上),中文函数名
  3. 下面的代码可以测试看结果,ty7() 这种换成 testmd7()就可以 等
  4. ff2 修改为 testff2就可以
Function testmd6(a, b)testmd6 = a + b
End FunctionFunction testmd7(a, b)      '起名问题testmd7 = testmd6(a, b)
End FunctionFunction ty7(a, b)ty7 = testmd6(a, b)
End FunctionFunction testmd8(a, b)Call testmd6(a, b)
End Function
Public Function ff1(a As Integer, b As Integer) As Integerff1 = a + bCells(1, 1) = "abc"
End FunctionPublic Function ff2(a As Integer) As Integerff2 = a * 10
End FunctionPublic Function testff1(a As Integer, b As Integer) As Integertestff1 = a + b
End FunctionPublic Function testff2(a As Integer) As Integertestff2 = a * 10
End FunctionPublic Function Testthisout(number As Double) As DoubleTestthisout = number * number'Testthisout = result
End FunctionFunction fff3()ff3 = 100Debug.Print 100End FunctionSub 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 FunctionFunction testA2()
'如果没用返回值,就相当于testA2返回了空值 null none,EXCEL调用为自定义函数会返回0b = 100
End FunctionFunction 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 FunctionFunction testB2()Range("f5") = "testB2"
End FunctionFunction 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 FunctionFunction testB6(a As Integer, b As Integer) As IntegertestB6 = (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 - btestC1 = c1()End Function

7 那其他改动呢? 自定义函数能做的大概就是EXCEL的函数那些吧

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

  1. python find函数_Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案

    本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之 ...

  2. 【原创】VBA学习笔记(7)VBA各种报错和原因备忘

    0 报错经验的查询 报错,发生在报错的那一行 报错,也经常发生在报错的前一行 所以debug 要重点看,报错行和报错行的下一行! 报错,也经常发生在报错的前一行的例子 下面这个报错,其实是fn2=di ...

  3. 最全Python函数总结和应用(超详细+建议收藏),基本所有内置函数,心得都在这了,踩的坑也在里面了,最后还有函数的魂

    希望能帮助到你 前言 基础的函数了解 惊喜类 all() 和 any() lambda函数 sorted()函数 map()函数 filter()函数 reduce()函数 eval()函数 zip函 ...

  4. excel按季度分类汇总_Excel数据透视不会,分类汇总来帮忙,强的不是一点,学会它,错不了...

    Excel数据透视不会,分类汇总来帮忙,强的不是一点,学会它,错不了 大家办公经常要用到Excel处理数据,想要对成千上万条数据做分类汇总,则需要做数据透视表和分类汇总功能:在数据量适中即小于万条时, ...

  5. PHPExcel报错:谷歌浏览器显示网页可能暂时无法连接,或者它已永久性地移动到了新网址的原因?

    最近接手新项目的时候,本地的phpexcel跑不起来,导出文件的时候报错:"谷歌浏览器显示网页可能暂时无法连接,或者它已永久性地移动到了新网址的原因?",国际惯例,碰到问题先百度, ...

  6. matlab 运行报错:变量似乎随迭代次数而改变,请预先分配内存空间以加快运算速度 解决方式

    目录 一.问题分析 报错信息翻译: 二.问题分析 1.官方文档分析 三.扩展实验 实验1 实验2 一.问题分析 首先查看报错信息: 报错信息翻译: 指示的变量或数组的大小似乎随着每次循环迭代而改变. ...

  7. python def函数报错详解_【python】详解python函数定义 def()与参数args、可变参数*args、关键参数**args使用实例...

    Python内置了很多函数,可以直接调用.Python内置的函数可以通过官方文档查看.也可以通过help()查看帮助信息.函数名是指向函数对象的引用,把函数名赋给变量,相当于给函数起了别名. 1. 定 ...

  8. node.js 函数外定义的变量 函数内赋值后为什么不能带出_(44)python少儿编程之函数(五)--- 作用域...

    函数嵌套 在一个函数内定义了另一个函数 如图,定义了一个outer函数,然后在outer函数里面又定义了一个inner()函数,此时我们只能在outer函数调用inner()函数,如果在outer函数 ...

  9. jetty服务器上运行html页面,web项目嵌入Jetty运行的两种方式(Jetty插件和自制Jetty服务器)...

    自制Jetty服务类 这种方式可以支持websocket,如果项目中需要使用到可以试试这种. 首先pom.xml引入jetty的依赖: org.eclipse.jetty.aggregate jett ...

最新文章

  1. 使用Jittor实现Conditional GAN
  2. 经典控制~系统的极点
  3. puppet基础篇(练习篇)
  4. 浪潮服务器无线网卡驱动,浪潮服务器网卡驱动安装.doc
  5. 第77课 交作业啦(递归算法)
  6. carla安装之clang版本问题
  7. 音视频开发(33)----麦克风阵列入门(一)
  8. 华为Mate X折叠屏手机即将上市:支持5G 升级后置四摄
  9. java hibernate更新_Hibernate更新某些字段的几种update方法
  10. 管理信息系统重要知识点整理
  11. 大一上计算机期末试题,大一计算机期末考试试题及答案
  12. Flink 清理 Checkpoint的原理和机制
  13. 业余草网站热门关键字
  14. 行业寒冬:java生成微信支付二维码
  15. 运维老鸟分享linux运维发展路线规划
  16. 在Python中使用StanfordOpenIE
  17. 树莓派与STM32通信编码格式
  18. 计算机网络(五)传输层详解
  19. visio 结合draw io 进行流程图绘制
  20. c + Easyx 模拟闪电效果

热门文章

  1. SQL中的ISNULL函数详解及用途
  2. HTTPS篇之SSL握手过程详解
  3. 揭秘APP刷榜黑幕 暴利催生的产业链
  4. 谁是最强的双非大学?软科50所最强“双非”大学排名来了!
  5. iOS 创建下拉列表
  6. Easy的教材【转】
  7. ekf matlab实例,EKF,UKF的matlab实现
  8. EKF之雅克比矩阵(一)
  9. 瞄准五金行业采购痛难点,智慧采购管理系统实现业务流程数据化,提高采购效率
  10. 4位数码管,带小数显示方法