在VBA中声明变量的目的是什么,如果它可以不声明一个?



我有一个简单的代码,从一本关于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

相关内容

  • 没有找到相关文章

最新更新