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

使用vbscript.regexp实现VBA代码格式化

Office自带的VBE在编辑代码时,没有自动完成代码缩进的功能,而我们在网上找到的VBA代码,经常没有实现良好的自动缩进,复制到VBE后,可读性较差。本文介绍的宏,通过使用vbscript.regexp对象,利用正则表达式匹配VBA 代码块中开始和结束关键字,完成缩进量的计算,从而实现VBA代码的格式化。
要使用vbscript.regexp对象,需要用过VBE的“工具”菜单的“引用”命令引入Microsoft VBScript Regular Expressions 5.5这个库。引入这个库后,我们构筑三个正则表达式,分别匹配VBA代码块的开始记号、结束记号及中继记号。例如一个If-Else-End If代码块,If就是这个代码块的开始记号,遇到了开始记号,下面的行就需要增加一个缩进单位;Else就是这个代码块的中继记号,遇到中继记号,不影响后续行的缩进,但本行的缩进需要减少一个单位;End If就是这个代码块的结束记号,遇到结束记号,本行和后续各行的缩进量就要减少一个单位。此外还有一个特殊情况,就是换行连接符“_”,其后续第一行也宜增加一个缩进量,如果下一行仍然太长被分行,则再下面一行不用继续增加缩进。
宏代码如下,运行宏前需先选择复制到Word文档中的整个代码块。如果所选择的代码中包含的所有代码块结构完整,则所选择的代码块被替换为缩进规范的代码。如运行宏后发现代码缩进不正确,则代码中肯定有错误,存在结构不完整的代码块。

Sub VBA代码缩进()Dim aPara As ParagraphDim CumulativeIndent As Integer, currParaIndent%, i%Dim sTmp As String, sResult$Dim regRight As RegExp, regLeft As RegExp, regMiddle As RegExpSet regRight = CreateObject("vbscript.regexp")Set regLeft = CreateObject("vbscript.regexp")Set regMiddle = CreateObject("vbscript.regexp")'regLeft匹配需要增加后续段落左缩进的段落,即段落开头为代码块开始记号的段落regLeft.Pattern = "^(for|while|if|#if|with|do|select|((public|private)\s+)*(sub|function))\s"regLeft.IgnoreCase = True'regRight匹配需要减少本段及后续段落左缩进的段落,即段落开头为代码块结束记号的段落regRight.Pattern = "^(end\s|#end\s|loop|next|wend)"regRight.IgnoreCase = True'regMiddle匹配对前后段落缩进没有影响,但需要减少本段左缩进的段落,即段落开头为中继记号的段落regMiddle.Pattern = "^(elseif|else|#elseif|#else|case)\s"regMiddle.IgnoreCase = True'将所选择的代码原有不规范的缩进全部删除,即替换掉各段前导空格或制表符(^t),以免影响最终缩进With Selection.Find.MatchWildcards = True.Execute FindText:="^13[ ^t]{1,}", _ReplaceWith:="^p", Replace:=wdReplaceAllEnd With'记录一行代码前累计需添加的缩进量CumulativeIndent = 0For Each aPara In Selection.Paragraphs'将当前段落文本读入临时字符串,去掉前后空白sTmp = Trim(aPara.Range.Text)'计算缩进量'遇到代码块开始记号,左缩进增加1(注意本段增加的缩进后面需要减掉)If regLeft.test(sTmp) ThenCumulativeIndent = CumulativeIndent + 1'遇到代码块结束记号,左缩进减少1ElseIf regRight.test(sTmp) ThenCumulativeIndent = CumulativeIndent - 1End If'计算本段的段落缩进,如果本段为代码块开始记号或者是中间记号开头,'需要将本段前面加上的缩进量调整回去If regLeft.test(sTmp) Or regMiddle.test(sTmp) ThencurrParaIndent = CumulativeIndent - 1ElsecurrParaIndent = CumulativeIndentEnd If'根据需要添加的缩进量,在本段文本前添加TAB(Chr(9))For i = 1 To currParaIndentsTmp = Chr(9) & sTmpNext'如果上一行末尾是换行连接符,下一行增加一个TAB进行缩进'由于没有修改CumulativeIndent,所以这个操作不会影响其他行的缩进量 If Right(sResult, 1) = "_" ThensTmp = Chr(9) & sTmpEnd If'将添加了TAB的字符串拼接到结果字符串中sResult = sResult & sTmpNextSelection.Text = sResult
End Sub

相关文章:

使用vbscript.regexp实现VBA代码格式化

Office自带的VBE在编辑代码时,没有自动完成代码缩进的功能,而我们在网上找到的VBA代码,经常没有实现良好的自动缩进,复制到VBE后,可读性较差。本文介绍的宏,通过使用vbscript.regexp对象,利用正…...

选择结构习题:百分值转换成其相应的等级

