本帖最后由 mxg825 于 2011-12-14 17:22 编辑
Sub MXG825() Dim ARR, CRR, R&, X&, Z1!, JZ!, Z2! 'DIM 声明变量,ARR CRR 是数组,&=Long长整型,=Single 是单精度(有小数) Dim JS1!, JS2!, JS3! R = Range ("B65536").End(xlUp).Row '取得B列有数据的最后一个单元格 行号 Application.ScreenUpdating = False '暂时关闭屏幕刷新 (下面一个 对应 开启) Range ("E1:E" & R).ClearContents '清空 E列数据 ARR = Range ("B1").Resize(R, 4) '数组ARR 赋值= B1 扩展 R行(变量),4列 Range ("A4").Copy '复制A4 单元格 Range ("C1").Resize(R, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd '选择性粘贴到 C列,方式=累加 Range ("C1").Resize(R, 1).Sort Key1:=Range("C1") '对C列进行 排序 从小到大 CRR = Range ("C1:C" & R) '数组ARR 赋值= C列 排序后的数据 Range ("A1").Select '选取A1单元格 JS1 = [A2]: JS2 = [A4]: JS3 = [A6] ' 对几个变量赋值,(基数1,基数2,基数3) For X = 1 To R '开始循环 Z2 = JS1 / (ARR(X, 2) + JS2) ' Z2=基数1/(B列+基数2) Z2 = Int(Z2) + CInt (Int(Z2) = Z2) ' Z2=如果 Z2 是整数时 减-1 Z1 = Z2 * (ARR(X, 2) + JS2) 'Z1= Z2*(B列+基数2) If (JS1 - Z1) <= CRR(1, 1) Then '如果 基数1-Z1 小于等于 CRR 数据中的最小值 ARR(X, 4) = Application.Round((ARR(X, 1) + JS2) / Z2 / JS3 * ARR(X, 3), 5) Else '如果大于 在CRR 数组中 找一个 不大于基数1 - Z1 的最大值 100: JZ = Application.Lookup(JS1 - Z1 - 0.00001, CRR) Z1 = Z1 + JZ If JS1 - Z1 > CRR(1, 1) Then GoTo 100 '加一次还大,再加一次 直到条件不成立 ARR(X, 4) = Application.Round(((ARR(X, 1) + JS2) * (ARR(X, 2) + JS2)) / Z1 / JS3 * ARR(X, 3), 5) End If Next Range ("B1").Resize(R, 4) = ARR '把ARR数组 填充到单元格 Application.ScreenUpdating = True '暂时开启屏幕刷新 (上面一个 对应 关闭) 主要提高速度 End Sub
|