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

embedded/2024/12/28 17:44:16/

在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 BooleanOn Error Resume NextSet xlApp = GetObject(, "Excel.Application")If Err ThenSet xlApp = CreateObject("Excel.Application")isNewApp = TrueEnd IfOn Error GoTo 0Dim sPath As String: sPath = ThisDocument.Path & "\"Set xlBook = xlApp.Workbooks.Open(sPath & "FileLink.xlsx")arrData = xlBook.sheets(1).usedrange.ValuexlBook.Close FalseIf isNewApp Then xlApp.Quit
End Sub
Private Sub UserForm_Initialize()Call LoadDataDim arr(), i As LongReDim arr(1 To UBound(arrData) - 1)For i = 2 To UBound(arrData)arr(i - 1) = arrData(i, 1)NextMe.CompanyName.List = arr
End Sub
Private Sub CompanyName_Change()Me.Attention.ClearDim sComName As String: sComName = Me.CompanyName.ValueDim 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) ThenFor j = 2 To UBound(arrData, 2)If Len(arrData(i, j)) = 0 ThenExit ForElser = r + 1arr(r) = arrData(i, j)End IfNextIf r > 0 ThenReDim Preserve arr(1 To r)Me.Attention.List = arrEnd IfEnd IfNext
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.ppmy.cn/embedded/149508.html

相关文章

Rocky DEM tutorial7_Conical Dryer_锥形干燥器

tutorial 7_Conical Dryer_锥形干燥器 文章目录 tutorial 7_Conical Dryer_锥形干燥器0. 目的1. 模型介绍2. 模型设置2.1设置physics2.2 导入几何2.3 设置motion2.4 Boundary边界设置2.5 设置材料2.6设置材料间相互作用2.7 创建粒子2.8 设置颗粒进口2.9 求解器设置3. 后处理Enj…

Soft Actor-Critic (SAC)算法

代码 import gym import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import numpy as np import pygame# 定义 Actor 网络 class Actor(nn.Module):def __init__(self, state_dim, action_dim, max_action):super(Actor, self…

1227java面经

1,HTTP 请求报文是如何组成的? HTTP 请求报文主要由以下几个部分组成: 请求行(Request Line) 这是请求报文的起始行,包含了请求方法、请求的 URL(统一资源定位符)以及所遵循的 HTTP 协议版本…

Python软体中简化版MapReduce任务的实现:处理大量日志数据

Python软体中简化版MapReduce任务的实现:处理大量日志数据 引言 在大数据时代,日志数据的处理与分析变得尤为重要。无论是服务器日志、应用程序日志还是用户行为日志,如何高效地处理和分析这些数据是每个开发者和数据科学家面临的挑战。MapReduce是一种编程模型,能够有效…

突发!GitLab将停止对中国区用户提供GitLab.com账号服务

突发!GitLab将停止对中国区用户提供GitLab.com账号服务 近日,被视为全球第二大开源代码托管和项目管理平台的 GitLab 宣布其将对中国区用户停止提供 GitLab.com 账号服务,建议现有用户迁移到极狐。中国 IP 地址现在访问 GitLab.com 页面会弹出下面窗口且直接转到 about.git…

.net core 的字符串处理

Python基础 引言 Python是一种广泛使用的高级编程语言,由Guido van Rossum于1991年首次发布。其设计理念强调代码的可读性和简洁性,使得Python成为初学者和专业开发者的热门选择。Python支持多种编程范式,包括面向对象、过程式和函数式编程…

探索 DC-SDK:强大的 3D 地图开发框架

在现代 Web 开发中,地理信息系统(GIS)和 3D 地图可视化变得越来越重要。dc-sdk 是一个基于 Cesium 的开源 WebGL 地图开发框架,它提供了丰富的地图可视化功能和简单易用的 API,使开发者能够轻松地在 Web 应用中集成 3D…

ID卡网络读卡器C#小程序开发

ID卡全称为身份识别卡(Identification Card),以下是对ID卡的详细介绍: 一、定义与分类 ID卡是一种不可写入的感应卡,含有固定的编号。按照规格和形状,它可以分为ID厚卡、标准卡(85.6x54x0.800…