两天帮朋友写了个VBA小程序,自我感觉不错。有些小东西记录下:
一、关于工作表隐藏:
Sheet1.Visible有三个属性,xlSheetVisible是显示,xlSheetHidden是隐藏,xlSheetVeryHidden也是隐藏,和xlSheetHidden的区别是用xlSheetVeryHidden隐藏的只能在VBA里打开,从菜单里都不能取消隐藏了。
因此,在Sub Workbook_Open()和Sub Workbook_BeforeClose(Cancel As Boolean)里可以动脑筋了。
顺便说句:在Sub Workbook_BeforeClose(Cancel As Boolean)里如果ThisWorkbook.Save,则关闭工作簿时自动保存,不会再弹出对话框提示是否保存了;如果设置了cancel=true,哈哈,关不了EXCEL了。
二、关于多种方法引用单元格:
1、关于range的:
Range("h1", "i8").Clear '这是标准的范围引用
range("h1") '是个简写,实际上只引用了一个单元格,这个时候和用cells效果差不多了
Range("h" & 1) = "学校" 'Range("h" & 1)等价于range("h1") ,不过里面可以用变量,更灵活,如把1换成某变量……
Range("h2:h5,h8:h10").Select '不相邻的多个范围引用,这里是多个单元格区域
Range("3:5,11:13").Select '不相邻的多个范围引用,这里是多行(3、4、5、11、12、13)
range("b:c,g:h").select '只用了range的左上角参数。range(左上角单元格地址字符串,右下角单元格地址字符串)
Range("b:c", "g:h").Select '用到了两个参数,表示range范围的左上角为B到C列,右下角为G到H列,结果从B到H全选了
2、关于cells的:
Cells(1, "h").Font.Bold = true '一个格子,cells(行号,列号),里面参数和range是相反的。
Cells(1, 8).Font.Color = vbBlue '列号也可以用数字,方便吧?全都可以用变量来循环了
Cells(264).Font.Underline = True '这种方法很怪异,其实EXCEL第一行是只能有256个格子啊,264就是第2行的第8个格子,因此Cells(264)等价于Cells(2, 8)
3、关于整行整列引用:
rows("3:5").select
columns("b:c").select
还有上面提到的Range("3:5,11:13").Select
4、比较特殊的:
[H1].Font.Italic = True '直接引用某个格子
三、整体设置单元格范围的格式
Sheet1.Columns("H:J").Select
With Selection
HorizontalAlignment = xlLeft
VerticalAlignment = xlCenter
WrapText = False '自动换行
ShrinkToFit = False '缩小字体填充
MergeCells = False '合并单元格
Font.Size = 11
End With
明白没?其实就是要先把一个范围select,然后对Selection设置各个属性了。
还可以这样做:Range("I3:J" & jgrows).Interior.Color = RGB(128, 128, 255),直接对某单元格范围来设置属性。
不过下面这两个属性不能在Selection里设置,必须用columns
Columns("H:J").Borders.LineStyle = 0 '边框样式,好象有1-15种,0表示取消边框线
Columns("H:J").Interior.ColorIndex = 0 '单元格背景色,有51种吧好象,或者55种?0就是无
四、Range(firstnotfound).Select '这里的firstnotfound是个字符串变量,内容可能是"h1"或者"h1:j10"之类的,该语句的结果实际上是真的选种了那些单元格,当程序停止运行时可以用这样的句子选择某些单元格提示用户去操作那些单元格内的数据。
五、Range("j5").Value = Application.WorksheetFunction.CountIf(Columns("H"), "哈哈")
这句很有意思啊,可以用Application.WorksheetFunction在VBA里调用单元各公式里的那些函数。如sum、count、countif什么的。
看吧,我写的这句:
Range("j" & jgrows).Value = Range("J2").Value - Application.WorksheetFunction.Sum(Range("j3:j" & (jgrows - 1)))
把sum统计的结果和J2单元格相减以后结果放到j列的某格。
六、最后,我做了个窗口,让它不能关闭,只能收缩面板到右边去停放,也可以点按扭展开:
Private Sub CommandButton3_Click() '展开面板,并把它的位置放到EXCEL中间
With UserForm1
Width = 560
Height = 506
Left = (Application.Width - 560) / 2 '本来想考虑这里当EXCEL窗口宽度比560还小时会不会出问题的,后来发现那面板可以到屏幕外面去(left可以小于0),呵呵,省心了
Top = 38
End With
End Sub
Private Sub CommandButton4_Click() '收缩面板,并把它放到EXCEL右边
With UserForm1
Width = 120
Top = 38
Left = Application.Width - Width - 20
End With
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)'屏蔽窗体的关闭按扭,让这个按扭等价于收缩面板
With UserForm1
Width = 120
Top = 38
Left = Application.Width - Width - 20
End With
Cancel = True '关键就靠这句让关闭无效
End Sub