ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7132|回复: 8

一直的困惑:以下情况,为什么对象不能自动带出方法和属性?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-1-29 08:24 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 13679895353 于 2015-1-29 13:14 编辑

“对象自动带出方法和属性”,涉及到写代码的效率问题。

我知道VBA可以自动提醒或按Ctr+J 寻求提示。但实际操作过程中,有的对象系统不提醒方法和属性。举例如下:
我一直存在这个困惑,一直没找到答案。望热心朋友帮忙。

1.  Sheets(1).range("A1")    ‘ 此对象,系统不提示方法和属性。为什么?怎么破?(这个问题最要命,经常碰到,故放在第一位。)

2. ActiveSheet  '此对象,系统不提示方法和属性。怎么破?(同样要命,放在第二位)

3. workbooks(1).    '系统提示方法和属性
    workbooks(1)    '按Ctr+j, 系统提示的方法和属性不一样(或不完全一样)
   这是为什么?

4. worksheets(1).  '系统不会提示方法和属性
    worksheets(1)   ’ Ctr+j, 系统提示方法和属性
   这是为什么?


5. Range("A1").   '系统提示方法和属性
    Range("A1")    '按Ctr+j, 系统提示的方法和属性不一样(或不完全一样)
   这是为什么?



TA的精华主题

TA的得分主题

发表于 2015-1-29 09:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 funfox 于 2015-1-29 20:31 编辑

小弟并非程序员,如解释有误,还请各位高手大力地加以指正!!!
献丑了@@


Step1:请按F2,弹出「浏览对象」
Step2:单击对象类别列表(中间列表框框的左侧框),找worksheets对象类别
Step3:单击所属对象列表(中间列表框框的右侧框),找Item
Step4:最下方框框有个说明栏
PropertyItem(Index) As Object
只读
Excel.Worksheets的成员

Part1:说理

1.A:属性、对象、变量,数据型态
Property 对象属性(:ActiveSheet) as 数据型态

数据型态ObjectObject只是系统数据型态的关键词,但非明确对象型态,并没有相对应的链接库可供参照,故当键入属性引用字符『.』时,不会自动产生任何提示,此时按<Ctrl+J><Alt+ >,有时弹出的不是你要的(<AllLibraries>.< globals>的子对象清单),有时却什么都弹不出。
你的问题124,属此范畴

说明如下:

※   Sheets(1) 返回一个Object,非明确对象型态。
Sheets(1) = Sheets.Item(1)
Property Item as Object
则:Object.    ‘不会自动产生提示
只是程序设计人员知道Sheets(1)的返回结果是张Worksheet,不是张Chart
但是计算机可能认为返回的对象,是个像Range之类的东西,因为Object就是不定态,什么对象都能引

就如同:asObjectasVariant
Dim aVar as Object
Set aVar = Sheets(1)
aVar.   ‘不会产生任何提示,道理Sheets(1)是与相同的

Dim aVar as Variant
Set aVar = Sheets(1)
aVar.   ‘不会产生任何提示,道理是雷同的(但成因并不完全一样)

下列例子将产生自动提示
Dim aVar As Worksheet
aVar.                ‘将产生自动提示
因为计算机明确知道,变量aVarWorksheet,不是ChartRange之类的东西,而Worksheet对象类别有属性可引,就会产生自动提示
故此,不论SetaVar = Sheets(1) 有无,aVar.都会自动提示

1.A结语:
产生自动提示的原因:对象型态明确,且具有属性引用字符『.
只有计算机知道,该 变量/对象/属性 明确的对象型态时,会有;
而与有无指定、引用、变量名称、程序设计人员知不知道,无关,此时则不弹出

1.B worksheets() =worksheets.item()
Property Item as Object
因为worksheets()可返回的对象,有好几种,只有ObjectVariant能用来定义该项属性(Item)的对象型态,供Item返回多种不尽同类的物件worksheets
所以worksheets(n)一定是Object,详见下表XlSheetType 列举
详细请试试 Sheets.Add[Before],[After],[Count],[Type] 的功能
XlSheetType,则为[Type]所引入的常数
XlSheetType 列举

名称




描述


