当前位置: 首页 > article >正文

Word窗体联动Excel实现级联组合框

在Word中的使用用户窗体(UserForm)定制界面如下图所示,其中控件如下(忽略Label控件):

  • CompanyName 组合框
  • Attention 组合框
  • CommandButton1 按钮

在这里插入图片描述

现在需要实现级联组合框效果,即用户在 CompanyName 组合框中选中如何一个Company,第二个组合框(Attention)加载相应对应的内容,其数据来自于Excel文件(FileLink.xlsx)中的数据表,如下图所示。

在这里插入图片描述

Dim arrData As Variant
Sub LoadData()
    Dim xlApp As Object, xlBook As Object, isNewApp As Boolean
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    If Err Then
        Set xlApp = CreateObject("Excel.Application")
        isNewApp = True
    End If
    On Error GoTo 0
    Dim sPath As String: sPath = ThisDocument.Path & "\"
    Set xlBook = xlApp.Workbooks.Open(sPath & "FileLink.xlsx")
    arrData = xlBook.sheets(1).usedrange.Value
    xlBook.Close False
    If isNewApp Then xlApp.Quit
End Sub
Private Sub UserForm_Initialize()
    Call LoadData
    Dim arr(), i As Long
    ReDim arr(1 To UBound(arrData) - 1)
    For i = 2 To UBound(arrData)
        arr(i - 1) = arrData(i, 1)
    Next
    Me.CompanyName.List = arr
End Sub
Private Sub CompanyName_Change()
    Me.Attention.Clear
    Dim sComName As String: sComName = Me.CompanyName.Value
    Dim i As Long, j As Long, r As Long, arr()
    ReDim arr(1 To UBound(arrData, 2) - 1)
    For i = 2 To UBound(arrData)
        If sComName = arrData(i, 1) Then
            For j = 2 To UBound(arrData, 2)
                If Len(arrData(i, j)) = 0 Then
                    Exit For
                Else
                    r = r + 1
                    arr(r) = arrData(i, j)
                End If
            Next
            If r > 0 Then
                ReDim Preserve arr(1 To r)
                Me.Attention.List = arr
            End If
        End If
    Next
End Sub
Private Sub CommandButton1_Click()
    Unload Me
End Sub

第1行代码声明模块级别变量,用于保存Excel的数据表。
如果用户每次改变CompanyName组合框,都运行代码打开Excel读取数据表,再更新Attention控件的下拉列表,创建Excel应用程序并打开Excel文件将消耗较多时间,程序可能会因此而出现卡顿。
第3~17行代码将Excel数据表加载到数组中,后续代码可用直接读取内存数组中的数据,这样可用使得程序代码的效率更高。
第5行代码忽略系统错误。
第6行代码获取Excel应用程序,如果用户没有打开Excel,那么此行代码将产生运行时错误。
第7行代码判断是否产生了运行时错误。
第8行代码创建新的Excel应用程序实例。
第9行代码设置标志变量,指明Excel应用程序为新建实例。
第12行代码获取当前文档的目录。
第13行代码打开同一目录中的Excel文件FileLink.xlsx。
第14行代码将第一个工作表中的数据表加载到数组中。
第15行代码关闭Excel文件。
对于第8行代码新建的Excel应用程序,第16行代码将关闭Excel应用程序。
第18~26行代码为UserForm的初始化事件代码。
第19行代码调用LoadData加载数据到数组中。
第21行代码为动态数组arr分配空间。
第22~24行代码将Company列表读取到数组中。
第25行代码设置CompanyName组合框的下拉列表。
第27~48行代码为CompanyName组合框的Change事件代码。
第28行代码清空Attention组合框下拉列表。
第29行代码读取CompanyName组合框的值(用户选中的Company)。
第31行代码为动态数组arr分配空间。
第32~47行代码循环遍历arrData数组。
第33行代码判断Company是否匹配。
第34~41行代码将对应于指定Company的数据行加载到数组arr中。
第35行代码判断单元格内容是否为空。
如果为空,第36行代码代码退出For循环,否则,第39行代码将单元格内容添加到数组arr中。
第43行代码重新分配数组arr的内存,去除数组末尾可能存在的空值,否则第二个组合框下拉列表中将出现空值。
第44行代码更新Attention组合框下拉列表。
第49~51行代码为CommandButton1按钮控件的Click事件代码。
第50行代码关闭窗体。


http://www.kler.cn/a/451970.html

相关文章:

  • 12.25周三F34-Day36打卡
  • stm32基础(keil创建、Proteus仿真、点亮LED灯,7段数码管)
  • 低空经济的地理信息支撑:构建安全、高效的飞行管理体系
  • 微服务篇-深入了解 XXL-JOB 分布式任务调度的具体使用(XXL-JOB 的工作流程、框架搭建)
  • 注意力机制详解
  • Vue3中路由跳转之后删除携带的query参数
  • 机试题——最大时间
  • STM32单片机芯片与内部41 DAC TIM触发双DAC DMA搬运同步输出正弦波
  • Matrix-Breakout 2 Morpheus
  • 使用vcpkg安装opencv>=4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效
  • C语言-09内存管理
  • MR-GDINO: Efficient Open-World Continual Object Detection
  • vue中做一个最多输入一位小数且可以为负数的输入框(包含最前面最后面为小数点及多个-符号与前导零校验)
  • PaginationInnerInterceptor,spring中pojo
  • WebRTC搭建与应用(五)-Coturn踩坑记
  • 游戏APP如何设计混合变现,最大化变现收益?
  • Unity 重写GridLayoutGroup使居中对齐
  • HarmonyOS NEXT 实战之元服务:静态案例效果---最近播放音乐
  • imx6ull qt多页面控制系统(正点原子imx系列驱动开发)
  • ASN.1 轻松入门2
  • HarmonyOS NEXT 实战之元服务:静态案例效果(二)
  • 131、sqlserver中使用mybatis中的Page进行分页查询时,SQL成功执行(控制台已打印),Page的Records没值bug1.代码复现:
  • NUCLEO-F446RE测试板验证DS100示波器功能
  • 【视觉惯性SLAM:编译及编译工具】
  • 2024.8 设计可解释的 ML 系统以增强对医疗保健的信任:对提出的负责任的临床医生-AI 协作框架的系统评价
  • wordpress调用指定ID分类下浏览最多的内容