Description 编一程序,输入一个百分制的成绩(整数类型),按要求输出相应的字符串信息,对应关系为:     excellent 90-100     good 80-89     middle 70-79     pass 60-69 fail 60以下或100以上 Input 输入仅一行&…...

c# 源生成器

本文概述了 .NET Compiler Platform(“Roslyn”)SDK 附带的源生成器。 通过源生成器,C# 开发人员可以在编译用户代码时检查用户代码。 生成器可以动态创建新的 C# 源文件,这些文件将添加到用户的编译中。 这样,代码可以…...

[N1CTF 2018]eating_cms1

一个cms,先打开环境试了一下弱口令,无效,再试一下万能密码,告诉我有waf,先不想怎么绕过,直接开扫(信息收集)访问register.php注册一个账号进行登录上面的链接尝试用php读文件http://…...

数据结构与算法基础(王卓)(15):KMP算法详解(含速成套路和详细思路剖析)

如果时间不够,急(忙)着应付考试没心思看,直接参考(照抄)如下套路: PART 1:关于next [ j ] PPT:P30 根据书上以及视频上给出的思路(提醒)&#x…...

【互联网架构】聊一聊所谓的“跨语言、跨平台“

文章目录序跨语言跨平台【饭后杂谈】为什么有人说Java的跨平台很鸡肋?序 很多技术都具有跨语言、跨平台的特点 比如JSON是跨语言的、Java是跨平台的、UniAPP、Electron是跨平台的 跨语言和跨平台,是比较重要的一个特性。这些特性经常能够决定开发者是否…...

1.JVM常识之 类加载器

1.jvm组成 JVM组成: 1.类加载器 2.运行时数据区 3.执行引擎 4.本地库接口 各组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码…...

一天搞定《AI工程师的PySide2 PyQt5实战开发手册》

