主要内容

实现用户界面使用Visual Basic表单控件

概述

这个例子说明了建立一个全面的Excel®应用程序进行光谱分析。它需要的视觉基本知识®窗体和控件,Excel工作簿的事件。请参阅VBA文档的完整讨论这些话题。

您使用的函数创建一个Excel插件执行快速傅里叶变换(FFT)一组输入数据和绘制功率谱密度。函数返回FFT结果,一系列的频率点,和输入数据的功率谱密度。然后创建一个定制的VBA宏与表单控件指定输入和输出在当前工作表范围。调用从Excel光谱分析应用程序工具菜单。

创建插件:

  1. 从MATLAB构建一个Excel插件®代码。

  2. 实现必要的VBA代码收集输入和调度组件调用。这段代码还创建一个应用程序的菜单项在Excel中。

  3. 使用表单控件创建UI。

  4. 保存完成Excel为应用程序部署插件和包的所有必要的组件。

在创建Excel插件之前,核实你见过的所有MATLAB编译器™Excel的目标要求。有关详细信息,请参见Excel MATLAB编译器的目标要求和限制

构建Excel插件

  1. 保存的路径xlspectral文件夹与MATLAB的船只。

    拷贝文件(fullfile (matlabroot,“工具箱”,“matlabxl”,“例子”,“xlspectral”))
  2. 检查MATLAB函数computefft.mplotfft.m

    computefft.m

    plotfft.m

  3. 构建的Excel添加——在库的编译器应用程序或compiler.build.excelAddIn

    使用以下信息为您的项目:

    项目名称 傅里叶
    类名 傅里叶
    文件编制 plotfft.m

    请注意

    在本例中,应用程序使用傅里叶类没有电话computefft直接。的computefft只需要的方法plotfft方法。因此,您不需要手动添加computefft功能包,因为编译器自动包括在依赖性分析。

    例如,如果您正在使用compiler.build.excelAddIn类型:

    buildResults = compiler.build.excelAddIn (“plotfft.m”,“AddInName”,“傅里叶”,“名称”,“傅里叶”,“GenerateVisualBasicFile”,“上”,“详细”,“上”);

    组件有一个类有两个方法:

    • computefft——计算FFT和输入数据的功率谱密度,并计算一个向量的频率点基于输入的数据的长度和采样间隔。

    • plotfft——执行相同的操作computefft,也是情节的输入数据和MATLAB的功率谱密度图窗口。

实现VBA代码

建立你的组件,实现必要的VBA代码集成到Excel。

请注意

运Excel插件Fourier.xlaxlspectral文件夹已经包含下面的VBA代码。使用装插件,打开它在Excel中,添加引用傅里叶1.0类型库MWComUtilX.X类型库在Excel Visual Basic编辑器中,并保存插件。然后您可以跳过测试插件

  1. 启动Excel。

  2. 打开你的生成Excel插件。

  3. 开发人员选项卡上,单击Visual Basic,或者按ALT+打开Visual Basic编辑器。在旧版本的Excel,它可能在工具>>Visual Basic编辑器

  4. 在Visual Basic编辑器中,选择工具>引用项目引用对话框打开。

  5. 选择傅里叶1.0类型库条目对应于你的Excel插件和生成MWComUtilX.X类型库MATLAB或对应的版本MATLAB运行时。点击好吧添加引用。

创建主要的VB代码模块

插件需要初始化代码和全局变量来保存应用程序状态函数之间的调用。实现一个Visual Basic代码模块来管理这些任务。

  1. 如果没有一个模块下模块,右键单击VBAProject项目在项目窗口并选择插入>模块

    下面会出现一个新模块模块VBA项目

  2. 在模块属性页,修改的名字的财产Module1的FourierMain。您可能需要按显示属性窗口F4

  3. 输入以下代码FourierMain模块和关闭代码窗口。

    “FourierMain——主模块存储全局状态的控制和提供初始化代码的公共theFourier傅里叶。傅里叶'Global instance of Fourier object Public theFFTData As MWComplex 'Global instance of MWComplex to accept FFT Public InputData As Range 'Input data range Public Interval As Double 'Sampling interval Public Frequency As Range 'Output frequency data range Public PowerSpect As Range 'Output power spectral density range Public bPlot As Boolean 'Holds the state of plot flag Public theUtil As MWUtil 'Global instance of MWUtil object Public bInitialized As Boolean 'Module-is-initialized flag Private Sub LoadFourier() 'Initializes globals and Loads the Spectral Analysis form Dim MainForm As frmFourier On Error GoTo Handle_Error Call InitApp Set MainForm = New frmFourier Call MainForm.Show Exit Sub Handle_Error: MsgBox (Err.Description) End Sub Private Sub InitApp() 'Initializes classes and libraries. Executes once 'for a given session of Excel If bInitialized Then Exit Sub On Error GoTo Handle_Error If theUtil Is Nothing Then Set theUtil = New MWUtil Call theUtil.MWInitApplication(Application) End If If theFourier Is Nothing Then Set theFourier = New Fourier.Fourier End If If theFFTData Is Nothing Then Set theFFTData = New MWComplex End If bInitialized = True Exit Sub Handle_Error: MsgBox (Err.Description) End Sub

