-
matlab函数封装dll_VBA学习笔记77: VBA函数封装
2021-02-01 14:56:00学习资源:《Excel VBA从入门到进阶》第79集 by兰色幻想一、DLL文件简述1. 什么是DLL文件 DLL是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个...函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个...学习资源:《Excel VBA从入门到进阶》第79集 by兰色幻想
一、DLL文件简述
1. 什么是DLL文件
DLL是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库。
DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。
2. DLL在VBA中有什么作用?
① 把核心代码封装在DLL里,用户无法查看到DLL文件中的代码,有利于保护自已的代码。
② 可以放在DLL文件中被大家共享。
3. 怎么把VBA代码封装到DLL文件中呢?
常用的方法是使用VB6.0进行封装,所以大家要想学习本集封装,需要先安装VB6.0程序。具本的封装步骤详见下面的DLL封装示例模块。
4. 怎么在VBA中调用这些代码呢?
封装的代码是以类的形式存在,所以调用前需要先加载DLL文件,然后在模块中象调用类模块一样调用DLL中的函数,详见下面的"DLL代码的调用"模块内容。
二、DLL封装
- 在模块中编写试调正确
例:写一个求矩形面积的VBA自定义函数。
Function 面积(长 As Double, 宽 As Double) 面积 = 长 * 宽 End Function
2. 打开VB程序,在"新建工程'窗口中点"ActiveX DLL"图标。
3. 进入编辑界面后,进行如下设置
① 把编写的代码粘贴到工程代码窗口中
② 在右侧的属性窗口中修改工程名称和类模块名称为自已的名称,修改方法同VBA,在属性栏修改。
修改红色框框内的工程及模块名称 修改后的名字 ③ 添加对EXCEL和OFFICE的调用,以支持使用EXCEL对象。在菜单栏的工程-引用,找到下面两个引用:
Microsoft Office N.0 object library
Microsoft Excel N.0 object library
(N可能每个电脑的会不一样,看系统版本,我的电脑是16)
打勾的两项 ④ 文件菜单----工程另存为到指定的文件夹下
⑤ 文件菜单----生成....dll 保存在刚在的文件夹下
这里用了老师的截图 进行以上步骤后,在文件夹内会生成很多文件,这些文件两为两大类,dll是最终封装好的代码文件,其他的是为了以后编辑代码用的。如果只是生成dll,以后需要修改代码时,而你又无法打开查看编辑,怎么办呢?所以要有一个备份可以编辑代码,就是vbp文件。
需要修改时,打开vbp文件,修改之后也可以直接点击“生成…….dll”,那就直接更新了dll文件。
三、DLL调用
- 工具----引用---浏览---找到dll文件,完成后会在引用窗口中出现dll文件的名子的项目。
2. 在代码中使用
Sub test() Dim m As New 面积计算 MsgBox m.面积(10, 20) End Sub
在VBA模块中使用DLL中的函数或方法,和使用VBA中类模块一样。
3. 删除引用窗口中引用项目的方法
在开始运行中输入regedit打开注册表,在注册表中搜索“工程名称.dll",把对应的项删掉便可。要小心,不要删除错了。
四、VBA代码的转换
- 为什么要转换
在EXCEL的编程环境下可以直接用EXCEL里的对象,但封装VBA代码的环境是VB,在人家的地盘你想用EXCEL对象就得加上详细的对象了。
比如在VBA模块中我们可以用selecttion表示正在选取的单元格,用sheets(1)表示第一个工作表,而在VB中你需要先引用EXCEL对象,然后才能利用EXCEL对象的属性引用工作簿和工作表等对象。
2. 怎么转换
先引用和创建excel程序,然后利用 Excel对象.子对象.对象或方法的结构 来转换。
例:删除重复数据。
下面是在VBA中的代码写法:
Sub 删除重复数据() Dim x As Integer Dim arr, d As Object Dim el As Object Set d = CreateObject("scripting.dictionary") '创建字典对象 With ActiveSheet arr = Selection For x = 1 To UBound(arr) '通过循环把数据装入字典,字典只能获取不重复值 d(arr(x, 1)) = "" Next x Selection.Clear Selection.Cells(1, 1).Resize(d.Count) = Application.Transpose(d.Keys) End With Set el = Nothing End Sub
封装后的代码,涉及Excel中的方法和对象在VB中都要先加el。
Sub 删除重复数据2() Dim x As Integer Dim arr, d As Object Dim el As Object Set d = CreateObject("scripting.dictionary") Set el = GetObject(, "Excel.Application") '创建excel对象 With el.ActiveSheet 'excel程序的activesheet,下面遇到excel中的对象方法、函数都要加上el arr = el.Selection For x = 1 To UBound(arr) d(arr(x, 1)) = "" Next x el.Selection.Clear el.Selection.Cells(1, 1).Resize(d.Count) = el.Transpose(d.Keys) End With Set el = Nothing End Sub
封装、调用后就能在VBA中使用,使用方面和类模块一样:
Sub 引用删除dll() Dim sc As New 删除重复模块 sc.删除重复数据2 Set sc = Nothing End Sub
五、显示VB的窗体
想封装窗体代码,在VB工程资源管理器中右键插入窗体,和VBA的操作一样。
接上例,在窗体插入了一个按钮,功能是点击按钮,就能显示窗体。
Sub 显示VB6窗体() Dim vbf As VBform '声明窗体 Set vbf = New VBform Load vbf '加载窗体 vbf.Show vbModal '显示窗体 set vbf =Nothing '释放对象 End Sub
调用后在VBA中使用:
Sub 显示VB6form() Dim vbclass As New 删除重复模块 vbclass.显示VB6窗体 End Sub
一直安装不成功VB6,只好照着视频先写笔记了,没有太多插图。
-
空间圆弧插补算法,matlab实现封装函数
2020-03-10 18:05:49%圆弧插补函数,输入三个坐标,以及插补点个数,得到一组坐标 function [trajx,trajy,trajz]=Cir_interpol(N,pos1,pos2,pos3) x1=pos1(1);y1=pos1(2);z1=pos1(3); x2=pos2(1);y2=pos2(2);z2=pos2(3); x3=pos3(1);y3=...%圆弧插补函数,输入三个坐标,以及插补点个数,得到一组坐标
function [trajx,trajy,trajz]=Cir_interpol(N,pos1,pos2,pos3)
x1=pos1(1);y1=pos1(2);z1=pos1(3);
x2=pos2(1);y2=pos2(2);z2=pos2(3);
x3=pos3(1);y3=pos3(2);z3=pos3(3);
A1 = y1z2 - y1z3 -z1y2 + z1y3 + y2z3 - y3z2;
B1 = -x1z2 + x1z3 + z1x2 - z1x3 - x2z3 + x3z2;
C1 = x1y2 - x1y3 - y1x2 + y1x3 + x2y3 - x3y2;
D1 = -x1y2z3 + x1y3z2 + x2y1z3 - x3y1z2 -x2y3z1 + x3y2z1;
% fplane = @(x,y,z) A1x + B1y +C1z +D1; %三点确定的面的方程
A2 = 2(x2-x1);
B2 = 2*(y2-y1);
C2 = 2*(z2-z1);
D2 = x12+y12+z1^2 - x22-y22-z2^2;
A3 = 2*(x3-x1);
B3 = 2*(y3-y1);
C3 = 2*(z3-z1);
D3 = x12+y12+z1^2 - x32-y32-z3^2;
T = [A1 B1 C1;A2 B2 C2;A3 B3 C3];
D = [D1 D2 D3]’;
r0 = -inv(T)D ;%圆心坐标向量
R = sqrt((pos1(1)-r0(1))2+(pos1(2)-r0(2))2+(pos1(3)-r0(3))^2);%半径
%step2:得到13两点间的间距d
d13=sqrt((pos1(1)-pos3(1))2+(pos1(2)-pos3(2))2+(pos1(3)-pos3(3))^2);
o13=(pos1+pos3)/2;%得到13两点的中点,当弧角180度时,圆心在该点,以该点为衡量,判定优劣弧
%step3:得到13中点与2点间距do2
do2=sqrt((o13(1)-pos2(1))2+(o13(2)-pos2(2))2+(o13(3)-pos2(3))^2);
%ste4:判断优弧还是劣弧
if(do2<d13/2)
theta=2asin(d13/2/R);
else
theta=2pi-2asin(d13/2/R);
end
%step5:寻找该平面的法向量n,并将其单位化,将n1向量绕其旋转得到ni向量,加上圆心坐标即为圆弧插补点坐标
n1=pos3-r0’;
n2=pos1-r0’;
n=cross(n1,n2);
len=sqrt(n(1)2+n(2)2+n(3)^2);
n=n/len;%得到单位法向量
u=n(1);
v=n(2);
w=n(3);
%插值个数为30个
xx(N)=0;
yy(N)=0;
zz(N)=0;
%计算每一个插值点坐标,向量绕旋转轴n的旋转矩阵T
for c=1:N
tmp=transT((c-1)/(N-1)*theta,u,v,w)*n2’;
xx©=tmp(1);
yy©=tmp(2);
zz©=tmp(3);
end
trajx(N)=0;
trajy(N)=0;
trajz(N)=0;
for t=1:1:N;
trajx(t)=xx(t)+r0(1);
trajy(t)=yy(t)+r0(2);
trajz(t)=zz(t)+r0(3);
end
end -
MATLAB 封装发布exe
2016-12-06 11:42:15从2016a开始到现在的2017,从MATLAB中创建出一个独立的应用程序有多种方法,可以用MATLAB提供的现有函数或者现有App。 本文介绍的是利用MATLAB的Application Compiler工具创建一个独立的应用程序,以下这个例子显示...从2016a开始到现在的2017,从MATLAB中创建出一个独立的应用程序有多种方法,可以用MATLAB提供的现有函数或者现有App。
本文介绍的是利用MATLAB的Application Compiler工具创建一个独立的应用程序,以下这个例子显示了如何从MATLAB中生成独立的应用程序。编写代码文件
在MATLAB中,编写你想独立成为应用程序的MATLAB代码,保存为.m文件,此处以简单的magicsquare.m为例子,该例子是用来生成幻方。
代码如下:
function [a,b]=example(x1,x2) a=x1 b=x1+x2
在MATLAB命令提示符下,输入example(1,2),输出显示如下:
打开应用程序编译器
在命令行窗口输入deploytool,选择Application Compiler,或者直接在命令行窗口输入applicationCompiler或者deploytool。
指定要部署MATLAB应用程序的主文件
a. 在工具条的部分,点击加号按钮。
b. 在打开的文件浏览,找到并选择magicsquare.m文件。单击PACKING OPTIONS的选项部分
确认Runtime download from web复选框被选中。
当然,下一个也是可以的。
但是如果是上一个的话,要在有MATLAB环境下才能运行。MATLAB编译器项目窗口的主体部分简介
该项目窗口分为以下几个区域:
- ApplicationInformation -部署的应用程序的可编辑信息。
- AdditionalInstaller Options -为生成的安装程序默认安装路径。
- Files requiredfor your application -生成的应用程序所需的其他文件。这些文件将被包括在生成的应用程序的安装程序当中。
- Files installedwith your application -和您的应用程序一起安装的文件。这些文件包括:
产生的readme.txt
目标平台的生成的可执行文件 - AdditionalRuntime Settings-控制生成的可执行文件的特定选项。
点击 Package
正在生成应用程序包
生成的输出文件应该包含
- for_redistribution包含用于安装应用程序和MATLAB Runtime的文件。
- for_testing文件夹包含创建的所有由MCC创建的文件,像二进制文件和jar,头和源文件,使用这些文件来测试安装。
- for_redistribution_files_only文件夹包含应用程序的重新发布所需的文件。这些文件可以分发到那些有MATLAB或者有 MATLAB Runtime 的用户的电脑上。
- PackagingLog.txt是由编译器生成的日志文件。
安装MATLAB生成的独立应用程序
a. 在for_redistribution文件夹中找到MyAppInstaller_web后双击运行
b. 如果你使用代理服务器连接到互联网,输入服务器的设置。
c. 点击Connection Settings。
d. 在提供的窗口中输入代理服务器设置。
e. 点击OK。
f. 根据提示进行操作,在此过程中选择应用程序的安装路径,如果MATLABRuntime 未安装,需要选择相应的安装路径,选择License Agreement的安装路径,跟着提示一步步进行就可以将应用程序安装完成了。运行独立应用程序
打开一个终端窗口。
浏览到您安装该应用程序的文件夹。
如果接受默认设置,你可以找到在以下位置的一个文件夹,运行使用以下命令的一个应用程序。 -
matlab小波变换封装的函数,可用于图像融合增强
2009-05-03 20:05:52是我自己封装的函数,用于基于小波变换的图像融合等, mywavedec2.m用于图像分解 mywaverec2.m用于图像重构 test3.m是一个应用例子 -
handle句柄 matlab_MATLAB函数句柄
2021-01-08 05:07:56它的作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。。引入函数句柄可使函数调用变得更加灵活方便,极大地提高了函数调用的速度和效率。MATLAB中函数句柄的使用使得函数也可以成为...1、何为函数句柄?
函数句柄也是MATLAB中的一种常见的数据类型,
它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。
它的作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。。引入函数句柄可使函数调用变得更加灵活方便,极大地提高了函数调用的速度和效率。MATLAB中函数句柄的使用使得函数也可以成为输入变量,并且能很方便地调用,提高函数的可用性和独立性。
2、函数句柄的创建:
方式①:直接加@
语法:@函数名fun1 = @sin;
方式②:str2func函数
语法:str2fun(‘函数名’)
fun2 = str2func(‘cos’);
方式③:str2func函数
语法:@(参数列表)单行表达式
fun3 = @(x, y)x.^2 + y.^2;3、函数句柄的调用:
假定一个函数的调用格式为:[y1,y2,…,yn] = FunctionName(x1,x2,…,xm)
该函数通过以下方式构建函数句柄:Hfunction = @FunctionName
则通过函数句柄实现函数运算的调用格式是:直接调用 Hfunction (x1,x2,…,xm) 或者 [y1,y2,…,yn]=feval (Hfunction,x1,x2,…,xm)
例如:
句柄是matlab语言独有的参数,相当于C语言的指针。
句柄分为多种,如函数柄,对象柄,图形柄等。
图形句柄就指一个图形,在生成图形时同时得到一代号,如语句 h=plot(x,y),h 就是一个图形句柄,在后来的某一个地方就可用h代表这个图,如 set(h,…),对这个图形进行再设置。1.函数句柄
函数句柄简介:函数句柄(function handle)是MATLAB中的一类特殊的数据结构,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。
句柄创建:
(1)fun1=@sin;
(2)fun2=str2fun(‘cos’);
(3)匿名函数:fun3=@(x,y)x2+y2;
函数句柄应用:函数句柄作为函数参数;利用函数句柄绘图;利用函数句柄滤波等比如定义f(x)=x^2写
f=@(x)(x.^2)
其@(x)(x.^2)匿名函数第括号面自变量第二括号面表达式@函数指针
f=@(x)(x.2)表示匿名函数@(x)(x.2)赋值给f于f表示该函数
于f(2)=2.2=4;f(1:3)=[1:3].2=[1 4 9]等等定义匿名函数调用别匿名函数比
f1=@(x,y)(x.2+y.2)
定义函数x2+y2
f2=@(t)(f1(t,2))
定义函数t^2+4
f3=@(x)(f1(x(1),x(2)))
定义函数x(1)2+x(2)2
使用匿名函数定要注意函数本身参数形式
f1(2,3)
表示22+32
f2(3)=3
表示3^2+4
f3([1,2])
表示12+22
说白函数指针handle=@functionname
返指向制定MATLAB函数句柄
函数句柄指指向函数量句柄函数获函数句柄存图形句柄和图形之间是一种一一对应关系,简单的说图形句柄就是指向了这个图形的一个变量,通过它可以设定该图形的各种属性。
matlab其实还有很多新颖奇妙的函数用法,给我们带来了很多便利,需要的时候多去查查就好了
-
MATLAB引擎封装类
2013-05-17 12:06:03MATLAB引擎封装类将一些引擎操作函数封装到一个类中,这样使用更符合C++的特性。 -
【win10+matlab】.c文件封装函数,.m程序显示未定义函数问题
2018-07-02 21:32:30以下内容纯属我个人在这初用matlab期间遇到的一些问题,和我所用的解决方式。事情是这样的:一开始安装好了matlab,用于跑...发现没有问题以后,才发现是某个函数执行有问题,从这个函数继续往深处挖,通过多次的函... -
Visual Studio 2008(C#)调用MATLAB 2008写的函数
2012-10-21 19:18:501,首先,利用Matlab Builder NE(Matlab中与.Net接口的组件)将Matlab函数打包到一个.net类里,然后再封装到.net组件里。(一个.net组件里可以包含多个.net类)。 方法是: 在matlab命令行下运行deploytool,在图形... -
python实现类似于Matlab中的magic函数
2019-10-01 21:39:27参考这篇文章的代码封装了一个类似Matlab中的magic函数,用来生成魔方矩阵。 #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np def magic(n): row,col=0,n//2 magic=[] for i ... -
c 语言 封装dll_Matlab如何调用动态连接库DLL文件的函数?
2020-12-28 10:57:581、引言最近在开发一个项目时,已经用C语言写...为简单起见,下面以DLL文件中的一个简单的函数调用为例进行说明(当然是虚构的一个函数了,但也涉及到了常用参数类型如指针、字符串等的传递)。2、DLL文件中函数原型说... -
MATLAB 的函数句柄
2018-07-03 11:14:00MATLAB 的函数句柄: 1、何为函数句柄?... 它的作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。。引入函数句柄可使函数调用变得更加灵活方便,极大地提高了函数调用的速度... -
matlab中函数句柄
2018-03-30 08:25:511.函数句柄函数句柄简介:函数句柄(function handle)是MATLAB中的一类...作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。句柄创建:(1)fun1=@sin; (2)fun2=str2fun('cos'); (... -
MATLAB中的函数句柄及其应用
2017-04-19 10:22:311.函数句柄的创建 函数句柄(function ...作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。 MATLAB中的函数句柄在调用时和普通函数没有任何区别,下面展示几种创建函数句柄的方 -
length函数matlab_Matlab如何调用动态连接库DLL文件的函数?
2021-02-01 16:59:461、引言最近在开发一个项目时,已经用C语言写...为简单起见,下面以DLL文件中的一个简单的函数调用为例进行说明(当然是虚构的一个函数了,但也涉及到了常用参数类型如指针、字符串等的传递)。2、DLL文件中函数原型说... -
MATLAB-S函数
2019-11-02 13:10:54SIMULINK s-function的设计 Simulink为用户提供了许多内置的基本库模块,通过这些模块进行连接而构成系统的模型。对于那些经常使用的模块进行组合并封装可以构建出重复使用的新模块,但...s-function是一个动态系统... -
去除粗大误差并插值的matlab函数
2019-05-05 10:44:34一个matlab的m函数,封装了去除粗大误差并插值的功能。 -
matlab使用万能函数求解自定义无约束函数的极小值
2020-05-31 18:06:321)自定义的函数写在一个文件里面,可以是任意的函数,也允许携带参数。 2)重点是把函数封装到句柄里面,这样既可以给函数传递参数,也可以指明变量 3)坑: 最坑的地方是你自定义的函数中,作为函数变量的只能有一... -
MATLAB --函数编写与调用
2020-08-02 11:43:24之前写code都是将所有的实现放在同一个.m文件,导致程序很混乱冗长,过了几天容易忘记,不便于后期修改维护,于是开始学习将程序封装。即将程序封装成函数,再调用,就比较清晰。 1、函数编写 语法: function ... -
关于Qt调用Matlab的dll函数失败的问题
2018-09-03 21:01:31我是一个刚接触qt不久的小白,使用Qt调用Matlab的函数看了网上各种大佬的文章,基本前期都调试好了,但是最后总是一步有问题。隐式引用封装好的dll函数时Qt总会显示调用失败,这里遇到的原因是因为Matlab在调用c++... -
Matlab中的函数编译成动态链接库.dll文件
2019-01-11 10:39:07Matlab的计算功能是很强大的,但是软件经常要用到Matlab解算法,造成集成不便,一个好的解决方法是将Matlab中计算程序封装成函数,再编译成动态链接库供软件使用,方法如下: 首先将Matlab中的算法封装成函数,我在... -
matlab下 enframe分帧函数不可用
2017-05-25 15:43:30matlab下可以很方便地处理语音信号,里面封装了很多函数,例如enframe等。这就需要使用Voicebox包了。但是默认情况下是,没有自动安装这个包的。 所以当我们调用enframe这些函数时,会出现,Undefined function ... -
图像空间域处理——matlab滤波API封装重写
2020-03-28 22:59:19前两天花时间重新把matlab图像预处理的函数重新封装了一下 下面直接上代码吧! %{ matlab函数重载 nargin 为调用函数时输入的参数个数,在 MATLAB 中不需要定义时的参数与调用时的参数个数相同,即定义参数(x,y... -
matlab初学者_脚本文件调用函数文件
2019-09-29 21:14:43matlab里面有两种文件,一种是脚本文件,一种是函数文件,为了模块化程序,我们需要把专门的功能写成一个函数封装到某个函数文件里面。 那么来看如何在脚本文件里调用函数文件中的函数。 注意点: 注意相应... -
devexpress 创建窗口句柄时出错_MATLAB函数句柄
2020-11-21 06:26:44它的作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。。引入函数句柄可使函数调用变得更加灵活方便,极大地提高了函数调用的速度和效率。MATLAB中函数句柄的使用使得函数也可以成为...