#EXCEL VBA对象的常用操作方法c#
vba吧
全部回复
仅看楼主
level 11
lxlzmh2002 楼主
在开始聊EXCEL 对象操作之前,得先简单聊一下操作这些对象的上帝之手--VBA,它是以一种上帝视角方式在工作。那什么算上帝视角?上帝视角就是非人类的视角,它不须要遵循人类的习惯来运作,打个比方,你在客厅看电视,忽然困意来习想上床睡觉,你得先起身离开客厅,打开卧室房门,才能上床睡觉,这是人类的常规操作。而上帝模式下只需要一步,当你想睡觉时,上帝可以把你从客厅直接扔到卧室的床上,穿越时间空间,这就是上帝视角。你可以在书房直接开客厅电视机开关,你可以在躺床上一边刷手机的同时,另一边在床上安排厨房炊具炒菜,这都是上帝操作。
VBA操作Excel对象就是上帝视角,不必遵循人类的操作规则。这一点新入坑VBA朋友尤为要注意,再比如说,人类的操作Excel需要眼睛可得见,而VBA操作这是不必要的,人类要复制一个单元格,得先切换到那个格所在的工作表,再找到并选中那个格,然后鼠标右键复制,VBA则可以从任何地方,对任意一个工作表上的单元格,直接一步复制。在人类层面上,操作Excel是有空间上的先后顺序,而VBA做同样的事情,由于它是上帝视角,工作表也好单元格也罢,对它来就说好象是兵器架子上的兵刃,是平行排列,不需要空间上可视,不需要先后顺序,直接使用。
那么,VBA究竟是通过什么手段来操作Excel的?它是通过操作Excel对象的属性和方法来实现的,本贴则是简述Excel对象的“常用”操作方法。
为防止走丢,请关注、点赞、收藏转发。
2024年01月06日 14点01分 1
level 11
lxlzmh2002 楼主
[单元格]对象的表示方法
表示第一个工作表的A2单元格对象,有三种下面常用的表示方法:
第一种:Sheets(1).Range("A2")
- 适合一次性引用,不太适合用变量遍历
第二种:Sheets(1).[A2]
- 书写简单,适合一次性引用,不适合遍历
第三种:Sheets(1).Cells(2,1)
- 适用于变量改变行列值,用于循环遍历。
2024年01月06日 14点01分 2
level 11
lxlzmh2002 楼主
[工作表]对象的表示方法
worksheets("test") : 表示表名为test的工作表对象,可以简写为sheets("test")
- 适用已知表名的调用
worksheets(1) : 表上工作薄上第1个工作表对象,可以简写为sheets(1)
- 适用不知表名,但已第几个表的调用
sheet1: 表示VBE (Alft + F11) 编程环境,表name属性为sheet1的工作表
-这是vba工程内部工作表的属性名,不受工作表名变动,工作表顺序变动影响。推荐程序使用表属性名。如果有多个EXCEL工作薄打开,sheet1指的是代码所在那个工作薄上的sheet1表
-activesheet : 表示当前处理活动状态的工作表对象
适用于在未知表名字,未知表位置顺序下,对当表工作表的调用
2024年01月06日 14点01分 3
不好意思,我得说一下,worksheets和sheets的范围是不一样的,worksheets只选工作表类型的表,而sheets的范围不仅包括工作表,还包括chart类型和其他类型的表。
2024年01月07日 18点01分
@数界如此多娇 范围上说sheets=worksheets+chartsheets+microsheets+dialogsheets..., 后面excel4对象上世纪已做古,常用无从谈起。对象角度说chartsheets是sheets但不是worksheets(有格有线的sheets),本文已限定了的“工作表”对象,sheets可以替代。
2024年01月07日 21点01分
level 11
lxlzmh2002 楼主
[工作薄]对象的表示方法
workbooks("test"):表示名为test的工作薄
- 适用于已知Excel文件名称的访问
workbooks(1):表示第1个索引顺序的工作薄
- 适用于对已知Excel文件打开顺序的访问
activeworkbook:表示当前的活动工作薄
- 适用对当前活动工作薄的访问,即可能未知文件名称或者文件打开顺序的的前提下,用activeworkbook来访问当前活动的工作薄。
thisworkbook:表示VBA代码所在的工作薄
- 适用对VBA代码所在工作薄的访问
2024年01月11日 22点01分 22
level 11
lxlzmh2002 楼主
[application] 对象
application - 就Excel而言,application表示的就是Excel软件本身的对象,前边所述的单元格,工作表,工作薄对象,都历属于application的属性,除此之外它还有些在对软件的操作层面的属性和方法,详文在后讨论application的属性和方法时再说。
一直在说属性和方法,他俩究竟是指什么?
属性 - 描述对象特征,通常是个名词。属性的值可以描述名字,颜色,长度等等。改变了属性的值,相当于改了对象特征的量,比如:sheet1.name="vba吧",即把表一的名字改为VBA吧。需注意两点:1.有些属性是只读的,不可修改,2.属性也可能是另外一个对象。
方法 - 描述对象所能执行的动作,通常是个动词。方法通常不能改变,只能被执行,比如:工作表的打开、新建、删除等操作,都是在执行一个动作。
2024年01月11日 22点01分 23
level 2
支持楼主分享[真棒][真棒][真棒]
2024年01月12日 00点01分 24
感谢支持!借楼回复下吧友:文字错误如果您发现了,麻烦您跟楼回复,我就不再做修正,但仅限更正的文字。为方便有需要的人阅读,与主题无关的文字回复我都会删除,请您谅解。
2024年01月12日 16点01分
level 11
lxlzmh2002 楼主
[单元格] 对象属性和方法的常用操作(一)
单元格对象即Range对象,指单元格区域,一个格子也叫区域,指不过区域的大小为一。
Sheet1.Range("C5").Row : 结果返回C5单元格对象的Row属性,即C5的行号,是个数值
Sheet1.[C5].Column : 返回C5单元格对象的Column属性,即C5的列号,数值型
Sheet1.Cells(5,3).Address : 结果返回C5单元格地址,是字符型
- 上边对C5单元格对象引用的三种方法,在前楼已述,三种方法等价。
- 对象中某些属性可能是只读,不准修改。例如Sheet1.[C5"].Column=2是不可以的
Sheet1.Cells(5,3).Value : 结果返回C5单元格的值
Sheet1.Cells(5,3).Text : 返回C5单元格的显示值
- Value和Text 的区别,一个是实际值,一个是显示值。比如在四舍五入格式化时,实际值不同于显示值。
- Value是可写属性,即可以任何修改。如可以让Sheet1.Range("A1:C3").Value=99, 执行结果A1到C3的9个单元格会被赋值为99。也可以把一个单元格区域的值一次性赋给另一个单元格区域,即:Sheet2.[A1:C3].Value=Sheet1.[A1:C3].Value,执行后相当于选择性粘贴中的只粘贴数值。
下面是单元格对象的常用方法,顾名思义,是对象能执行的动作。
Sheet1.[C5:F8].Copy : 对C5:F8进行复制
Sheet1.Range("C5:F8").Cut : 对C5:F8进行剪贴
Sheet1.Range("A1").Paste : 在A1上对已复制的内容进行粘贴。选择性粘贴是.PasteSpecial,选择性粘用法请自动脑补,不再此展开。
Sheet1.[C5:F8].ClearContents : 清除C5:F8单元格的内容
Sheet1.[C5:F8].Merge : 对C5:F8进行单元格合并
2024年01月12日 07点01分 25
Sheet1.[C5"].Column=2,中多了个双引号。不发贴不知道,自己找自已的错误太难了
2024年01月12日 17点01分
- Value和Text 的区别说明是错的,官方文件的说明:“Value2 此属性与 Value 属性之间的唯一区别是 Value2 属性不使用 Currency 和 Date 数据类型。 可以通过使用 Double 数据类型,以浮点数形式返回这些数据类型格式的数值。”
2024年01月18日 03点01分
显示值应该是TEXT的属性,例如单元格如果是数字格式的单元格,然后宽度不足不能完整显示数字变成
#号的时候,那么TEXT的内容也会是#

2024年01月18日 03点01分
@ISD_狮子座 感谢对Value2属性的补充说明
2024年01月18日 03点01分
level 11
lxlzmh2002 楼主
[单元格] 对象属性和方法的常用操作(二)
End : 结果反回是一个单元格对象。我把这个属性取名为取边属性。
什么叫取边?就是某一个位置的求边界。
假如你把手指放在一个长方形桌面上,向左边看找到第一个位置,这个位置跟手指所在位置的桌面材质不一样,找到的那个位置可能是空气,不管怎样,找到的那个地方就叫手指位置的左边界。同理向上可找到桌面的上边界,还有右边界和下边界可以找到。
Sheet1.[A1].End(xlDown) : 这句话的意思是,对A1单元格求边界(END),xlDown参数指定的是下边界。意思是从A1处开始向下看,找到第一个与A1不同的地方。什么是不同,如果A1有值,向下第一个没值的地方就是A1的下边界,如果A1没值,向下第一个有值的地方就是A1的下边界。注意,请注意,End取边的结果还是一个单元格对象。
再对找到的单元格取属性,可能就是最终想要的,比如说:
Sheet1.[A1].End(xlDown) .Row : 结果是求出A1向下边界单元格的行号。
Sheet1.[A100000].End(xlUp) .Row: 结果是求A100000这个单元格向上的边界单元格行号。
Sheet1.[AA1].End(xlToLeft) .Column :求AA1单元格的左边界的列号。同理还有xlToRight自测试。
有人说可以sheet1.usedrange替代求区域边界。usedrange区分的是使用和未使用的区域,对于曾经使用过的区域,然后清空内容清空格式恢复到未使用的样子,系统仍将划在已使用区域。
补充操作:
- End括号内的xlUp,xlDown... 是Excel的常量,即常数。如End(xlUp)和End(3)等价
- 使用偏移量,举例:Sheet1.[A1000000].End(xlUp)(2) =100
Sheet1.[A1000000] :代表A列第一百行的单元格,正常情况此格是空的,因为极少表的数据量能用到这里。
Sheet1.[A1000000].End(xlUp):对A1000000向上取边,假设A1000000是空白,这个结果指的就是A列最后有数据的单元格。
Sheet1.[A1000000].End(xlUp)(2):表示最后有数据的格向下偏2行的格, 即有数据后边没数据那个格。
Sheet1.[A1000000].End(xlUp)(2) =100 :向A列最后一个数据后边追加数据100,这句每执行一下追加一个数据。
Sheet1.[A1000000].End(xlUp)(2) 与 Sheet1.[A1].End(xlDown) 在理论上是应该等价。但是实际上A列的数据区中如果有空白的行,就不是一回事了
Sheet1.[A100000].End(xlUp)(2,2) =100: (2,2)是行列偏移,这句执行的效果是,对A列最后一行的同行的B列,进行赋值100.
2024年01月12日 08点01分 26
level 11
lxlzmh2002 楼主
[单元格] 对象属性和方法的常用操作(三)
Offset: 结果返回是一个单元格对象,Offset英文意思偏移量,
前文已经涉及一点偏移引用,请暂时先忘记。
Sheet1.[A1].Offset(3,2) : A1向下偏移3行,向右偏2行的单元格对象,即C4。偏移后位置是在原来位置“加”上偏移量。
-可能有人会问为什么不直接写Sheet1.[C4]。可能在某些具体情况下,相比绝对的地址的偏移量在代码层面更易于获得。
Sheet1.[C5:F8].Offset(3,2) : 结果表示C5:F8这个区域整体向下3行,向右2行偏移后的区域
****上文提到过使用括号的偏移写法。两者偏移写法区别如下,习惯哪咱用哪种
Range("A1") 与Range("A1")(1,1) : 都代表是A1这个单元格
Range("A1") 与Range("A1").Offset(0,0) : 都代表是A1这个单元格
Resize: 更改区域大小属性,结果是单元格对象,
此属性非常常用,尤其是程序化取一个区域时,操作简单
Sheet1.[A1].Resize(3,2) : 结果是从A1开始到B3的总共3行2列的单元格区域。
Sheet1.[A1].Resize(1,5) :结果是从A1开始的总共1行5例的单元格区域。
Sheet1.[C1].Resize(5,1) :结果是C1开始的总共5行1列的单元格区域。
在对单元格属性和方法的操作中,高频使用的就这么多。当然了,单元格对象还有很多其他的属性和方法,比如:选择整行、整列,字体、字号,边框的。个人认为人精力有限,没必要全记忆,现用现查就好了,或者需要时用录宏看一下也就一目了然。
2024年01月12日 16点01分 28
level 11
lxlzmh2002 楼主
[录制宏] - 前文提到了录制宏,本文顺便聊下录制宏。
什么是录制宏:
平时我们使用鼠标和键盘来操作Excel,VBA 则可以通过代码做相同操作。
录制宏则通过录制我们鼠标键盘的操作,自动生成 VBA 代码,进尔实现操作Excel的目的。
- 所谓的操作,不管用鼠标键盘操作Excel,还是用代码,最终都是在操作本文正在讲述的Excel的对象(range,worksheet,workbook,application),使用其属性或者方法。
那手动编辑的VBA代码和录制宏产生的VBA代码,区别在什么地方?
- 手动编辑 VBA 则可以借用编程语言的特性,如变量、判断、循环、数组、字典等,实现普通录制宏所无法实现的操作,也就是说手动要大于录制。录制宏还有个缺点,由于它录的是人的操作动作,不是上帝视角,正如开篇提到的那样,相比要实现的功能来说,人的一些操作动作是多余的。
为什么要录制宏:
- 一些重复操作是可以录宏来实现程序化,减少手工敲代码的劳动
- 更多的应用是查询用法,通过录宏来查询对象不常用的属性、方法以及参数的具体写法。
怎么使用录制宏:
- 通过Excel软件下边状态栏左边的录制宏按钮,或者开发工具菜单下的录制宏
补充:
- Office组件,目前只有Excel和Word有录宏功能, 其他组件想查对象属性或方法,只能通过 VBE (VBA的编辑器,Alt+F11)查询,但更详细的属性和方法的用法只能翻使用手册
- Office组件,Excel, Word, Access,PowerPoint, Outlook, Publisher (OneNote除外),都内置了VBE编程环境。
VBA 本身是面向对象的语言,主要是扩展Windows软件的功能,特别是Office软件的功能。注意这句话,虽然VBA的使用多见在Office软件上,但理论上在Windows系统上安装注册的软件对象(微软和非软件的),从操作对象的角度说VBA同样可以操作他们。也就是说,不管VBA代码是在哪个软件的编辑器上编辑和运行,但VBA代码是能跨过软件的界限来操作对象的,因为VBA是上帝视角。
2024年01月13日 15点01分 29
level 11
lxlzmh2002 楼主
[工作表] 对象属性和方法的常用操作
常用属性:
Activesheet.Name = "VBA吧" : 更改当前活动工作表的名字属性。
Sheet1.Visible = xlSheetHidden :将工作表可见属性Visible设置成隐藏。如果设置成xlSheetVeryHidden, 而鼠标右键取消隐藏则变为不可见。
象常用法:
Sheets(2).select : 选中第2张工作表
Sheets.add : 新建工作表,新建的位置在当前活动工作表的前边。想指定新建表的位置,要使用before 或after参数。例如在第2张天后新建一个工作表:sheets.add after:=sheets(2)
Sheets("VBA吧").delete : 删除名为VBA吧的工作表。
Sheets(2).move: 移动一张工作表,带before 或after参数来指定移到到的位置
Sheet1.copy: 复制sheet1工作表。注意,注意,不参数执行copy方法,是复制sheet1到一个新建一个工作薄。加下before 或after位置参数,是在本工作薄复制表。
Sheet1.protect: 保护工作表,参数自行脑补
工作表还有一些属性和方法,有价值但不那么常用,比如排序,筛选,查找。个人认为没必要去记忆它们,用时随时可通过录宏查阅。
补充:上述方法是对一个表的操作,如果想对多个工作表同时进行操作,如:将sheet1,2,3个表内容另存到一个pdf文件上,那么你就可以:
Sheets(Array("Sheet1", "Sheet2", "Sheet3")).saveas xxx=xxx, xxx=xxx
附言:许多新朋友问怎么学好VBA? 有大佬说得找正经的书系统点学一下,但我告诉各位,书正不正经我不知道,但是学大不可必从0到100。对VBA初学者来说,不知道将来哪个会用得着哪个很少用,看啥啥不敢扔,就怕有遗漏。 对新手来说,学VBA最难的不是做加法,操起哪一本书都能给自己加点儿菜。学习VBA最难的是做减法!这,也是本贴的初衷。
2024年01月15日 12点01分 36
level 11
lxlzmh2002 楼主
[工作薄] 对象属性和方法的常用操作
工作薄对象自身的几种表示方法,参之前楼层。它的常用属性和方法如下:
常用属性:
Workbooks(1).Name : 取第1个工作薄的名字
ThisWorkbook.FullName: 取ThisWorkbook的全名(包括路径和扩展名)
ActiveWorkbook.Path: 取当前工作薄的路径
Workbooks("test").ProtectStructure : 取得test工作薄是否处于表结薄的保护状态
ActiveWorkbook.Saved: 取活动工作薄是否是已经保存状态。已保存状态的工作薄在保存时不会有未内容未保存警告。注Saved只是个可写的状态属性,可以任意更改此属性
ActiveWorkbook.Readonly: 取得活动工作薄是否是只读状态
常用方法:
Workbooks.Open : 打开现有工作薄文件,要约定打开的参数,请自行脑补
Workbooks.Add : 新建一个工作薄文件,新建文件所需参数自行脑补。
Workbooks(1).Activate: 激活第一个工作薄
Workbooks(1).Save : 对第一个工作薄执行保存动作
ActiveWorkbook.SaveAs: 对当前工作薄进行另存为,参数请自行脑补。
Workbooks(1).Close : 关闭第1个工作薄。
Workbooks(1).Protect/UnProect : 对第一个工作薄保护工作薄结构/取消保护工作薄结构,所需参数自行脑补。
Workbooks(1).RefreshAll : 对工作薄所有数据源引用进行刷新,如透视表数据刷新。
2024年01月17日 15点01分 49
level 11
lxlzmh2002 楼主
[Application]对象属性和方法的常用操作
常用属性:
Application.ScreenUpdating : 屏幕刷新属性,值为True时屏显设置为自动刷新,值为False时关闭屏慕自动刷新
- 程序在运行时关闭屏幕刷新,有助于提高代码执行效率
Application.DisplayAlerts : 显示程序警告属性,True/False分别是打开/关闭警告显示
Application.EnableEvents : 启用事件属性,True/False 分别是启用事件和禁用事件
- DisplayAlert和EnableEvents的区别,警告通常是指弹窗的消息提醒,如未保存的文件在关闭时,会有是否要保存的提醒。在DisplayAlert是关闭状态时,关闭未保存的文件,不会有提醒而是直接关闭。Events是指程序运行过程中的事件,如键盘的输入或鼠标操作等等,都会产生相对应的事件。VBA代码可对具体的事件,写相应的代码进行事件处理,当EnableEvents关闭时,事件的处理代码不再会被执行。
Application.Calculation : EXCEL计算设置的属性。
- xlCalculationManual,开启手动计算
- xlCalculationAutomatic,开启自动计算
- xlCalculationSemiautomatic,开启半自动计算,除了表数据不自动算以外其他跟自动计算一样(何为表数据自行脑补)。
- 关闭ScreenUpdating 会提高程序运行效率,这一点吧主在精华贴中亦有讲述。
- 关闭EnableEvents来禁止程序去处理与本代码不相干的事件,亦可以提高效率。
- 很多人会忽略Caculation属性的自动计算对代码效率的影响。同一段代码在不同的表上执行效率不一样,很大可能是因为开着自动计算。如果用户表上有公式存在,VBA代每一次对单元格改动都会引发自动计算。所以,想提高vba运行效率不要忘记关闭自动计算。
Application.OperatingSystem: 该属性取得操作系统的名称
Application.PrintCommunication :该属性打开或关闭打印通讯,如更改打印设置时可用此属性关闭当前通讯
Application.UserName :该属性取得Excel的登录用户名,可用于判断软件使用人
Application.Visible :该属性打开或关闭Excel应用程序的显示窗口,为防止代码在执行时Excel使用人的误操作,关闭Excel的视窗显示也是个不错的选择。
常用方法:
Application.Quit : 退出Excel应用程序
Application.Run :运行VBA代码。同一工作薄下VBA过程间的调用可用call, 如果一个工作薄的宏,调用另一个工作薄的宏可用run
Application.Evaluate:将字符串的文本表达式转化VBA的对象或值,如:
- Evaluate("A1").Value = 99 与 [A1].Value=99等价
Application.Union :将单元格对象进行合并,结果是新的单元格对象
2024年01月21日 02点01分 66
单元格、工作表、工作薄、以及CHART图表对象,都隶属于Application属性。
2024年01月21日 20点01分
level 11
lxlzmh2002 楼主
[Chart]对象属性和方法的常用操作
Chart对象属于Sheets成员,Sheets对象包含工作表和图表工作表。
活动的Chart可以用ActiveChart来引用,当图表工作表(CHART)为活动工作表时,也可以用ActiveSheet来引用,当Chart为嵌入图表时,可以用ChartObjects对象引用。
常用属性:
Chart1.ChartTitile : 返回图表的标题
Chart1.SetSourceData : 返回图表的数据源
Chart1.ChartType : 返回图表的类型
Chart1.ChartStyle : 返回图表的样式
常用方法:
Charts.Add、Add2:创建图表工作表
Chart1.Activate :切换Chart1为活动状态
Chart1.SerialCollection : 反回图表的系列对象
2024年01月22日 03点01分 70
level 11
lxlzmh2002 楼主
[数据字典] 对象属性和方法的常用操作
字典:是Key+Item的集合。Key是具有唯一性的关键字,Item是关键字所对应的值。
创建字典:Set d = CreateObject("Scripting.Dictionary"), 创建一个名字为D的空字典。
常用方法:
d.Add "lx
lz
mh2002", "Excel梦想之家" : 向d字典添加一条关键字是lxlzmh2002, 值为Excel梦想之家的字典纪录。
- 可以简写为: d("lxlzmh2002")="Excel梦想之家"
d.Exists("lxlzmh2002"): 检查d字典是否存在关键字为lxlzmh2002的纪录,返回True或False
d.Remove("lxlzmh2002"): 从d字典上删除关键字为lxlzmh2002的纪录
d.RemoveAll: 清空d字典纪录
d.Keys: 返回d字典的所有关键字,值为数组
d.Items: 返回d字典的所有值,值为数组
常用属性:
d.Count: 返回d字典中纪录的个数
d.Key("lxlzmh2002")="lxlzmh2024": 将d字典的关键字lxlzmh2002更改为新的关键字
d.Item("lxlzmh2002")="Excel梦想之国" : 将d字典上关键字为lxlzmh2002纪录的值更改为新值,简写d("lxlzmh2002")="Excel梦想之国"
字典的item值,可以是单值,也可以是数组,如:
d("lxlzmh2002")=array("Excel梦想之家","Excel梦想之村","Excel梦想之镇")
但是,字典值为多个值并非是一定要用数组,可以让
d("lxlzmh2002")="Excel梦想之家|Excel梦想之村|Excel梦想之镇"
在实际使用时,用split分开:split(d.Key("lxlzmh2002"),"|") - split结果是数组。
字典由于索引的存在,在数据查询上是非常高效的。关于字典的详解,请参阅:https://wenku.baidu.com/view/02b90f2791c69ec3d5bbfd0a79563c1ec5dad776.html
2024年01月22日 04点01分 71
1 2 尾页