45IT.COM- 电脑学习从此开始!
DIY硬件教程攒机经验装机配置
设计Photoshop网页设计特效
系统注册表DOS系统命令其它
存储主板显卡外设键鼠内存
维修显卡CPU内存打印机
WinXPVistaWin7unix/linux
CPU光驱电源/散热显示器其它
修技主板硬盘键鼠显示器光驱
办公ExcelWordPowerPointWPS
编程数据库CSS脚本PHP
网络局域网QQ服务器
软件网络系统图像安全

各种Excel VBA的命令大全(3)

电脑软硬件应用网 45IT.COM 时间:2014-05-01 15:56 作者:佚名

 
End If
Next j
Next i
kMax = k
ReDim Preserve Queryp(kMax)
该方法对于本人遇到的这种“密集型”数据最为有效,但是如果遇上“稀疏型”数
据,例如最大、最小值相差几千,甚至上万的数据,就没什么优势了,而且会占用
较大的内存。
经过改进,我得到了处理稀疏型数据的高效算法。高效的前提条件同样是源数据具
有大量相同数据。思路是在前一种方法的基础上增加一个单维数组,用来保存整数
部分数据,保存过程中用插入法对其进行排序。因为有大量重复数据,要排序的数
据量相对较少。当从二维数组中读取数据时,用单维数组代入二维数组的第一个下
标,具体代码下:
'****稀疏型数据处理****
Dim i As Long, j As Long, k As Long, kMax As Long

Dim Queryp() As Single
ReDim Queryp(Amount)
Dim IntegerPart As Integer, DecimalPart As Integer
Dim IPmax As Integer, IPmin As Integer
Dim DPmax As Integer, DPmin As Integer
Dim IPArray() As Integer, IPAamount As Integer
ReDim IPArray(Amount)
Dim DiffDataArray()
'读取数据

ReadData
IPmax = 0: IPmin = 1000
DPmax = 0: DPmin = 99
IPAamount = 0
For i = 1 To Amount
'获取整数和小数部分的最大最小值
IntegerPart = Int(sData(i))
DecimalPart = (sData(i) - IntegerPart) * 100
If IntegerPart > IPmax Then
IPmax = IntegerPart
ElseIf IntegerPart DPmax Then
DPmax = DecimalPart
ElseIf DecimalPart IPArray(j) Then
IPAamount = IPAamount + 1
For k = IPAamount To j + 1 Step -1
IPArray(k) = IPArray(k - 1)
Next k
IPArray(j) = IntegerPart
Exit For
ElseIf IntegerPart = IPArray(j) Then
Exit For
End If
Next j
If j > IPAamount Then
IPAamount = IPAamount + 1
IPArray(IPAamount) = IntegerPart

End If
Next i
ReDim DiffDataArray(IPmin To IPmax, DPmin To DPmax)
'填入数据
For i = 1 To Amount
IntegerPart = Int(sData(i))
DecimalPart = (sData(i) - IntegerPart) * 100
DiffDataArray(IntegerPart, DecimalPart) = sData(i)
Next i
'提取数据
k = 0
For i = 1 To IPAamount
For j = DPmax To DPmin Step -1
If DiffDataArray(IPArray(i), j) 0 Then
k = k + 1
Queryp(k) = DiffDataArray(IPArray
(i), j)
End If
Next j
Next i
kMax = k
ReDim Preserve Queryp(kMax)
k
ReDim Preserve Queryp(kMax)

自动隐藏表格中无数据的行
表1 是数据源,经常改变;
表2 引用表1 中某列有数据的单元格(利用动态位址已实现。)
由于表1 的改变,表2 的大小随之而变。
问题:如何实现表2 中没有数据的行(有公式)自动隐藏?谢谢赐教!
Sub abc()
For i = 1 To 300
If Cells(i, 1).value = "" Then Rows(i).Hidden = True
Next i
End Sub
你写的语句可以解决隐藏的问题,可是如果我执行了它之后,再在表1中增加数据,

