vb中set语句的作用到底是什么呢?

DQYDXT 2017-12-05 07:50:26
查msdn,显示的set语句的作用时将对象引用赋给变量或属性,这是什么意思呢,这个set一直困扰我良久。
本人自学的vb,主要用vb操作word生成计算书,在我操作vb写入word时,首先要进行对象定义,比如

Public MyWord As Word.Application
Public MyDocument As Word.Document

Public MyRange As Word.Range
Public MySelect As Word.Selection
Public MyTable As Word.Table

Public Sub part1()
' 建立对象并打开 WORD

On Error Resume Next
Set MyWord = GetObject(, "Word.Application")
Set MyWord = CreateObject("Word.Application")
Set MyDocument = MyWord.Documents.Add
Set MyRange = MyDocument.Range(Start:=0, End:=0)
为什么在定义了app对象之后,还需要用set语句呢,这里set语句的作用到底是什么呢,有没有大神能给我讲解一下呢
...全文
1839 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-07
  • 打赏
  • 举报
回复
Set 语句 将对象引用赋给变量或属性。 语法 Set objectvar = {[New] objectexpression | Nothing} Set 语句的语法包含下面部分: 部分 描述 objectvar 必需的。变量或属性的名称,遵循标准变量命名约定。 New 可选的。通常在声明时使用 New,以便可以隐式创建对象。如果 New 与 Set 一起使用,则将创建该类的一个新实例。如果 objectvar 包含了一个对象引用,则在赋新值时释放该引用。不能使用 New 关键字来创建任何内部数据类型的新实例,也不能创建从属对象。 objectexpression 必需的。由对象名,所声明的相同对象类型的其它变量,或者返回相同对象类型的函数或方法所组成的表达式。 Nothing 可选的。断绝 objectvar 与任何指定对象的关联。若没有其它变量指向 objectvar 原来所引用的对象,将其赋为 Nothing 会释放该对象所关联的所有系统及内存资源。 说明 为确保合法,objectvar 必须是与所赋对象相一致的对象类型。 Dim、Private、Public、ReDim以及 Static 语句都只声明了引用对象的变量。在用 Set 语句将变量赋为特定对象之前,该变量并没有引用任何实际的对象。 下面的示例说明了如何使用 Dim 来声明 Form1 类型的数组。Form1 实际上还没有实例。然后使用 Set 将新创建的 Form1 的实例的引用赋给 myChildForms 变量。在 MDI 应用程序中可以使用这些代码来创建子窗体。 Dim myChildForms(1 to 4) As Form1 Set myChildForms(1) = New Form1 Set myChildForms(2) = New Form1 Set myChildForms(3) = New Form1 Set myChildForms(4) = New Form1 通常,当使用 Set 将一个对象引用赋给变量时,并不是为该变量创建该对象的一份副本,而是创建该对象的一个引用。可以有多个对象变量引用同一个对象。因为这些变量只是该对象的引用,而不是对象的副本,因此对该对象的任何改动都会反应到所有引用该对象的变量。不过,如果在 Set 语句中使用 New 关键字,那么实际上就会新建一个该对象的实例。
脆皮大雪糕 2017-12-06
  • 打赏
  • 举报
回复
引用 2 楼 DQYDXT 的回复:
[quote=引用 1 楼 脆皮大雪糕的回复:]set就是一个对象的引用 set,其实就将等号右边的对象指针赋予等号左边,于是等号左边的变量也就指向这个对象的实际内存位置, 是针对对象操作哈,不是针对基础变量。 举个例子

Dim a As New Collection '定义a为一个集合对象
a.Add "test"  'a 集合中添加一个元素

Dim b As Object '定义B

Set b = a '令b引用a,也就是b的指针指向了a
Debug.Print b(1) '这时候b的第一个元素里,我们可以得到刚才在a添加的那个test
b.Add "addition" '在b添加一个元素

Debug.Print a(1), a(2) '在a里同样能得到新增的这个元素
谢谢您的回复,那既然是右边指向左边的一个引用,那为什么,b变了,a也会变呢[/quote] 修正一下说法,那个例子里,创建一个新的集合对象然后a作为一个指针变量指向这个集合对象。set指令完成后,将a指向对象的指针复制给了b。于是后续的你操作a和b都是指向同一个对象进行操作。 其实数据类型有引用类型和值类型的差别,对象基本上都是引用类型,具体操作就是指针,只不过VB里不显现指针。 再举个值类型的例子

    Dim a As Integer
    Dim b As Integer
    
    a = 100
    b = a
    
    b = 101
    Debug.Print a, b
这里面,a和b都不是引用,所以b=a实际上是将数值复制了一份。 从语法角度上说,其实vb6里的值类型赋值语句都省略了一个关键字“LET” 你在赋值语句前面加上let会自动格式化出关键字,执行起来也都正确的。 可以理解为let是值类型的赋值,数据copy了一份给了新变量,新变量处理复制过来的数值。let可省略不写 set是引用类型的赋值,指针copy了一份给了新变量,新变量处理复制过来的指针所指向的对象。 如果在例1里面加个变量c c=a(1) 这时候a是引用对象,但是a(1)是具体的值变量。c的任何修改都不会影响a(1) 用文字表达语义就是:把a的指针所指向的对象的第一个元素值复制一份给值变量c
笨狗先飞 2017-12-06
  • 打赏
  • 举报
