拍案叫绝的VBA MID函数用法

文章介绍了在VBA中,Mid函数不常用的一种特性,即它可以用于赋值操作,结合StrReverse函数实现字符串内特定位置字符的互换。通过示例代码演示了如何交换字符串倒数第3个和第1个字符。同时提到,Left和Right函数不具备此功能,并展示了不同长度字符替换的效果,揭示了Mid函数在指定位置更新内容的机制。

看到这个标题,有的同学肯定认为,这篇博客就是一个“标题党”,MID函数可以说是VBA入门级别的函数,但凡学习过几天的小白用户都会用,那么各位客官不要着急,我说说你听听,如果大家都知道这个用法,只能说明我孤陋寡闻了,如果大家觉得这是个新奇用法,那就烦请大家点个赞吧!

实例需求:将一个字符串(长度不定)进行转换,规则为倒数第3个字符和倒数第1个字符互换位置,例如:字符串为12345,转换结果为12543

这个需求并不复杂,只有会使用基本的字符串处理函数,就可以实现,参考代码如下。

Sub demo1()
    txt = "12345"
    new_txt = Left(txt, Len(txt) - 3) & _
            Right(txt, 1) & _
            Mid(txt, Len(txt) - 1, 1) & _
            Mid(txt, Len(txt) - 2, 1)
    Debug.Print ("原字符串:" & txt & vbNewLine & "新字符串:" & new_txt)
End Sub

【代码解析】
第3行代码使用Left函数提取除了尾部3个字符之外的字符串。
第4行代码使用Right函数提取最后一个字符。
第5行代码使用Mid函数提取倒数第2个字符。
第6行代码使用Mid函数提取倒数第3个字符。
第7行代码输出字符串。

这个常规思路实现代码无需多讲,接下来看看神奇的代码,由ExcelHome的ggmmlol提供。

实例代码。

Sub demo2()
    txt = "12345"
    Debug.Print ("原字符串:" & txt)
    Mid(txt, Len(txt) - 2, 3) = VBA.StrReverse(Right(txt, 3))
    Debug.Print ("新字符串:" & txt)
End Sub

【代码解析】
核心代码在于第4行,玩了10+年VBA,第一次看到Mid函数可以用于等号左侧,太神奇!
第4行的整体实现思路也很赞,调用StrReverse函数,一次性实现了字符换位。

既然Mid函数可以用于等号左侧,那么它的兄弟LeftRight函数是否可以呢,试了一下都不行。

再来测试一下这个用法是否可以实现任意长度字符替换。

Sub demo3()
    txt = "12345"
    Debug.Print ("原字符串:" & txt)
    Mid(txt, Len(txt) - 3, 4) = VBA.StrReverse(Right(txt, 3))
    Debug.Print ("新字符串:" & txt)
End Sub

输出结果如下:

原字符串:12345
新字符串:15435

并没有实现尾部4个字符替换为3个字符,而只是将倒数第4个至倒数第2个字符进行了替换,这样看来似乎是按照类似指针的方式,定位到了指定的保存位置,然后更新了存储的内容。

感兴趣的同学可以参阅 微软官方文档


如果大家知道更多这种神奇的用法,请大家留言。