PySide2/PySide6、PyQt5/PyQt6:都是基于Qt 的Python库,可以形象地这样说,PySide2 是Qt的 亲儿子(Qt官方开发的) , PyQt5 是Qt还没有亲儿子之前的收的 义子 (Riverbank Computing这个公司开发的,有商业版权限…...

身份推理桌游

目录 杀人游戏(天黑请闭眼) (1)入门版 (2)标准版 (3)延伸版——百度百科 (3.1)引入医生和秘密警察 (3.2)引入狙击手、森林老人和…...

[LeetCode周赛复盘] 第 99 场双周赛20230304

[LeetCode周赛复盘] 第 99 场双周赛20230304 一、本周周赛总结二、 [Easy] 2578. 最小和分割1. 题目描述2. 思路分析3. 代码实现三、[Medium] 2579. 统计染色格子数1. 题目描述2. 思路分析3. 代码实现四、[Medium] 2580. 统计将重叠区间合并成组的方案数1. 题目描述2. 思路分析…...

Parcel Bundle漏洞学习

Bundle的序列化细节看上去还是有些复杂的,在之前已经讨论过,一般我们使用Parcel的时候,都是严格的write和read相对应。一些疏漏,不对应,竟然就可以成为漏洞,https://xz.aliyun.com/t/2364 里介绍了Bundle漏…...

RTP载荷H264(实战细节)

RTP包由两部分组成,RTP头和RTP载荷: RTP头 RTP头的 结构如下: 代码结构: typedef struct RtpHdr {uint8_t cc : 4, // CSRC countx : 1, // header extendp : 1, // padding flagversion : 2; // versionuint8_t …...

软考高级信息系统项目管理师系列之四十三:信息系统安全管理

软考高级信息系统项目管理师系列之四十三:信息系统安全管理 一、信息系统安全管理内容二、信息安全策略1.信息系统安全策略的概念与内容2.信息系统安全等级保护的概念三、信息安全系统1.信息安全系统三维空间2.信息安全系统三种架构体系四、PKI公开密钥基础设施1.PKI总体架构2…...

并发编程之AtomicUnsafe

目录 原子操作 定义 术语 处理器如何实现原子操作 处理器自动保证基本内存操作的原子性 使用总线锁保证原子性 使用缓存锁保证原子性 Java当中如何实现原子操作 Atomic 定义 原子更新基本类型类 原子更新数组类 原子更新引用类型 原子更新字段类 Unsafe应用解析…...

GDB调试快速入门

什么是GDB: GDB - - - (GNU symbolic debugger)是Linux平台下最常用的一款程序调试器。 自己的Linux是否安装GDB? 一般来说,使用Ubuntu的话,系统就会自带的有GDB调试器的 命令窗口输入如下命令可以查看是否安装了gdb: gdb -v …...

Vim一次复制,多次粘贴

我们平常在使用Vim时候,通过viwy或者yy等复制操作之后,p操作粘贴的时候,只能粘贴一次,想要粘贴多次怎么办? 解决方案:在使用p的是时候使用"0p,这样就能无限制的一直粘贴了。 可是&#xff…...

如何修改Win11上的默认程序?

在Win10之前,更改特定文件格式的默认程序很简单,但在Win11发布之后,很多用户都不清楚关于Win11的修改默认程序的操作步骤,接下来我们就一起来看看吧,希望可以帮助到大家。 步骤如下: 一、如何更改Windows 1…...

安装Linux虚拟机和Hadoop平台教程汇总及踩坑总结

📍主要内容介绍安装Linux虚拟机、ubuntu系统、安装hadoop三个环节的教程链接介绍及本机与虚拟机的FTP传输教程总结(直接找hadoop安装环节的5.filezilla传输文件)新鲜出炉的踩坑总结和填坑指南安装Linux虚拟机和ubuntu系统一、材料和工具1、下…...

Shell脚本的使用和介绍

为了方便以后工作使用和复习,吐血整理记录一下学习shell脚本的笔记,看这篇文章需要对linux系统熟悉,希望对大家有所帮助! 文章目录 目录 文章目录 一、什么是shell? 为什么要学习和使用shell? 二、shell的分类...

机械学习 - 基础概念 - scikit-learn - 数据预处理 - 1

目录安装 scikit-learn术语理解1. 特征(feature )和样本( sample / demo)的区别?2. 关于模型的概念一、机械学习概念1. 监督学习总结:2. 非监督学习总结:3. 强化学习总结:三种学习的…...

5G O-RAN中AI驱动的延迟预测系统设计与优化

1. 项目背景与核心价值在5G O-RAN架构中,延迟控制一直是网络优化的核心痛点。传统电信设备厂商采用的黑盒方案,使得运营商难以针对特定场景进行精细化调优。而O-RAN的开放特性虽然带来了灵活性,但也引入了新的挑战——当CU(集中单…...

MegaParse:一站式文档解析库的设计原理与工程实践

1. 项目概述:从“MegaParse”看文档解析的“大”与“全”在信息爆炸的时代,我们每天都要处理海量的文档——PDF报告、Word合同、Excel表格、PPT演示稿,甚至网页截图和扫描件。对于开发者、数据分析师和知识管理从业者来说,如何将这…...

期刊论文发表难破局:虎贲等考 AI 以真文献 + 强实证,大幅提升录用率

在职称评审、毕业要求、科研考核的多重压力下,期刊论文早已成为硬指标。可现实是:投稿容易录用难,初审因选题、文献、实证、格式任意一点不合格就被拒稿,返修反复消耗数月。通用 AI 只能堆砌文字、编造来源,普通工具仅…...

LangGraph 持久化深度解析:Checkpoint 机制如何实现对话记忆和断点续跑

很多同学在第一次接入 LangGraph 时,会发现图默认是「无状态」的——每次 invoke,上一轮的消息就消失了。你以为加了 MessagesState 就有记忆了,结果测试一问,Agent 完全不知道「你叫什么名字」。 更惨的是什么?生产环…...

从0到1掌握Ansible:让自动化运维不再是梦想

最近在公司推进自动化运维的时候,发现很多同事对Ansible还是一知半解,要么就是简单用用,要么就是直接放弃。其实Ansible真的没那么复杂,我用了这么多年,今天就把我的实战经验分享给大家。 说实话,刚开始接…...

如何用DdddOcr在3分钟内构建离线验证码识别系统

如何用DdddOcr在3分钟内构建离线验证码识别系统 【免费下载链接】ddddocr 带带弟弟 通用验证码识别OCR pypi版 项目地址: https://gitcode.com/gh_mirrors/dd/ddddocr 在当今的自动化测试、数据采集和网络安全领域,验证码识别是绕不开的技术难题。传统的在线…...

从零到一:在STM32F103上构建FatFs文件系统并驱动W25Q64 Flash

1. 硬件准备与环境搭建 在开始构建FatFs文件系统之前,我们需要先准备好硬件环境。我手头用的是STM32F103C8T6最小系统板,搭配一块W25Q64 Flash芯片。这块Flash芯片容量为8MB,通过SPI接口通信,正好适合用来做文件存储介质。 首先得…...

条件生成对抗网络实现可控人脸老化建模

1. 项目概述:用条件生成对抗网络实现可控的人脸老化模拟“Face Aging Using Conditional GANs”——这个标题一出现,我就知道它不是那种调个预训练模型跑个demo的轻量级练习。它直指一个在计算机视觉与人机交互交叉领域里既经典又棘手的问题:…...

3分钟掌握Windows安装APK:告别复杂模拟器的终极方案

3分钟掌握Windows安装APK:告别复杂模拟器的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过这样的场景?同事发来一个实…...

SLV:用AI对话驱动Solana节点部署与运维的革命性工具

1. 项目概述:SLV,一个为Solana节点管理注入AI灵魂的工具如果你在Solana生态里跑过验证器节点或者搭建过RPC服务,那你一定对下面这套流程不陌生:找一台靠谱的服务器,手动SSH连上去,一行行敲命令安装依赖、编…...