表2不会自动显示有了数据的行。如何修改?
将此宏设为自动运行(打开文件时)
Sub abc()
For i = 1 To 300
If Cells(i, 1).value "" Then Rows(i).Hidden = false
Next i
End Sub

用VBA如何自动合并列的内容?
用VBA如何自动合并列的内容?
To hongjian :
Sub MergeTest()
For i = 3 To 30
Cells(i, 3) = Cells(i, 1) & Chr(10) & Cells(i, 2)
Next
End Sub

1)创建Excel对象
Excel对象模型包括了128个不同的对象,从矩形、文本框等简单的对
象到透视表,图表等复杂的对象。下面简单介绍一下其中最重要,也是用
得最多的五个对象。

(1)Application对象
Application对象处于Excel对象层次结构的顶层,表示 Excel自身的
运行环境。

(2)Workbook对象
Workbook对象直接地处于Application对象的下层,表示一个Excel工
作薄文件。

(3)Worksheet对象
Worksheet对象包含于Workbook对象,表示一个Excel工作表。

(4)Range对象
Range对象包含于Worksheet对象,表示 Excel工作表中的一个或多个
单元格。

(5)Cells对象
Cells对象包含于Worksheet对象,表示Excel工作表中的一个单元格。
如果要启动一个Excel,使用Workbook和Worksheet对象,下面的代码
启动了Excel并创建了一个新的包含一个工作表的工作薄:
Dim zsbexcel As Excel.Application
Set zsbexcel = New Excel.Application
zsbexcel.Visible = True
如要Excel不可见,可使zsbexcel.Visible = False
zsbexcel.SheetsInNewWorkbook = 1
Set zsbworkbook = zsbexcel.Workbooks.Add

2)设置单元格和区域值
要设置一张工作表中每个单元格的值,可以使用Worksheet对象的
Range属性或Cells属性。
With zsbexcel.ActiveSheet
.Cells(1, 2).value = "100"
.Cells(2, 2).value = "200"
.Cells(3, 2).value = "=SUM(B1:B2)"
.Range("A3:A9") = "中国人民解放军"
End With
要设置单元格或区域的字体、边框,可以利用Range对象或Cells对象
的Borders属性和Font属性:
With objexcel.ActiveSheet.Range("A2:K9").Borders  '边框设置
.Line = xlBorderLine
.Weight = xlThin
.ColorIndex = 1
End With
With objexcel.ActiveSheet.Range("A3:K9").Font  '字体设置

 
.Size = 14
.Bold = True
.Italic = True
.ColorIndex = 3
End With

通过对Excel单元格和区域值的各种设置的深入了解,可以创建各种复
杂、美观、满足需要的、具有自己特点的报表。

3)预览及打印

生成所需要的工作表后,就可以对EXCEL发出预览、打印指令了。

zsbexcel.ActiveSheet.PageSetup.Orientation = xlPortrait   '
设置打印方向
zsbexcel.ActiveSheet.PageSetup.PaperSize = xlPaperA4   '
设置打印纸的打下
zsbexcel.Caption = "打印预览"        '设置预览窗口的
标题
zsbexcel.ActiveSheet.PrintPreview      '打印预览
zsbexcel.ActiveSheet.PrintOut        '打印输出

通过打印方向、打印纸张大小的设置,不断进行预览,直到满意为止,
最终进行打印输出。

为了在退出应用程序后EXCEL不提示用户是否保存已修改的文件,需使
用如下语句:

zsbexcel.DisplayAlerts = False
zsbexcel.Quit    '退出EXCEL
zsbexcel.DisplayAlerts = True

如此设计的报表打印是通过 EXCEL程序来后台实现的。对于使用者来
说,根本看不到具体过程,只看到一张张漂亮的报表轻易地被打印出来了。

4)具体实例

下面给出一个具体实例,它在window98、Visual Basic 6.0、
Microsoft Office97的环境下调试通过。

在VB中启动一个新的Standard EXE工程,在“工程”菜单的“引用”
选项下引用Excel Object Library;然后在Form中添加一个命令按钮
cmdExcel;最后在窗体中输入如下代码:

