Sub ZZ()
Dim ar, br
ar = Array("析1", "析2", "析3", "析4", "析5", "析6", "析7", "析8", "析9", "析10")
For i = 0 To UBound(ar)
Select Case i
Case 0 To UBound(ar) - 1
With Sheets(ar(i))
.Rows(2).Copy .Rows("3:101")
br = .Rows("3:4")
.Rows("3:101") = br
End With
Case UBound(ar)
With Sheets(ar(i))
.Rows(2).Copy .Rows("201:301")
br = .Rows("201:301")
.Rows("201:301") = br
End With
End Select
Next
End Sub作者: lcctno 時間: 2015-8-24 08:19
Sub ZZ()
Dim ar, br, MyRng
Myrng = sheets("Data" ).[L4] & “:” & sheets("Data" ).[M4] Rem[起始列數]="Data"之L4 [結束列數]="Data"之M4
ar = Array("析1", "析2", "析3", "析4", "析5", "析6", "析7", "析8", "析9", "析10")
For i = 0 To UBound(ar)
Select Case i
Case 0 To UBound(ar) - 1
With Sheets(ar(i))
.Rows(2).Copy .Rows(myrng)
br = .Rows(myrng)
.Rows(myrng) = br
End With
Case UBound(ar)
With Sheets(ar(i))
.Rows(2).Copy .Rows("201:301") Rem 此處如此類推
br = .Rows("201:301")
.Rows("201:301") = br
End With
End Select
Next
End Sub作者: lcctno 時間: 2015-8-24 17:46
透過起行及迄行執行,可超過萬筆copy:
Sub test()
Rem '起行=3,迄行=10000,執行時間:16:13:30~16:47:10
Application.ScreenUpdating = False
lineBegin = Worksheets("Data").Range("I4") '起行
lineEnd = Worksheets("Data").Range("J4") '迄行
For i = 1 To 10
Worksheets("析" & i).Activate
Rows(2).Copy
For j = lineBegin To lineEnd
Rows(j).PasteSpecial Paste:=xlPasteValues
Next
Rem 取消複製模式
Application.CutCopyMode = False
Next
Application.ScreenUpdating = True
End Sub作者: lcctno 時間: 2015-8-25 18:25
Sub copyForNext()
Rem buffer = 999:每1000筆為1個處理單位
Application.ScreenUpdating = False
Call clearRow '清除舊資料
buffer = 999
lineBegin = Worksheets("Data").Range("I4") '起行
lineEnd = Worksheets("Data").Range("J4") '迄行
For i = 1 To 10
Worksheets("析" & i).Activate
Rows(2).Copy
For j = lineBegin To lineEnd
k = j + buffer
Rows(j & ":" & k).Select
Selection.PasteSpecial Paste:=xlPasteAll
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
j = k
Next
Rem 取消複製模式
Application.CutCopyMode = False
Next
Application.ScreenUpdating = True
End Sub
Sub clearRow()
Worksheets(Array("析1", "析2", "析3", "析4", "析5", "析6", "析7", "析8", "析9", "析10")).Select
Rows("3:" & Rows.Count).Select
Selection.Clear
'以下動作,只是清除先前的選擇,以免人工要去取消選擇。
Range("A1").Select '目的:先前選擇區域的反影,只留選擇"A1"之儲存格
Worksheets("析1").Select '目的:先前選擇十個工作表,只留一個選擇"析1"之工作表
End Sub
For i = 1 To 10
Worksheets("析" & i).Activate
Rows(2).Copy
For j = lineBegin To lineEnd
k = j + buffer - 1
Rows(j & ":" & k).Select
Selection.PasteSpecial Paste:=xlPasteAll
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
j = k
Next
Rem 取消複製模式
Application.CutCopyMode = False
Next
Application.ScreenUpdating = True
'歸位並結束Sub
Sheets("Data").Select
End Sub作者: lpk187 時間: 2015-8-27 23:11
Sub 分析()
Dim Srr, Sht As Worksheet, Arr, Brr, Crr, X, Y, Z, R, TM
Dim i&, j&, k%, M, Mrr(1 To 2560, 1 To 2), S&, SU&
TM = Timer
R = [data!C65536].End(xlUp).Row
Arr = [Data!C1:D1].Resize(R)
X = [Data!I4]: If X < 2 Then X = 2
Y = [Data!J4]: If Y > R Then Y = R
Z = Y - X + 1: If Z <= 0 Then Exit Sub
ReDim Crr(X To Y, 1 To 256)
Application.ScreenUpdating = False
For i = 1 To 10
Set Sht = Sheets("析" & i)
Brr = Sht.Rows(1)
For k = 1 To 256
M = M + 1
For j = X To Y
If Brr(1, k) <= Arr(j, 1) And Brr(1, k) >= Arr(j, 2) Then S = 1
Crr(j, k) = S: SU = SU + S: S = 0
Next j
Mrr(M, 1) = Brr(1, k): Mrr(M, 2) = SU: SU = 0
Next k
Sht.UsedRange.Offset(1, 0).ClearContents
With Sht.[A2].Resize(Z, 256)
Sht.Rows(2).Copy .Cells
.Value = Crr
End With
Next i
Sub 分析()
Dim Arr, Brr, Cunt&, Crr%(), R&, X&, Y&, TM, j%, k&, SU%
TM = Timer
R = [data!C65536].End(xlUp).Row
Arr = [Data!C1:D1].Resize(R)
X = Val([Data!I6]): If X < 2 Then X = 2
Y = Val([Data!J6]): If Y > R Then Y = R
If Y <= X Then Exit Sub
Cunt = 2560
ReDim Crr(1 To Cunt, 0)
Brr = [結果!A3].Resize(Cunt)
For j = 1 To Cunt
For k = X To Y
'If Brr(j, 1) >= Arr(k, 2) And Brr(j, 1) <= Arr(k, 1) Then SU = SU + 1 '判斷兩次,速度較慢
If Brr(j, 1) >= Arr(k, 2) Then If Brr(j, 1) <= Arr(k, 1) Then SU = SU + 1 '第一條件成立再判斷第二條件,較快
Next k
Crr(j, 0) = SU: SU = 0
Next j
[結果!B3].Resize(Cunt).Value = Crr
Application.Goto [結果!B3]
MsgBox Timer - TM
End Sub作者: lcctno 時間: 2015-8-29 21:45
計算不一致的地方是 [Data!D4960] 8550.60,比對 [結果!A1917] 的 8550.60
剛好是在比對的 邊界值 而造成浮點算數的問題
假如 VBA 程式的比較式做一個處理就可以了
Sub 分析發生次數()
Dim Arr, Brr, Cunt&, Crr%(), R&, X&, Y&, TM, j%, k&, SU%
Const Zero = 0.00000001 '這是一個很小而不影響 "實用上的精度" 的數值
..............
..........
' If Brr(j, 1) >= Arr(k, 2) Then If Brr(j, 1) <= Arr(k, 1) Then SU = SU + 1
'改為 :
If Brr(j, 1) >= Arr(k, 2) - Zero Then If Brr(j, 1) <= Arr(k, 1) + Zero Then SU = SU + 1
本來穿褲子(公式)嫌慢,改成裙子(vba)較快些,
現在想褲子再穿搭裙子,問題又回到原點,
公式範圍第一格留公式,其下複製後再貼成值(以55樓範例檔為準):
Sub 更新公式()
With [結果1!B4:B2562]
[結果1!B3].Copy .Cells
.Value = .Value
End With
End Sub
這樣只有第一格公式會影響運作∼∼
或如下:
Sub 更新公式2()
With [結果1!B3:B2562]
.Formula = "=IF(A3="""","""",SUMPRODUCT((A3<=資料列_最高價)*(A3>=資料列_最低價)))"
.Value = .Value
End With
End Sub