我有一个简单的代码,从一本关于VBA的书中显示一个带有问候的MsgBox。代码如下:
Sub GreetMe5()
Dim Msg As String
If Time < 0.5 Then Msg = “Morning”
If Time >= 0.5 And Time < 0.75 Then Msg = “Afternoon”
If Time >= 0.75 Then Msg = “Evening”
MsgBox “Good “ & Msg
End Sub
我的问题是,声明变量'Msg作为字符串'的目的是什么,如果它可以不声明一个?没有这个变量的代码应该是这样的:
Sub Greetings1()
If Time < 0.5 Then MsgBox "Good Morning"
If Time >= 0.5 And Time < 0.75 Then MsgBox "Good Afternoon"
If Time >= 0.75 Then MsgBox "Good Evening"
End Sub
谢谢
您给出的小代码示例本身质量很差,因为它是您期望的VBA幼稚用户提出的。比方说,这是你将分发给公司海外办事处的一个项目的一部分。问候当然要用当地语言。你是想写50个版本的代码,每种语言一个版本,还是更高级的代码更好?
Public Enum Greeting
NoGreeting = 0
Morning
Afternoon
Evening
' other greeting message references are added here
End Enum
Sub GreetUser()
Dim Msg As Greeting ' where greeting is the name of an enumeration
If Time < 0.5 Then Msg = Greeting.Morning
If Time >= 0.5 And Time < 0.75 Then Msg = Greeting.Afternoon
If Time >= 0.75 Then Msg = Greeting.Evening
MsgBox Messages(getsystemLocale).Greetings(msg)
End Sub
VBA支持两种编程方式。
第一种是无类型编程。易于使用,紧凑,非常适合小宏。这也是VBScript选择从VBA实现的语法。
注Dim A
暗含Dim A as Variant
。
第二种是高效地使用类型化编程,即像C语言那样对CPU编程。
在无类型中,一切都是抽象数据类型,每次使用它时都需要处理它。当CPU使用它时,它需要是一个特定的类型。
当作为类型使用时,不需要处理。请记住,如果需要,Basic在这两种情况下都会自动转换类型,称为Let
强制转换(https://learn.microsoft.com/en-us/openspecs/microsoft_general_purpose_programming_languages/ms-vbal/74614d3e-7068-4c33-b149-029534522472)。因此,为了提高速度,您必须正确地声明它,因为Basic修复了slow声明。
这是内存中的一个变量。注意大多数字段都是联合中的一个。
typedef struct tagVARIANT {
union {
struct {
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union {
LONGLONG llVal;
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
VARIANT_BOOL __OBSOLETE__VARIANT_BOOL;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
LONGLONG *pllVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
VARIANT_BOOL *__OBSOLETE__VARIANT_PBOOL;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
ULONGLONG ullVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
ULONGLONG *pullVal;
INT *pintVal;
UINT *puintVal;
struct {
PVOID pvRecord;
IRecordInfo *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
} VARIANT;
https://learn.microsoft.com/en-us/windows/win32/api/oaidl/ns-oaidl-variant
这是一个VBA字符串(称为BStr)
BSTR是由长度前缀A组成的复合数据类型数据字符串和结束符。下表描述了这些特性组件。
Item Description Length prefix A four-byte integer that contains the number of bytes in the following data string. It appears immediately before the first character of the data string. This value does not include the terminator. Data string A string of Unicode characters. May contain multiple embedded null characters. Terminator A NULL (0x0000) WCHAR.
以前,某些版本的Mac操作系统定义了这个数据用不同的方式输入,一些微软代码在Mac上运行计算机使用这种数据类型。本文档不再描述这些过时的细节。
BSTR是一个指针。的第一个字符数据字符串,不包含长度前缀。
bstr是使用COM内存分配函数分配的,所以它们可以在不考虑内存分配的情况下从方法返回。
https://learn.microsoft.com/en-us/previous-versions/windows/desktop/automat/bstr