使用VBA小程序提高资产清查效率
资产清查是一件相当烦人的工作,去年使用LayUI+PHP+MS SQL Server 2014写了一个资产清查的程序,可惜写完了,LayUI已经停止更新了,就没有再完善下去,数据也没有更新,等于就废了。
今年又要进行资产清查,启用LayUI的程序,快一年没有弄了已经有些陌生了,也来不及整改了,就使用Excel的VBA来进行匹配。
资产清查,就是资产台账与实物记录进行匹配的,这个是很烦人的工作,因为资产台账和实物台账的数据都不一定准确,要核对好不是一件轻松的事情。
要手工去核对几乎不可能,比如1500条台账数据,实物也有1500条,核对上做上标记,看似简单,如果一个人做那么特别累,时间长也来不及,多人去做,数据怎样统一和共享是问题,所以,只能由程序来完成。
实际上工作中,这样的任务需要很短的时间去完成,没有必要开发一个系统来完成,因为界面部分就会耗去大量的时间,而直接使用Excel VBA就是一个不错的选择。
根据实际需要可以随时修改、优化程序,很大程度上提高了工作效率。
核对过程:
1、整理完整的资产台账和实物台账,要求数据必须准确、格式统一;
2、使用VBA小程序去匹配,可以按指定的条件去匹配,匹配上了就给实物发放一个资产编码;
3、最严格的匹配条件过后,可能有一些是匹配不上的,需要放松条件去匹配,匹配完成后针对匹配记录发放调配单。比如:因为某某原因,某一台设备由什么变为什么,由某一地点调配至另一地点等。
4、根据调配单更新资产台账和实物台账,匹配完成。
下面是代码部分:
主要涉及VBA的结构体传参、函数和过程调用、快速查找等功能。
⑴参数传递的结构体
'获取返回的信息结构体
Type StructGetInfoSDW As String '单位名称SGGXH As String '规格型号SWZ As String '位置SSYR As String '使用人SRow As String '匹配的行号
End Type'参数传递的结构体
Type StructParaSDW As String '单位名称SPP As String '品牌SGGXH() As String '规格型号SSheetName As String 'sheet名称SSrcRow As String '源数据行SZCBM As String '资产编码
End Type
⑵定义设置和获取单元格值的方法
Public Sub SetCellValue(SCellName As String, SValue As String)Range(SCellName).SelectSelection.FormulaR1C1 = SValue
End SubPublic Function GetCellValue(SCellName As String)Range(SCellName).SelectGetCellValue = Selection.FormulaR1C1
End Function
⑶根据匹配条件进行匹配的函数
Public Function FindAtMultiCol(MyStructPara As StructPara) As StructGetInfoDim SDW As String, SPP As String, SZCBM As String, SSheetName As StringDim SGGXH() As StringDim ws As WorksheetDim LastRow As LongDim iFor As IntegerDim FoundCell_DW As Range, FoundCell_PP As Range, FoundCell_GGXH As Range, FoundCell_ZCBM As Range, FoundCell_SignRow As Range, FoundCell_WZ As Range, FoundCell_SYR As RangeDim StrDW As String, StrPP As String, StrGGXH As String, StrZCBM As StringDim DawnGetInfo As StructGetInfo '返回信息的结构体SDW = UCase(MyStructPara.SDW)SPP = UCase(MyStructPara.SPP)SGGXH = MyStructPara.SGGXHSSheetName = UCase(MyStructPara.SSheetName)SSrcRow = UCase(MyStructPara.SSrcRow)SZCBM = UCase(MyStructPara.SZCBM)Set ws = Worksheets(SSheetName)LastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row'设置范围Set FoundCell_DW = ws.Range("C2:C" & Trim(Str(LastRow))) '单位名称Set FoundCell_PP = ws.Range("D2:D" & Trim(Str(LastRow))) '品牌Set FoundCell_GGXH = ws.Range("E2:E" & Trim(Str(LastRow))) '规格型号Set FoundCell_ZCBM = ws.Range("B2:B" & Trim(Str(LastRow))) '资产编码Set FoundCell_SignRow = ws.Range("A2:A" & Trim(Str(LastRow))) '标识行Set FoundCell_WZ = ws.Range("F2:F" & Trim(Str(LastRow))) '位置Set FoundCell_SYR = ws.Range("G2:G" & Trim(Str(LastRow))) '使用人DawnGetInfo.SDW = ""DawnGetInfo.SGGXH = ""DawnGetInfo.SRow = ""DawnGetInfo.SSYR = ""DawnGetInfo.SWZ = ""FindAtMultiCol = DawnGetInfoFor iFor = 1 To LastRow - 1StrDW = UCase(Trim(FoundCell_DW(iFor).Value))StrPP = UCase(Trim(FoundCell_PP(iFor).Value))StrGGXH = UCase(Trim(FoundCell_GGXH(iFor).Value))StrZCBM = UCase(Trim(FoundCell_ZCBM(iFor).Value))'If StrDW = SDW And StrPP = SPP And InStr(StrGGXH, SGGXH(0)) > 0 And InStr(StrGGXH, SGGXH(1)) > 0 And StrSign = "" ThenIf StrPP = SPP And InStr(StrGGXH, SGGXH(0)) > 0 And InStr(StrGGXH, SGGXH(1)) > 0 And StrZCBM = "" ThenFoundCell_ZCBM(iFor).Value = SZCBMFoundCell_SignRow(iFor).Value = SSrcRowDawnGetInfo.SDW = StrDWDawnGetInfo.SGGXH = StrGGXHDawnGetInfo.SRow = Str(FoundCell_ZCBM(iFor).Row)DawnGetInfo.SSYR = FoundCell_SYR(iFor).ValueDawnGetInfo.SWZ = FoundCell_WZ(iFor).ValueFindAtMultiCol = DawnGetInfoExit ForEnd IfNext
End Function
⑷实际调用
Sub 资产核对()'Dawn 2023年4月19日Dim DawnPara As StructPara '参数传递的结构体Dim iFor As IntegerDim iFindCount As Integer '匹配的总数Dim DestRow As String '在目标表中匹配到的行号Dim allEquipment As Integer '计算机资产表的记录数Dim SrcTable As String '计算机资产表的名称Dim Src_DWMC As String '源表的单位名称Dim Src_PP As String '源表的品牌Dim Src_GGXH() As String '源表的规格型号Dim Src_ZCBM As String '源表的资产编码Dim DawnGetInfo As StructGetInfo '返回信息的结构体allEquipment = 12 '实际需要核对的记录数SrcTable = "资产表"For iFor = 1 To allEquipment'提取源表的单位名称、品牌、规格型号Sheets(SrcTable).ActivateDawnPara.SDW = Trim(UCase(GetCellValue("B" + Trim(Str(iFor))))) '单位名称DawnPara.SPP = Trim(UCase(GetCellValue("C" + Trim(Str(iFor))))) '品牌DawnPara.SSheetName = "计算机实物台账"DawnPara.SZCBM = Trim(UCase(GetCellValue("A" + Trim(Str(iFor))))) '资产编码DawnPara.SSrcRow = Str(iFor)DawnPara.SGGXH = Split(Trim(UCase(GetCellValue("D" + Trim(Str(iFor))))), " ") '规格型号If UBound(DawnPara.SGGXH) > 0 And DawnPara.SGGXH(0) <> "" ThenDawnGetInfo = FindAtMultiCol(DawnPara)If DawnGetInfo.SRow <> "" ThenCall SetCellValue("E" & Trim(Str(iFor)), DawnGetInfo.SRow)Call SetCellValue("F" & Trim(Str(iFor)), DawnGetInfo.SDW)Call SetCellValue("G" & Trim(Str(iFor)), DawnGetInfo.SGGXH)Call SetCellValue("H" & Trim(Str(iFor)), DawnGetInfo.SWZ)Call SetCellValue("I" & Trim(Str(iFor)), DawnGetInfo.SSYR)iFindCount = iFindCount + 1End IfEnd IfNextMsgBox "核对完毕!匹配数:" + Str(iFindCount)
End Sub
使用VBA程序核对起来很快,1500条数据不到1分钟就核对完成,在数据准确的情况下匹配率令人满意,关键是速度快,省去了不少的时间。
相关文章:
使用VBA小程序提高资产清查效率
资产清查是一件相当烦人的工作,去年使用LayUIPHPMS SQL Server 2014写了一个资产清查的程序,可惜写完了,LayUI已经停止更新了,就没有再完善下去,数据也没有更新,等于就废了。 今年又要进行资产清查…...
JavaSE学习进阶day07_02 异常
第三章 异常 3.1 异常概念 异常,就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指的是程序在执行过程中,出现的非正常的情况࿰…...
操作系统学习笔记
文章目录 操作系统虚拟内存锁缓存机制CPU性能指标进程、线程文件管理系统 操作系统 操作系统是控制应用程序的执行,并充当应用程序和计算机硬件之间的接口。在计算机系统中,处于最外层的是(应用软件) 。 面向用户的就是外层的&am…...
【Spring Boot】SpringBoot设计了哪些可拓展的机制?
文章目录 前言SpringBoot核心源码拓展Initializer拓展监听器ApplicationListenerBeanFactory的后置处理器 & Bean的后置处理器AOP其他的拓展点 前言 当我们引入注册中心的依赖,比如nacos的时候,当我们启动springboot,这个服务就会根据配置…...
《程序员面试金典(第6版)》面试题 10.10. 数字流的秩
题目描述 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入一个数字都会调用该方法; 实现 g…...
智能洗地机好用吗?值得入手的洗地机推荐
洗地机是一款高效的地面清洁设备,不仅可以很好清理地面不同形态的干湿垃圾,还减少了人工和水资源的浪费,是我们日常生活中必不可少的清洁工具。作为以一位评测博主,很多朋友咨询我在选购洗地机时应该注意哪些要点,有哪…...
Spring Security实战(一)——基于内存和数据库模型的认证与授权
目录 简介 一、初识Spring Security(入门案例) (1)新建project (2)选择依赖 (3)编写一个 HelloController (4)启动项目,访问localhost:8080…...
轻松掌握FFmpeg编程:从架构到实践
轻松掌握FFmpeg编程:从架构到实践 (Master FFmpeg Programming with Ease: From Architecture to Practice 引言 (Introduction)FFmpeg简介与应用场景 (Brief Introduction and Application Scenarios of FFmpeg)为什么选择FFmpeg进行音视频处理 (Why Choose FFmpeg…...
桌面应用程序开发攻略(初步了解)
什么是桌面应用程序? 桌面应用开发是指为桌面计算机或其他类似设备(如服务器)开发软件应用程序的过程。桌面应用通常是独立于浏览器运行的,并且可以在操作系统的桌面或应用程序菜单中找到。桌面应用可以使用各种编程语言开发&…...
【李老师云计算】HBase+Zookeeper部署及Maven访问(HBase集群实验)
索引 前言1. Zookeeper1.1 主机下载Zookeeper安装包1.2 主机解压Zookeeper1.3 ★解决解压后文件缺失1.4 主机配置Zookeeper文件1.4.1 配置zoo_sample.cfg文件1.4.2 配置/data/myid文件 1.5 主机传输Zookeeper文件到从机1.6 从机修改Zookeeper文件1.6.1 修改zoo.cfg文件1.6.2 修…...
第11章_常用类和基础API
第11章_常用类和基础API 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 字符串相关类之不可变字符序列:String 1.1 String的特性 java.lang.String 类代表字符串…...
Java语言数据类型与c语言数据类型的不同
目录 一、c语言数据类型 1.基本类型: 2.枚举类型: 3.空类型: 4.派生类型: 二、C语言编程需要注意的64位和32机器的区别 三、 不同之处 一、c语言数据类型 首先,先来整体介绍一下C语言的数据类型分类。 1.基…...
C# Replace()、Trim()、Split()、Substring()、IndexOf() 、 LastIndexOf()函数
目录 一、Replace() 二、Trim() 三、Split() 四、Substring() 五、IndexOf() 六、LastIndexOf() 一、Replace() 在C#中,Replace()是一个字符串方法,用于将指定的字符或子字符串替换为另一个字符或字符串。下面是一些Replace()方法的常见用法和示例…...
C++类的理解与类型名,类的成员,两种定义方式,类的访问限定符,成员访问,作用域与实例化对象
面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题 C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成 面向…...
【华为OD机试真题 C++】1051 - 处理器问题 | 机试题+算法思路+考点+代码解析
文章目录 一、题目🔸题目描述🔸输入输出🔸样例1🔸样例2 二、题目解析三、代码参考 作者:KJ.JK 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &…...
Linux 常用操作命令大全
一、基础知识 1.1 Linux系统的文件结构 /bin 二进制文件,系统常规命令 /boot 系统启动分区,系统启动时读取的文件 /dev 设备文件 /etc 大多数配置文件 /home 普通用户的家目录 /lib 32位函数库 /lib64 64位库 /media 手动临时挂载点 /mnt 手动临时挂载点…...
Git使用教程
Git 目标 Git简介【了解】 使用Git管理文件版本【重点】 远程仓库使用【掌握】 分支管理【重点】 远程仓库【掌握】 一、Git简介 1、版本控制系统简介 1.1、版本控制前生今世 版本控制系统Version Control Systems,简称 VCS是将『什么时候、谁、对什么文件…...
substrate中打印调试信息的多种方式详解
目录 1. 获取substrate-node-template代码2. 添加一个用于测试的pallet至依赖到pallets目录3. log方式来输出信息3.1 将log依赖添到cargo.toml文件3.2 log-test/src/lib.rs修改call方法 3.3 polkadot.js.调用测试函数do_something_log_test4. printable trait方式来输出信息4.1…...
Disentangled Graph Collaborative Filtering
代码地址:https://github.com/ xiangwang1223/disentangled_graph_collaborative_filtering Background: 现有模型在很大程度上以统一的方式对用户-物品关系进行建模(将模型看做黑盒,历史交互作为输入,Embedding作为输出。)&…...
Nginx快速上手
Nginx快速上手 OVERVIEW Nginx快速上手一、基本概念1.Nginx初步认识2.正向/反向代理(1)正向代理(2)反向代理 二、Nginx 安装和配置1.安装2.Nginx指令3.Nginx配置 三、Nginx的使用1.Web服务器(1)静态网页存储…...
3步快速上手AnotherRedisDesktopManager:Redis桌面管理终极指南
3步快速上手AnotherRedisDesktopManager:Redis桌面管理终极指南 【免费下载链接】AnotherRedisDesktopManager 🚀🚀🚀A faster, better and more stable Redis desktop manager [GUI client], compatible with Linux, Windows, Ma…...
终极免费离线OCR解决方案:Umi-OCR完整使用指南
终极免费离线OCR解决方案:Umi-OCR完整使用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 …...
AI智能体编排平台:从任务自动化到生态协作的架构与实践
1. 项目概述:一个面向AI编排与技能提升的生态协作平台最近在和一些做AI应用开发的朋友聊天,大家普遍有个痛点:现在AI工具和模型太多了,从大语言模型到图像生成,再到各种自动化脚本,每个都很强大,…...
OpenCore Legacy Patcher终极指南:让老Mac免费运行最新macOS的完整教程
OpenCore Legacy Patcher终极指南:让老Mac免费运行最新macOS的完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是…...
如何5分钟掌握N_m3u8DL-RE:流媒体下载终极解决方案
如何5分钟掌握N_m3u8DL-RE:流媒体下载终极解决方案 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …...
ViGEmBus终极指南:Windows游戏手柄模拟驱动的完整解决方案
ViGEmBus终极指南:Windows游戏手柄模拟驱动的完整解决方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的情况ÿ…...
Legacy-iOS-Kit完整指南:如何让老旧iPhone和iPad重获新生
Legacy-iOS-Kit完整指南:如何让老旧iPhone和iPad重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...
AI智能体任务控制中心:构建可管理复杂项目的协作框架
1. 项目概述:为智能体装上“任务控制中心” 最近在折腾AI智能体(Agent)开发的朋友,可能都遇到过这样的场景:你精心设计了一个能联网搜索、处理文档、调用API的智能体,它单次任务的表现堪称完美。但当你试图…...
开源婚礼技能库:用项目管理思维破解备婚焦虑,打造个性化高性价比婚礼
1. 项目概述:婚礼技能库的诞生与价值最近在GitHub上看到一个挺有意思的项目,叫“awesome-wedding-skills”。光看名字,你可能会觉得这又是一个普通的“awesome”系列资源列表,无非是收集一些婚礼策划、摄影、化妆的链接。但当我点…...
大语言模型长上下文建模:从注意力优化到Mamba架构的工程实践
1. 项目概述:为什么长上下文建模是LLM的“圣杯”?如果你在过去一年里深度使用过任何主流的大语言模型,无论是ChatGPT、Claude还是开源的Llama、Qwen,一个共同的痛点一定让你印象深刻:“它好像不记得我们之前聊了什么”…...
