VBA的隐藏功能

10 浏览
0 Comments

VBA的隐藏功能

VBA语言中有哪些特性的文档不够完善或者很少被使用?

0
0 Comments

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的数字的字符串。

0
0 Comments

隐藏的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编程的效率和灵活性,同时也可以保护代码的安全性。

0
0 Comments

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%。

0