3. 再用一个循环把所有源数据填入刚才定义的二维数组,填写规则是,源数据的
整数和小数部分分别对应二维数组的两个下标。例如,“13.51"填到“A(13,51)"
中。
4. 最后顺向或逆向读取二维数组中的非零数据即可得到从小到大或从大到小排列
的数据,而且不会含有重复数据。
用VB 编写的程序如下:
'****密集型数据处理****
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 DiffDataArray()
'读取数据
ReadData
IPmax = 0: IPmin = 1000
DPmax = 0: DPmin = 99
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 0 Then
k = k + 1
Queryp(k) = DiffDataArray(i, j)
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
基于VB和EXCEL的报表设计及打印
在现代管理信息系统的开发中,经常涉及到数据信息的分析、加工,
最终还需把统计结果形成各种形式的报表提供给领导决策参考,或进行外
本文地址:http://www.45fan.com/a/luyou/12334.html