精华内容
下载资源
问答
  • excel编写函数
    2022-06-18 20:03:24

    自定义函数

    假定你想要为Excel编写自定义函数,但是这个自定义函数用vba写起来比较麻烦,还有一种做法就是编写一个dll。我们准备用熟悉的C/C++来编写dll,此时我们打开VS,写下了一个自定义函数Foo,头文件定义如下

    #ifndef TEST_H
    #define TEST_H
    
    #pragma once
    
    #include <Windows.h>
    
    #ifdef TESTDLL_EXPORT
    # define TESTDLL_API __declspec(dllexport)
    #else
    # define TESTDLL_API __declspec(dllimport)
    #endif
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    	TESTDLL_API int WINAPI Foo();
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // !TEST_H
    
    

    这里大部分都是模板代码,需要注意的是Foo的声明。Foo的calling convetion是WINAPI,也就是__stdcall,vba中自定义c函数必须是WINAPI

    我们在再来看vba中如何声明该函数

    Declare Function Foo Lib "libpath" () As Long
    

    这里有3点需要注意

    1. Foo有返回值,所以声明为Function
    2. libpath为dll的路径,可以是绝对路径,也可以是相对路径,这到后面再介绍
    3. 返回值为Long不是Integer

    C/C++导出函数名称

    我们知道,c/c++编译器通常会对函数名进行修饰,其中两个原因是因为函数可以重载,还有为了区分不同的调用约定。这就导致dll中的导出函数名称和我们编写的函数名字不一样。为了能够让VBA找到导出函数,我们一般可以在声明VBA函数时指定Alias

    假设c中有如下函数

    void WINAPI Foo(int i);
    

    对于32位和64位平台,导出函数名称不一样。[1]

    32位

    导出函数名字位_Foo@4,所以函数声明为

    Declare Sub Foo Lib "libpath" Alias "_Foo@4" (ByVal i As Long)
    

    64位

    Declare PtrSafe Foo Lib "libpath" (ByVal i As Long)
    

    注意,这里我们使用了PtrSafe关键字,因为在64位Office下面,函数声明需要PtrSafe关键字。

    数据类型

    下表给出VBAC/C++中常见的数据类型的对应关系

    VBAC/C++说明
    BooleanVARIANT_BOOLvba中的True=-1,False=0
    VARIANT_BOOL实际为short的typedef
    Integershort
    Longint
    Doubledouble
    StringBSTRBSTR是OLE的数据类型,是一个带长度前缀的字符串
    VariantVARIANT
    ArraySAFEARRAY

    String

    vba中的String是Unicode string,对于常见的Win32 API,通常接受LPCWSTRLPCSTR两种字符指针,分别是utf-16和ANSI的字符串。

    String -> LPCWSTR、const wchar_t*或BSTR

    这种比较简单,我们使用StrPtr函数,直接获取String的指针即可,因为String本质上是一个BSTR

    Declare Sub Foo Lib "libpath" (ByVal str As Long)
    
    void WINAPI Foo(BSTR);
    // void WINAPI Foo(LPCWSTR);
    // void WINAPI Foo(const wchar_t*);
    

    注意,vba的文档中找不到StrPtr

    String -> LPCSTR 或 const char*

    String是utf-16编码的,如果我们声明vba中的函数接受String,且c中的函数接受const char*,那么vba就会根据系统当前的locale,将utf-16转换为ANSI字符串。显然这个过程可能是有损的,通常不建议这么做。还有中方法就是再vba中将字符串转换为utf-8数组后,再传递给c函数。

    Declare Sub Foo Lib "libpath" (ByVal str As String)
    
    void WINAPI Foo(const char*);
    // void WINAPI Foo(LPCSTR);
    

    ARRAY

    要传递vba的数组到c/c++函数中,可以使用以下两种方法[2]

    指向第一个元素的指针

    Declare Sub Foo Lib "libpath" (ByRef anArray As Long, ByVal size As Long)
    
    Dim anArray() As Long
    Foo anArray(0), UBound(anArray) + 1
    
    void WINAPI Foo(const int* anArray, int size);
    

    SAFEARRAY指针

    Delcare Sub Foo Lib "libpath" (ByRef anArray() As Long)
    
    Dim anArray() Long
    Foo anArray
    
    void WINAPI Foo(SAFEARRAY** ppArray);
    

    vba函数命名

    vba函数的名字不能同Excel中已经存在的名字相冲突,比如单元格的名字。所以F2这样的名字是非法,在调用时你会得到#REF!错误。

    Dll路径

    Declare时我们需要指定dll的路径,显然我们不想要硬编码路径。一种方法是我们修改PATH变量,加入dll所在的目录。这个动作可以在打开插件的工作簿时完成,代码如下

    Private Declare PtrSafe Function SetEnvironmentVariableW Lib "Kernel32" (ByVal name As LongPtr, ByVal value As LongPtr) As Long
    
    Private Sub Workbook_Open()
    	Dim newPath As String
    	newPath = "path to dll" & Environ("PATH")
    	' TODO Warn if changing PATH fails
    	Debug.Print SetEnvironmentVariableW(StrPtr("PATH"), StrPtr(newPath))
    End Sub
    

    References

    [1] Decorated names
    [2] How To Pass Arrays Between Visual Basic and C

    更多相关内容
  • VSTO用VISUALBASIC2010编写EXCEL自定义函数(加载项)[归纳].pdf
  • 通过自定义函数,您可以通过在JavaScript中将这些函数定义为外接程序的一部分来向Excel添加新函数Excel中的用户可以访问自定义函数,就像访问Excel中的任何本机函数一样,例如SUM() 。 该存储库包含创建新的...
  • excel自定义函数编写方法参考.pdf
  • Excel编写自定义函数的方法我们要判断一个日期是星期几,用weekday函数,但在这有个问题,有人认为星期一是一个星期的第一天,有人认为星期天是一个星期的第一天,所以,weekday里面有第二个参数,2就代表选择星期...

    Excel中的函数已经很方便,但仍然有时会觉得如果还能更方便就好了,这个时候,自定义函数就登场了。下面学习啦给大家分享Excel中编写自定义函数的方法吧。

    Excel中编写自定义函数的方法

    我们要判断一个日期是星期几,用weekday函数,但在这有个问题,有人认为星期一是一个星期的第一天,有人认为星期天是一个星期的第一天,所以,weekday里面有第二个参数,2就代表选择星期一是一个星期第一天的表达方式,所以,公式在这里就是=weekday(g6,2)。

    32b3cfe67334f837e4ad05cb8c9f3d4c.png

    下面是具体步骤,按alt+f11,进入到下面页面,在左侧,找到你要用自定义函数的表格,在“thisworkbook”上面,点右键,看图,插入模块,此处强调,自定义函数一定要放在模块里面,否则不起作用。

    c85f66984dde71fffd687a69fd19d903.png

    Function xingqi(dd)

    xingqi = WorksheetFunction.Weekday(dd, 2)

    End Function

    ----------------

    上面就是自定义函数的全部,我分着讲讲。

    先写个function,然后空格,写个函数名字,这里是xingqi,括号里面是放参数的,名字不重要,个数重要,如果你有3个参数,你可以写成(aa,bb,cc),这里只有一个,我就写了dd,写完这句,最下面的end function就自己出来了。

    需要注意的是,函数返回值一定要赋值给函数名,这里是xingqi。

    等号右边的语句就是在vba里面调用表格的函数,除了worksheetfunction,后面就是函数的写法。

    46d13f007c0854a17959bba0587116b3.png

    在表格里面,如果你要用自定义函数,直接写就可以了。

    展开全文
  • EXCEL自定义函数

    千次阅读 2021-01-04 16:54:36
    EXCEL中有不少函数,但还是不能满足要求,比如:需要把某个字符串字符倒过来的函数就没有。这里,简单说明一下如何创建自定义函数。 创建自定义函数 1、在打开的EXCEL中,按alt+F11键,打开VB 脚本开发窗口 2、...

    序言

    EXCEL中有不少函数,但还是不能满足要求,比如:需要把某个字符串字符倒过来的函数就没有。这里,简单说明一下如何创建自定义函数。

    创建自定义函数

    1、在打开的EXCEL中,按alt+F11键,打开VB 脚本开发窗口

    2、右键点选文件名,插入模块

    3、编写代码

    代码:

    Function aaa(ByVal rng As Range)
     
        aaa = VBA.StrReverse(rng.Value)
     
    End Function
    

    4、保存,关闭窗口,至此,函数已定义完成。

     

    自定义函数的使用

    假设我们要对一个字符串进行翻转,翻转后的值写入到另一列。

    1、选中将要输入的一个单元格,点fx函数按钮

    可以看到自定义函数显示出来,如果没有显示,可以点选“或选择类别”组合框查找。

    2、选中自定义函数后,点“确定”按钮。在输入值项(这里定义的值名称为Rng,实际可改成其他的易记变量)点选要翻转的单元格:

    3、然后再点确定按钮,则字符串被翻转

    C2单元格为输出值,使用公式:aaa(B2)

    B2单元格为原值

    扩展:

    这个函数也可以像其他函数一样,通过点按单元格右下角小方块,实现快速格式填充,完成一整列的操作。

    参考:

    https://support.microsoft.com/zh-cn/office/%e5%9c%a8-excel-%e4%b8%ad%e5%88%9b%e5%bb%ba%e8%87%aa%e5%ae%9a%e4%b9%89%e5%87%bd%e6%95%b0-2f06c10b-3622-40d6-a1b2-b6748ae8231f?ui=zh-cn&rs=zh-cn&ad=cn

    展开全文
  • EXCEL函数教程

    2018-03-25 11:42:30
    EXCEL函数教程,函数应用的实例,学习用的,列举了常用的函数
  • Excel自定义函数_身份证号码校验
  • excel自定义函数编写教程 零基础学习
  • 它将编写一个excel可以理解的逗号分隔文件(CSF)。 请不要给我发送带有问题的电子邮件,因为我没有时间回复。 尝试在网上找到答案。 这个功能非常简单,不需要提问。 注意:当您使用 Excel 打开 csv 文件时,您...
  • excel-自定义函数及使用

    千次阅读 2021-10-19 10:46:03
    编写自定义函数 打开一个excel文件,在某个sheet上,选择Visual Basic 然后在新打开的vb页面上新建模块。这个test.xlsx就是我之前打开的excel文件。 函数编写规则 参考Office支持 自定义函数以Function语句开始,...

    我的环境是win10 + excel 2010

    调出开发工具选项卡

    导航栏文件-选项-自定义功能区-勾选开发工具
    在这里插入图片描述

    编写自定义函数

    打开一个excel文件,在某个sheet上,选择Visual Basic
    在这里插入图片描述
    然后在新打开的vb页面上新建模块。这个test.xlsx就是我之前打开的excel文件。 在这里插入图片描述

    函数编写规则

    参考Office支持

    1. 自定义函数以Function语句开始,以End Function结束
    2. 可以指定0个或多个参数
    3. 在函数中必须包含一个语句,该语句将值分配给与函数同名的变量,这个值就能被返回了
    4. 不允许自定义函数执行除将值返回到工作表中的公式,或返回到其他 VBA 宏或函数中使用的表达式外的任何操作。 例如,自定义函数无法调整窗口大小、编辑单元格中的公式或更改单元格中文本的字体、颜色或图案选项。 如果在函数过程中包含此类的"action"代码,函数将返回#VALUE! 错误。
    5. 函数过程可以执行一个操作 (执行计算,) 显示一个对话框。 可以使用自定义函数 中的 InputBox 语句作为从执行函数的用户获取输入的方式。 可以使用 MsgBox 语句作为向用户传达信息的方式。

    举例1

    在vb窗口写这个

    Function 加1(a)
    加1 = a + 1
    MsgBox ("ok")
    End Function
    

    然后在当前sheet下直接使用
    在这里插入图片描述

    报错:无法保存函数

    在这里插入图片描述
    那么点击否,另存为启用宏的类型(xlsm)

    展开全文
  • 用VBA自编的一个用EXCEL表格做钢结构计算用的自定义函数,提高表格编制效率。 1)其中包括 7 个函数:★Gins--型钢截面参数。★GWp--型钢塑性截面参数,★GStr--钢材强度查表,★HStr--焊缝强度查表,★LStr--螺栓...
  • 详细财务人员excel运用,其中包括财务函数,查找与引用函数,工程函数,逻辑函数,日期与时间函数,数据库函数,数学与三角函数,统计函数,文本函数,信息函数适用财务处理各种问题
  • EXCEL常用查询函数?查询函数的妙用

    千次阅读 2022-01-06 16:39:28
    excel有哪些常见的查询函数?这些常见的查询函数可以怎么使用呢?小编为你编写了这篇文章,相信对你有所帮助。
  • Excel 函数公式大全

    千次阅读 2020-10-08 21:38:08
    1、函数的定义与作用 excel中内置好的一些公式,只要往公式填写参数即可,能处理、分析、汇总数据 2、最常用函数 求和:sum 平均值:average 计数:count 最大值:max 最小值:min 3、写函数公式时的注意事项...
  • 内容概要:主要讲解JS代码实现excel宏编程,从基础到进阶,另外也可作为函数查找手册用,或者帮助文档用;使用JS代码宏编程的优势就是运行快、代码简单易上手、且由于代码提示作用使得代码编写极快。提高工作效率。 ...
  • EXCEL中我们是可以设置自定义函数来进行运算数据的,方便我们下次直接使用我们已经定义好的函数,让我们开始吧: 1、首先打开EXCEL表格 2、然后点击开发工具,选择Visual Basic 3、右击VBAPorject选择插入,再...
  • excel函数的操作步骤你会吗?countifs函数怎么用?接下来小编教大家运用一下countifs函数,动起手来一起操作!
  • 0. 概述微软为 Excel 增加了使用 JavaScript 编写自定义函数的支持。1. 示例比如一个功能:两数之和加 42:我们可以使用 JavaScript 编写:...
  • 这是用于 Microsoft Excel 的 VBA 函数,用于计算患者的 APACHEII 分数。 该分数估计ICU死亡率。 您应该使用过去 24 小时内每个生理变量的最差值。 该宏是使用 Knaus WA 等人 (1985) 提供的公式编写的。 此功能可...
  • Excel的数据直接操作,每一行转成想要的sql
  • 主要介绍了php 自定义函数实现将数据 以excel 表格形式导出,结合实例形式分析了PHP操作二维数组的遍历与Excel格式输出相关实现技巧,需要的朋友可以参考下
  • 目录 本文使用的版本:Excel 2013 1、打开脚本编辑框 2、插入模块,编写代码 ... 4、给Excel单元插入自定义函数 5、给函数增加自定义说明 6、设置该自定义函数Excel上通用 附录: ...
  • excel的对数函数是什么? excel如何找到对数?首先让我们看一下什么是对数.下面的屏幕截图: 第一行代表2的指数,第二行代表2的相应幂. 如果要在第二行中计算两个数字的乘积,可以通过添加相应的数字来实现第一行中的...
  • 2选择插入模块 ...'函数功能:遍历str中每个字符,如果有任一字符存在于SearchString中,则显示exist,否则显示uexist' Function tiqu(str As String, exist As String, uexist As String, SearchString..
  • 编写时间:2022-01-27 1. 函数介绍 最近有用到计算一些投资现金与未来收益的场景,产品经理使用了excel公式,我也只能找找解决方法。 参考: 微软 PV函数 微软 FV函数 微软 PMT函数 这三个函数的计算,其实都是从...
  • EXCEL分段函数

    千次阅读 2019-10-08 05:18:43
    n<=3 s=46*n 4<n<=10 s=46*3+86*(n-3) n>=11 s=46*3+86*7+166*(n-10) =if(n<=3,46*n,if(n<=10 ,46*3+86*(n-3) ,46*3+86*7+166*(n-10))) 转载于:...
  • Excel名称中使用常量与函数.rar,在名称中不但能够使用单元格引用,还能够使用常量与函数。使用常量名称的优点是,可简化公式的编写并使工作表更加整洁,并且可随时可以修改常量名称的定义,以实现对表格中的大量...
  • Excel 自定义函数与宏在线路数据中的开发应用 林永强 中铁隧道集团有限公司第一工程处 河南新乡 453000 摘 要 本文通过介绍Excel 中的自定义函数编写宏就如何建立线路数据信息查询系统形成独特的模板 文件线路数据...
  • Excel是数据分析中最常用的工具,本篇文章通过python与excel的功能对比介绍如何使用python通过函数式编程完成excel中的数据处理及分析工作。在Python中pandas库用于数据处理 ,我们从1787页的pandas官网文档中总结出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,636
精华内容 13,854
关键字:

excel编写函数