Dim zsbexcel As Excel.Application
Private Sub cmdExcel_Click()
Set zsbexcel = New Excel.Application
zsbexcel.Visible = True
zsbexcel.SheetsInNewWorkbook = 1
Set zsbworkbook = zsbexcel.Workbooks.Add
With zsbexcel.ActiveSheet.Range("A2:C9").Borders   '边框设置
.Line = xlBorderLine
.Weight = xlThin
.ColorIndex = 1
End With
With zsbexcel.ActiveSheet.Range("A3:C9").Font  '字体设置
.Size = 14
.Bold = True
.Italic = True
.ColorIndex = 3
End With
zsbexcel.ActiveSheet.Rows.HorizontalAlignment =
xlVAlignCenter   '水平居中

zsbexcel.ActiveSheet.Rows.VerticalAlignment =
xlVAlignCenter    '垂直居中

With zsbexcel.ActiveSheet
.Cells(1, 2).value = "100"
.Cells(2, 2).value = "200"
.Cells(3, 2).value = "=SUM(B1:B2)"
.Cells(1, 3).value = "中国人民解放军"
.Range("A3:A9") = "50"
End With
zsbexcel.ActiveSheet.PageSetup.Orientation = xlPortrait    '
xlLandscape
zsbexcel.ActiveSheet.PageSetup.PaperSize = xlPaperA4
zsbexcel.ActiveSheet.PrintOut
zsbexcel.DisplayAlerts = False
zsbexcel.Quit
zsbexcel.DisplayAlerts = True
Set zsbexcel = Nothing

提高EXCEL中VBA的效率

方法1:尽量使用VBA原有的属性、方法和Worksheet函数
由于Excel对象多达百多个,对象的属性、方法、事件多不胜数,对于初学者来

说可能对它们不全部了解,这就产生了编程者经常编写与Excel对象的属性、方法相

同功能的VBA代码段,而这些代码段的运行效率显然与Excel对象的属性、方法完成

任务的速度相差甚大。例如用Range的属性CurrentRegion来返回 Range 对象,该对

象代表当前区。(当前区指以任意空白行及空白列的组合为边界的区域)。同样功能

的VBA代码需数十行。因此编程前应尽可能多地了解Excel对象的属性、方法。
充分利用Worksheet函数是提高程序运行速度的极度有效的方法。如求平均工资

的例子:For Each c In Worksheet(1).Range(″A1:A1000″)
Totalvalue = Totalvalue + c.value
Next
Averagevalue = Totalvalue / Worksheet(1).Range(″

A1:A1000″).Rows.Count
而下面代码程序比上面例子快得多:
Averagevalue="/blog/Application.WorksheetFunction.Average(Worksheets
(1).Range(″A1:A1000″))
其它函数如Count,Counta,Countif,Match,Lookup等等,都能代替相同功能的

VBA程序代码,提高程序的运行速度。

方法2:尽量减少使用对象引用,尤其在循环中
每一个Excel对象的属性、方法的调用都需要通过OLE接口的一个或多个调用,

这些OLE调用都是需要时间的,减少使用对象引用能加快VBA代码的运行。例如
1.使用With语句。
Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.Name=″Pay″
Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.Font

...
则以下语句比上面的快
With Workbooks(1).Sheets(1).Range(″A1:A1000″).Font
.Name = ″Pay″
.Font = ″Bold″
...
End With
2.使用对象变量。
如果你发现一个对象引用被多次使用,则你可以将此对象用Set 设置为对象变

量,以减少对对象的访问。如:
Workbooks(1).Sheets(1).Range(″A1″).value = 100
Workbooks(1).Sheets(1).Range(″A2″).value = 200
则以下代码比上面的要快:
Set MySheet = Workbooks(1).Sheets(1)
MySheet.Range(″A1″).value = 100
MySheet.Range(″A2″).value = 200
3.在循环中要尽量减少对象的访问。
For k = 1 To 1000
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: baidushare.htm
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐知识