创建Visual Basic形式

开发一个用户界面使用Visual Basic编辑器插件。

  1. 右键单击VBAProjectVBA项目窗口并选择插入然后UserForm

    一种新形式出现形式VBA项目窗口。

  2. 在表单属性页,设置的名字财产frmFourier标题财产光谱分析

  3. 空白表格添加以下控制:

    控制光谱分析

    控制类型 控制的名字 属性 目的

    复选框

    chkPlot

    标题=情节时域信号和功率谱密度

    分析输入数据和功率谱密度。

    命令按钮

    btnOK

    标题=好吧

    默认= True

    执行功能和取消对话框。

    命令按钮

    btnCancel

    标题=取消

    取消= True

    把对话框没有执行这个函数。

    框架

    第一帧

    标题=输入数据

    集团所有的输入控件。

    框架

    Frame2

    标题=输出数据

    集团所有输出控制。

    标签

    Label1

    标题=输入数据:

    标签的RefEdit对输入数据。

    RefEdit

    refedtInput

    为输入数据选择范围。

    标签

    Label2

    标题=采样间隔:

    标签的文本框采样间隔。

    文本框 edtSample 选择采样间隔。

    标签

    Label3

    标题=频率:

    标签的RefEdit频率输出。

    RefEdit

    refedtFreq

    为频率点选择输出范围。

    标签

    Label4

    标题=FFT -实部:

    标签的RefEdit真正的FFT的一部分。

    RefEdit

    refedtReal

    为真正的选择输出范围输入数据的FFT的一部分。

    标签

    Label5

    标题=FFT -虚部:

    标签的RefEditFFT的虚部。

    RefEdit

    refedtImag

    选择输出范围输入数据的FFT的虚部。

    标签

    Label6

    标题=功率谱密度

    标签的RefEdit功率谱密度。

    RefEdit

    refedtPowSpect

    选择输出范围输入数据的功率谱密度。

    表单看起来应该类似于下图。框中的文本仅供你参考。

    光谱分析的形式

  4. 当表单和控制完成后,右键单击并选择形式视图代码

    输入以下代码的代码窗口。如果您使用不同的名称的任何控制或任何全局变量,改变这段代码,以反映这些差异。

“frmFourier事件处理程序的私人潜艇UserForm_Activate ()“UserForm激活事件处理程序。这个函数被调用之前的表现形式,并初始化所有控件的值存储在全局变量中。On Error GoTo Handle_Error如果theFourier是没有或theFFTData没有那么退出子的初始化控制如果不是InputData没有那么refedtInput当前状态。= InputData文本。地址如果edtSample结束。文本格式=(间隔)如果不是频率没有那么refedtFreq。文本=频率。地址如果如果不是IsEmpty (theFFTData.Real)如果IsObject (theFFTData.Real)和TypeOf theFFTData。真正的范围那么refedtReal。= theFFTData.Real文本。地址如果结束结束如果没有IsEmpty (theFFTData.Imag)如果IsObject (theFFTData.Imag)和TypeOf theFFTData。图像放大然后refedtImag范围。= theFFTData.Imag文本。地址结束如果如果如果不是PowerSpect并不那么refedtPowSpect结束。= PowerSpect文本。地址如果chkPlot结束。Value = bPlot Exit Sub Handle_Error: MsgBox (Err.Description) End Sub Private Sub btnCancel_Click() 'Cancel button click event handler. Exits form without computing fft 'or updating variables. Unload Me End Sub Private Sub btnOK_Click() 'OK button click event handler. Updates state of all variables from controls 'and executes the computefft or plotfft method. Dim R As Range If theFourier Is Nothing Or theFFTData Is Nothing Then GoTo Exit_Form On Error Resume Next 'Process inputs Set R = Range(refedtInput.Text) If Err <> 0 Then MsgBox ("Invalid range entered for Input Data") Exit Sub End If Set InputData = R Interval = CDbl(edtSample.Text) If Err <> 0 Or Interval <= 0 Then MsgBox ("Sampling interval must be greater than zero") Exit Sub End If 'Process Outputs Set R = Range(refedtFreq.Text) If Err = 0 Then Set Frequency = R End If Set R = Range(refedtReal.Text) If Err = 0 Then theFFTData.Real = R End If Set R = Range(refedtImag.Text) If Err = 0 Then theFFTData.Imag = R End If Set R = Range(refedtPowSpect.Text) If Err = 0 Then Set PowerSpect = R End If bPlot = chkPlot.Value 'Compute the fft and optionally plot power spectral density If bPlot Then Call theFourier.plotfft(3, theFFTData, Frequency, PowerSpect, _ InputData, Interval) Else Call theFourier.computefft(3, theFFTData, Frequency, PowerSpect, _ InputData, Interval) End If GoTo Exit_Form Handle_Error: MsgBox (Err.Description) Exit_Form: Unload Me End Sub