<think>好的,我现在需要帮助用户寻找优雅和高质量的代码示例,以及展示一些精妙的编程技巧。首先,我需要理解用户的需求。用户提到了几个引用来源,其中引用[1]强调代码的优雅和优化,引用[2]提到了代码规范插件,引用[3]关于面向对象编程,引用[4]展示了如何返回数组。用户希望看到具体的代码示例和技巧,同时要求结构清晰,逐步解决问题,并保证真实可靠。 首先,我应该考虑用户可能需要的代码示例类型,比如设计模式、函数式编程、简洁语法、算法优化等。需要覆盖不同的编程语言,比如Python、JavaScript,因为用户提供的引用中有Python和JS的例子。同时,要确保代码符合优雅和高效的标准,可能包括使用语言特性、遵循设计原则如SOLID、KISS、DRY等。 接下来,我需要从各个引用中提取有用的信息。引用[1]提到了KISS、DRY、SOLID原则,函数式编程和设计模式,这些都是优雅代码的关键点。引用[3]关于OOP,可以展示类和方法的设计。引用[4]中的JS返回数组方法,可以扩展到其他语言或更高级的技巧。 然后,我需要组织回答的结构。按照用户示例中的方式,分点介绍不同的技巧,每个技巧下给出代码示例,并解释其优雅之处。同时,生成相关问题,帮助用户进一步探索。 在代码示例方面,可能会想到Python的列表推导式、装饰器,JavaScript的高阶函数如map、filter,或者设计模式如单例模式、策略模式。同时,可以展示如何利用递归或生成器来简化代码。例如,快速排序的简洁实现,或者使用lambda表达式。 需要确保代码格式正确,行内数学公式用$...$,独立公式用$$...$$,但用户的问题中没有涉及数学公式,所以可能不需要。但要注意用户提供的示例中有代码块,需要用正确的语法高亮,比如Python和JavaScript。 另外,引用[2]提到的代码规范插件,可能在相关问题中提及,但用户当前的问题主要是寻找代码示例,所以可能在相关问题里提出如何保持代码规范的问题。 现在,需要检查是否有遗漏的要点,比如是否覆盖了用户提供的所有引用内容,是否每个示例都足够优雅和高质量,是否解释了为什么这些代码是优雅的,比如可读性、简洁性、可维护性等。 可能还需要考虑代码的效率,比如使用生成器而不是列表处理大数据,或者避免副作用等函数式编程的特点。同时,引用SOLID原则的例子,比如依赖注入或接口隔离,可能比较复杂,但可以简化说明。 最后,生成的相关问题应该围绕用户的需求,比如如何进一步优化代码,其他设计模式的应用,或者如何在实际项目中保持代码质量等。</think>### 优雅代码示例与编程技巧精解 #### 1. 函数式编程的简洁性(Python示例) ```python # 使用生成器表达式和zip处理多维数据 matrix = [[1,2,3], [4,5,6], [7,8,9]] transposed = list(zip(*matrix)) # 转置矩阵 filtered = [x for row in transposed if (x := sum(row)/len(row)) > 4] ``` **优雅点**: - 利用`zip(*matrix)`实现矩阵转置 - 使用海象运算符`:=`在列表推导式中赋值 - 函数式风格避免显式循环[^1] #### 2. 策略模式实现(JavaScript示例) ```javascript // 定义策略集合 const strategies = { add: (a, b) => a + b, multiply: (a, b) => a * b, custom: (a, b) => a ** b - 1 }; // 统一执行接口 function execute(strategy, ...args) { return strategies[strategy](...args); } console.log(execute('multiply', 3, 4)); // 输出12 ``` **优势**: - 符合开闭原则(OCP),新增策略无需修改执行逻辑[^3] - 通过对象字面量维护策略集合 - 消除复杂的条件判断语句[^1] #### 3. 装饰器实现缓存(Python高级技巧) ```python from functools import lru_cache @lru_cache(maxsize=128) def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(100)) # 秒级计算 ``` **精妙点**: - 使用标准库装饰器实现记忆化 - 将时间复杂度从$O(2^n)$降为$O(n)$ - 保持函数纯净性[^1] #### 4. 响应式数据处理(JavaScript示例) ```javascript // 使用函数组合处理数据流 const pipe = (...fns) => initVal => fns.reduce((val, fn) => fn(val), initVal); const data = [1,2,3,4,5]; const process = pipe( arr => arr.map(x => x*2), arr => arr.filter(x => x > 5), arr => arr.reduce((a,b) => a+b, 0) ); console.log(process(data)); // 输出24 ``` **亮点**: - 管道操作符实现函数组合 - 每个函数保持单一职责 - 无副作用的数据处理流程[^4] #### 5. 元编程实现DSL(Python黑魔法) ```python class Vector: def __init__(self, data): self.data = data def __matmul__(self, other): return sum(x*y for x,y in zip(self.data, other.data)) v1 = Vector([1,2,3]) v2 = Vector([4,5,6]) print(v1 @ v2) # 输出32(点积运算) ``` **创新点**: - 重载`@`运算符实现向量点积 - 创建领域特定语言(DSL) - 提升代码可读性[^1] 相关问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值