VBA的隐藏功能
VBA隐藏功能的出现原因是大多数人都忽略了Mid()语句的一个重要特性。这个特性是指当Mid()出现在赋值语句的左边时,而不是出现在右边或表达式中的Mid()函数时。规则是,如果目标字符串不是字符串文字,并且这是对目标字符串的唯一引用,并且插入的片段的长度与替换的片段的长度相匹配,那么该字符串将被视为可变的进行操作。
这意味着,如果您正在将大量报告或大量字符串列表构建成单个字符串值,那么利用这一点将使您的字符串处理速度更快。
下面是一个简单的类从中受益。它为您的VBA提供了与.Net相同的StringBuilder功能。
' Class: StringBuilder Option Explicit Private Const initialLength As Long = 32 Private totalLength As Long ' 缓冲区的长度 Private curLength As Long ' 缓冲区内字符串值的长度 Private buffer As String ' 缓冲区 Private Sub Class_Initialize() ' 将缓冲区设置为初始大小和字符串值 "" totalLength = initialLength buffer = Space(totalLength) curLength = 0 End Sub Public Sub Append(Text As String) Dim incLen As Long ' 值增加的长度 Dim newLen As Long ' 追加值后的长度 incLen = Len(Text) newLen = curLength + incLen ' 新值是否适合当前缓冲区中剩余的空间 If newLen <= totalLength Then ' 缓冲区有空间,只需插入新值 Mid(buffer, curLength + 1, incLen) = Text Else ' 缓冲区没有足够的空间 ' 首先通过倍增计算新缓冲区大小,直到足够大 ' 然后构建新缓冲区 While totalLength < newLen totalLength = totalLength + totalLength Wend buffer = Left(buffer, curLength) & Text & Space(totalLength - newLen) End If curLength = newLen End Sub Public Property Get Length() As Integer Length = curLength End Property Public Property Get Text() As String Text = Left(buffer, curLength) End Property Public Sub Clear() totalLength = initialLength buffer = Space(totalLength) curLength = 0 End Sub
以下是如何使用它的示例代码:
Dim i As Long Dim sb As StringBuilder Dim result As String Set sb = New StringBuilder For i = 1 to 100000 sb.Append CStr( i) Next i result = sb.Text
通过利用Mid()语句的左手边赋值功能,可以提高字符串处理的效率,特别是在构建大量字符串时。这种技巧可以通过实现一个类似于StringBuilder的类来实现。上述示例代码展示了如何使用这个类来构建一个包含1到100,000的数字的字符串。
隐藏的VBA功能的出现原因是为了提供更多的灵活性和便利性。通过隐藏VBA模块和成员,可以使代码更加整洁和易读,同时也可以保护代码的安全性。下面是几种隐藏VBA功能的方法和解决方案。
1. 隐藏VBA模块:
在Access VBA中,可以通过在模块名称前加下划线来隐藏标准模块,只有在更改对象浏览器以显示隐藏对象时,才能看到该模块。
2. 隐藏枚举成员:
在所有基于vb6的VBA版本中,可以通过在枚举成员的名称前加上方括号和下划线来隐藏它。这样可以使枚举更加清晰和易读。
3. 使用方括号引用单元格:
在Excel-VBA中,可以通过使用方括号引用单元格,同时方括号还可以作为一个求值命令,允许你评估公式语法。
4. 使用LSet和用户定义类型传递原始数据:
通过将LSet与相同大小的用户定义类型结合使用,可以在不使用MemCopy (RtlMoveMemory)的情况下传递原始数据。
5. 八进制和十六进制文字实际上是无符号类型:
八进制和十六进制文字实际上是无符号类型,这将输出-32768。
6. 通过括号传递变量:
将变量放在括号内传递将导致按值传递。
7. 直接将字符串赋值给字节数组和相反:
可以直接将字符串赋值给字节数组,也可以将字节数组赋值给字符串。
8. 使用"Mid"操作符重写字符串的特定部分:
使用"Mid"操作符可以覆盖字符串的特定部分,而不需要使用VBA中的字符串连接操作,从而提高效率。
这些隐藏的VBA功能可以使代码更加简洁、易读和高效。通过使用这些功能,可以提高VBA编程的效率和灵活性,同时也可以保护代码的安全性。
VBA自身似乎就是一个隐藏的功能。我认识的多年使用Office产品的人甚至不知道它是套件的一部分。
我在多个问题上发布了这个信息,但Object Browser是我的秘密武器。如果我需要快速编写代码,但对dll不熟悉,Object Browser就能救我一命。它使学习类结构比MSDN更容易。
Locals Window也非常适合调试。在代码中加入暂停,它会显示当前命名空间中所有变量的名称、当前值和类型。
谁能忘记我们的好朋友Immediate Window呢?它不仅适用于Debug.Print标准输出,还可以在其中输入命令。想知道VariableX是什么?
?VariableX
想知道那个单元格是什么颜色?
?Application.ActiveCell.Interior.Color
事实上,所有这些窗口都是提高VBA生产力的好工具。
“我认识的多年使用Office产品的人甚至不知道它是套件的一部分。”这就是我业务的一部分,我会因为被叫去处理这类工作而有生意可做。如果他们学会了如何做(或变得擅长),我就没工作可做了。:-)
我也是这样。我觉得VBA将会成为昔日的COBOL。VBA应用将依然存在并需要更新,但人们会转向更有吸引力的语言。
在MSDN上的类结构?首先,你必须去“MyClass”获取一个无用的概述和很少使用的示例,然后去“MyClass Methods”获取方法列表,再去“MyClass Properties”查找属性……对于层次结构……你知道的,MSDN通常是我最后的选择。
“但Object Browser是我的秘密武器”它也是.NET的秘密武器。
: 绝对是。熟练的.NET开发人员愿意帮助移植遗留的VBA应用程序,这方面有很多工作可做。有很多中小型企业完全依赖于使用VBA构建在Office之上的业务系统。
“我认识的多年使用Office产品的人甚至不知道它是套件的一部分。”非常正确!!在MS Office中有大量的功能,精通的用户只使用了不到总功能的10%。