回复
普通类型变量没有实例的概念,存在就是存在,不存在就是不存在,其实一般变量a,b vb里表示写法是 Let a=b 这个let关键字可以不写省掉 对象类的变量有个实例的概念,实例化的对象才是可以被操作使用的 比如 dim a as object 这个时候 a 变量没有实例化,只是说明a是这么个类型的变量,但他的功能是不可用的 创建实例一般带new 或者用createobject来实现 比如 dim a as new object ,这个时候,a是实例化的,直接可以操作使用。 或者用 set a=createobject("xxxxxx") 或者 set a=new object, 这个时候创建出来的对象实际只和a联系在一起,如果有 set b=a 这时候,相当于这个a实例又有了b这个名字,其实两个变量操作同一个对象实例 其实他们是同一个。
DQYDXT 2017-12-06
  • 打赏
  • 举报
回复
引用 4 楼 脆皮大雪糕的回复:
[quote=引用 2 楼 DQYDXT 的回复:] [quote=引用 1 楼 脆皮大雪糕的回复:]set就是一个对象的引用 set,其实就将等号右边的对象指针赋予等号左边,于是等号左边的变量也就指向这个对象的实际内存位置, 是针对对象操作哈,不是针对基础变量。 举个例子

Dim a As New Collection '定义a为一个集合对象
a.Add "test"  'a 集合中添加一个元素

Dim b As Object '定义B

Set b = a '令b引用a,也就是b的指针指向了a
Debug.Print b(1) '这时候b的第一个元素里,我们可以得到刚才在a添加的那个test
b.Add "addition" '在b添加一个元素

Debug.Print a(1), a(2) '在a里同样能得到新增的这个元素
谢谢您的回复,那既然是右边指向左边的一个引用,那为什么,b变了,a也会变呢[/quote] 修正一下说法,那个例子里,创建一个新的集合对象然后a作为一个指针变量指向这个集合对象。set指令完成后,将a指向对象的指针复制给了b。于是后续的你操作a和b都是指向同一个对象进行操作。 其实数据类型有引用类型和值类型的差别,对象基本上都是引用类型,具体操作就是指针,只不过VB里不显现指针。 再举个值类型的例子

    Dim a As Integer
    Dim b As Integer
    
    a = 100
    b = a
    
    b = 101
    Debug.Print a, b
这里面,a和b都不是引用,所以b=a实际上是将数值复制了一份。 从语法角度上说,其实vb6里的值类型赋值语句都省略了一个关键字“LET” 你在赋值语句前面加上let会自动格式化出关键字,执行起来也都正确的。 可以理解为let是值类型的赋值,数据copy了一份给了新变量,新变量处理复制过来的数值。let可省略不写 set是引用类型的赋值,指针copy了一份给了新变量,新变量处理复制过来的指针所指向的对象。 如果在例1里面加个变量c c=a(1) 这时候a是引用对象,但是a(1)是具体的值变量。c的任何修改都不会影响a(1) 用文字表达语义就是:把a的指针所指向的对象的第一个元素值复制一份给值变量c[/quote] 差不多懂了,谢谢大神!
DQYDXT 2017-12-06
  • 打赏
  • 举报
回复
引用 3 楼 笨狗先飞的回复:
普通类型变量没有实例的概念,存在就是存在,不存在就是不存在,其实一般变量a,b vb里表示写法是 Let a=b 这个let关键字可以不写省掉 对象类的变量有个实例的概念,实例化的对象才是可以被操作使用的 比如 dim a as object 这个时候 a 变量没有实例化,只是说明a是这么个类型的变量,但他的功能是不可用的 创建实例一般带new 或者用createobject来实现 比如 dim a as new object ,这个时候,a是实例化的,直接可以操作使用。 或者用 set a=createobject("xxxxxx") 或者 set a=new object, 这个时候创建出来的对象实际只和a联系在一起,如果有 set b=a 这时候,相当于这个a实例又有了b这个名字,其实两个变量操作同一个对象实例 其实他们是同一个。
讲得太明白了,谢谢大神,明白了
DQYDXT 2017-12-05
  • 打赏
  • 举报
回复
引用 1 楼 脆皮大雪糕的回复:
set就是一个对象的引用 set,其实就将等号右边的对象指针赋予等号左边,于是等号左边的变量也就指向这个对象的实际内存位置, 是针对对象操作哈,不是针对基础变量。 举个例子

Dim a As New Collection '定义a为一个集合对象
a.Add "test"  'a 集合中添加一个元素

Dim b As Object '定义B

Set b = a '令b引用a,也就是b的指针指向了a
Debug.Print b(1) '这时候b的第一个元素里,我们可以得到刚才在a添加的那个test
b.Add "addition" '在b添加一个元素

Debug.Print a(1), a(2) '在a里同样能得到新增的这个元素
谢谢您的回复,那既然是右边指向左边的一个引用,那为什么,b变了,a也会变呢
脆皮大雪糕 2017-12-05
  • 打赏
  • 举报
回复
set就是一个对象的引用 set,其实就将等号右边的对象指针赋予等号左边,于是等号左边的变量也就指向这个对象的实际内存位置, 是针对对象操作哈,不是针对基础变量。 举个例子

Dim a As New Collection '定义a为一个集合对象
a.Add "test"  'a 集合中添加一个元素

Dim b As Object '定义B

Set b = a '令b引用a,也就是b的指针指向了a
Debug.Print b(1) '这时候b的第一个元素里,我们可以得到刚才在a添加的那个test
b.Add "addition" '在b添加一个元素

Debug.Print a(1), a(2) '在a里同样能得到新增的这个元素

2,462

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