xlChart


-4109


图表


xlDialogSheet


-4116


对话框表


xlExcel4IntlMacroSheet


4


Excel 版本 4 国际宏表


xlExcel4MacroSheet


3


Excel 版本 4 宏表


xlWorksheet


-4167


工作表


1.B结语:
worksheets()Sheets()
在计算机的眼中,他们可能是:图表、对话框表、工作表等等,自然不知道要去链接库叫哪种对象型态的子对象列表来给你用,更别说自动弹出

PS:小弟很好奇,Excel版本 4 国际宏表、Excel 版本 4 宏表,这两项的对象型态在哪边?

1.C 自动弹出的列表
功能:自动引出目前对象的属性列表,编写程序比较快
清单来源:目前输入中的对象,其对象型态的属性列表
如:
Range(“A1”).Cells.  ‘自动弹出Range对象型态的属性列表
因为目前输入中的对象Range(“A1”)的属性,对象Cells,其型态是Range
PropertyCells As Range
只读
Excel.Range 的成员

弹出的情况,与清单的内容:
自动弹出:
目前输入中的对象,其对象型态的属性列表

不自动弹出:采用<Ctrl+J><Alt+ >弹出
        如果是正在输入变量,且尚未输入完整,则弹出已宣告的变量、部分系统关键词或已知数据型态的列表。
必然弹出<All Libraries>.< globals>的子对象清单。因为此时,计算机智能侦测到的「目前输入中的对象」,其属性,是<AllLibraries>中的其中一个,当然<globals>子对象清单的内容,包山包海什么都有,因为是在<All Libraries>中啊啊啊啊啊!
此时,对象基本上已输入完整,且计算机侦测并无输入其属性的需求,就是没有『.』

无法弹出:采用<Ctrl+J><Alt+ >,只会听到『咚咚』
该对象或其父对象,对象数据型态必为:Object、Variant或数字数据

1.C结语:
自动弹出的列表,只存在明确对象输入完后有引用其属性时会有
语句侦错应用:
a)如在清单无法自动弹出时,或弹出的清单与预期的不相同。
请检查是否已输入 ”.” ?变量名称是否有输入完整或有误?
b)如在清单无法弹出时,采用<Ctrl+J><Alt+ >,只听到咚咚。
该对象或其父对象,对象数据型态必为:ObjectVariant或数字数据?
所宣告的对象型态拼字是否正确?变量是否有宣告?

实例:曾经看过这种写法(做过这种事的人一定不少,我也做过)
Dim i As Long, v As Long
For i = 1 To Sheets.Count
v = Sheet & i.Cells(1, 1).Value
Next

那个『Sheet&i.』一定不会弹出清单来的,因为根本就用错
这种将字符串连接完后,直接当CodeName用,完全不管数据型态的例子实在是很多

Part1 End



1. Sheet(1).range("A1")
正确的应该是,Sheets(1).range("A1")