工作簿添加事件处理程序

  1. 右键单击ThisWorkbookVBA项目窗口并选择项目视图代码

  2. 将下面的代码放入ThisWorkbook

    私人潜艇Workbook_AddinInstall ()“外接程序安装叫AddFourierMenuItem结束时调用子私人潜艇Workbook_AddinUninstall ()“外接程序卸载叫RemoveFourierMenuItem结束时调用子私人潜艇AddFourierMenuItem()暗ToolsMenu CommandBarPopup昏暗NewMenuItem CommandBarButton“删除如果已经存在叫RemoveFourierMenuItem '找到工具菜单ToolsMenu = Application.CommandBars (1) .FindControl (ID: = 30007)如果ToolsMenu并不那么退出子的光谱分析添加菜单项设置NewMenuItem = ToolsMenu.Controls.Add NewMenuItem(类型:= msoControlButton)。标题= "光谱分析……”NewMenuItem.OnAction = "LoadFourier" End Sub Private Sub RemoveFourierMenuItem() Dim CmdBar As CommandBar Dim Ctrl As CommandBarControl On Error Resume Next 'Find tools menu and remove Spectral Analysis menu item Set CmdBar = Application.CommandBars(1) Set Ctrl = CmdBar.FindControl(ID:=30007) Call Ctrl.Controls("Spectral Analysis...").Delete End Sub

    工作簿事件添加事件处理程序的代码AddinInstallAddinUninstall安装和卸载菜单项。菜单项调用LoadFourier功能FourierMain模块。

  3. 当你完成后,单击save图标或按CTRL+年代保存插件。

测试插件

在分发插件之前,测试样品的问题。光谱分析是常用的找一个信号的频率成分埋在一个嘈杂的时域信号。创建一个数据表示的信号包含两个不同的组件和添加一个随机组件。这些数据以及输出,存储在一个Excel工作表的列,和你绘制时域信号功率谱密度。

创建测试问题

  1. 开始一个新的会话Excel空白工作簿。

  2. 开发人员选项卡上,选择Excel插件

  3. 在插件对话框中,单击浏览

  4. 浏览到Fourier.xla并点击好吧

    光谱分析插件出现在可用的插件检查框的列表。

  5. 点击好吧来加载插件。

该插件安装菜单项在Excel插件菜单。

创建数据

在调用插件之前,创建测试数据,其中包含一个信号与组件15赫兹和40 Hz。样本10秒信号的采样率为0.01。把时间点成列和信号点列B。

  1. 输入0到单元格A1在当前工作表。

  2. 新闻F5CTRL+G启动对话框。添加参考A2: A1001并单击好吧选择细胞。

  3. 输入公式= A1 + 0.01,然后按CTRL+输入将公式应用到选定的细胞。

    这个过程充满A1范围:A1001间隔清廉增加了0.01。

  4. 重复过程输入以下公式中每个单元格范围B1: B1001:

    =罪(2 *π()* 15 * A1) +罪(2π* ()* 40 * A1) + RAND ()

运行测试

使用的数据列(列B),测试插件。

  1. 显示光谱分析界面,选择插件>光谱分析

  2. 单击输入数据盒子。

  3. 选择B1: B1001从工作表,或者这个范围内输入输入数据字段。

  4. 采样间隔字段,类型0.01

  5. 选择情节时域信号和功率谱密度

  6. 输入C1: C1001频率输出,同样输入D1: D1001,E1: E1001,外国游客1:F1001FFT实部、FFT虚部和谱密度。

  7. 点击好吧运行分析。

下面的图显示了一个示例的输出。

两个信号的功率谱密度显示15赫兹和40 Hz。