Sheets(1):返回非明确型态的对象,见1.A结语
range("A1")虽然 PropertyRange AS Range,是个明确对象型态的数据
但是这段程序代码的父对象是一个非明确型态的对象,所以不会提示,只会听到咚咚(按<Alt+ >。见1.C无法弹出

2. ActiveSheet '此对象,系统不提示方法和属性。怎么破?(同样要命,放在第二位)

ActiveSheet:返回非明确型态的对象,见1.A结语
怎么破:见1.A结语上方三行
Dim aVar As Worksheet
aVar.                ‘将产生自动提示

3. workbooks(1).   '系统提示方法和属性
   workbooks(1)    'Ctr+j, 系统提示的方法和属性不一样(或不完全一样)
这是为什么?

workbooks(1)=Workbooks. Item(1)
Property Item(Index) As Workbook
返回对象的对象型态Workbook,对象型态明确

workbooks(1).弹出Workbook的子对象清单1.A结语

workbooks(1):返回对象Workbook,本身为完整对象叙述,无属性符号『.,不需要属性提示。硬要引入,则弹出<All Libraries>.< globals>的子对象清单。见1.A结语

4. worksheets(1). '系统不会提示方法和属性
worksheets(1)  ’ Ctr+j, 系统提示方法和属性,这是为什么?

worksheets(1). 返回非明确型态的对象,见1.A结语
worksheets(1) 引入<AllLibraries>.< globals>的子对象清单。见1.A结语

5. Range("A1").   '系统提示方法和属性
   Range("A1")    'Ctr+j, 系统提示的方法和属性不一样(或不完全一样)
   这是为什么?

Range("A1"). :同3.

Range("A1") :引入<AllLibraries>.< globals>的子对象清单。见1.A结语

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-1-29 10:07 | 显示全部楼层
本帖最后由 andysky 于 2015-1-29 10:37 编辑

1.你写错了,当然不会弹出提示,VBA不存在sheet这个对象,也没有  Sheet(1)这个对象。
sheets(1)才是对的,不过VBA对于集合的子集部分提供提示信息,部分不提供,没有规律。破解之法是采用变量
例如sheets(1)改成这样:
Sub test()
Dim sht As Worksheet
Set sht = Sheets(1)
sht.    '此时会自动产生提示
End Sub
__________________
例如Cells(1)改成这样:
Sub test()
Dim cell As Range
Set cell = Cells(1)
cell.      '此时会自动产生提示
End Sub
2.ActiveSheet 破解之法和第一种一样,采用变量
Sub test()
Dim sht As Worksheet
Set sht = ActiveSheet
sht.    '此时会自动产生提示
End Sub


3.workbooks(1).   此时已经将对象名称输入完了(小圆点是标志)因此会提示该对象的属性和方法
workbooks(1)此时对象名称没有录入完成(没有小圆点),因此提示信息还处于对象名称、函数名称阶段,提示信息不可能是对象的属性和方法,这也是一种智能

4.解决办法也是采用变量

5.和第3点一样

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-29 13:20 | 显示全部楼层
andysky 发表于 2015-1-29 10:07
1.你写错了,当然不会弹出提示,VBA不存在sheet这个对象,也没有  Sheet(1)这个对象。
sheets(1)才是对的, ...

非常棒!很透彻!鲜花在哪里?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-29 13:31 | 显示全部楼层
funfox 发表于 2015-1-29 09:55
小弟并非码农,如见地有误,还请各位高手大力地加以指正!!!献丑了@@

请按F2,看「浏览对象」,最下 ...

呵呵,虽然看不明白,但是好像很厉害的样子!

大体意思明白。细致之处我看不懂,要很深的功力深入到VB基本架构才能明白。

一句话,你应该是深入研究的专家,如果不是,那真是白瞎了,可惜了。

楼下的版主,已经给我简单说明了应对方法。

真诚感谢!

TA的精华主题

TA的得分主题

发表于 2015-1-29 20:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
13679895353 发表于 2015-1-29 13:31
呵呵,虽然看不明白,但是好像很厉害的样子!

大体意思明白。细致之处我看不懂,要很深的功力深入到VB ...

楼主谬赞,我其实是文科生

不好意思,文科长篇大论的瘾头又出现了

对于Excel和程序设计情有独钟倒是了

编程在中学学过半年吧

那之后都是利用闲暇私下自学的

所以专家二字真的不敢当

谢谢楼主夸奖!!

TA的精华主题

TA的得分主题

发表于 2015-1-29 21:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
funfox 发表于 2015-1-29 09:55
小弟并非程序员,如解释有误,还请各位高手大力地加以指正!!!献丑了@@

Step1:请按F2,弹出「浏览对 ...

好详细,赞一个!

TA的精华主题

TA的得分主题

发表于 2016-7-5 09:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
同遇到此问题 看到楼上几位大侠解答 明白了不少

TA的精华主题

TA的得分主题

发表于 2019-11-18 21:04 | 显示全部楼层
funfox 发表于 2015-1-29 09:55
小弟并非程序员,如解释有误,还请各位高手大力地加以指正!!!献丑了@@

Step1:请按F2,弹出「浏览对 ...

大牛啊,你不去搞软件真是浪费了,佩服啊,真是让我对VBA有了更多思考,深度居然能想到这么深,厉害。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-26 06:49 , Processed in 0.052081 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表