Chuyển đổi Công thức tính toán từ Recoder Marco sang Vòng lặp giúp (1 người xem)

  • Thread starter Thread starter phanPNJ
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

phanPNJ

Thành viên mới
Tham gia
2/1/16
Bài viết
7
Được thích
3
Mong anh em trong GPE ai giúp chuyển từ công thức qua dạng vòng lặp để tính toán cho nhanh giúp.
Điểm khác biệt trong các công thức đã được chuyển thành màu đỏ.
Xin chân thanh cảm ơn.
Mã:
Sub PPM_0805()
    Application.ScreenUpdating = False
    ThisWorkbook.Worksheets("Flow").Range("I2").Select
    Range("[COLOR=#ff0000][B]I3[/B][/COLOR]").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[B][COLOR=#ff0000][-3][/COLOR][/B])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("[COLOR=#ff0000][B]I4[/B][/COLOR]").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[B][COLOR=#ff0000][-2][/COLOR][/B])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("[COLOR=#ff0000][B]I5[/B][/COLOR]").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[B][COLOR=#ff0000][-1][/COLOR][/B])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I6").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C)/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I7").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[1])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I8").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[2])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I9").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[3])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I10").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[4])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I11").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[5])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I12").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[6])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I13").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[7])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I14").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[8])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I15").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[9])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I16").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[10])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I17").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[11])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I18").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[12])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I19").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[13])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I20").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[14])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I21").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[15])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I22").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[16])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I23").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[17])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I24").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[18])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I25").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[19])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I26").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[20])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I27").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[21])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I28").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[22])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I29").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[23])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I30").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[24])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I31").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[25])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I32").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[26])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I33").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[27])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I34").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[28])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I35").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[29])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I36").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[30])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I37").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[31])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I38").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[32])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I39").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[33])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I40").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[34])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I41").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[35])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I42").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[36])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I43").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[37])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I44").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[38])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I45").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[39])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I46").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[40])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I47").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[41])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I48").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[42])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I49").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[43])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I50").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[44])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I51").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[45])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I52").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[46])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    Range("I53").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[47])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
        Range("I54").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(SUMIF(CHP!C[49],Flow!R2C9,CHP!C[48])/SUMIF(CHP!C[49],Flow!R2C9,CHP!C[-5])*1000000,""-"")"
    
Range("I3:I55").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    
    ThisWorkbook.Worksheets("Flow").Range("I2").Select
    ActiveWorkbook.Save
    Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Bạn dùng thử đoạn này:

i = -4
Icol = 9
For Irow = 3 To 54
k = Cells(Irow, Icol).Address
ThisWorkbook.Worksheets("Flow").Range(k).Activate
ActiveCell.FormulaR1C1 = _
"=IFERROR(SUMIF(CHP!C[48],Flow!R2C10,CHP!C[" & i & "])/SUMIF(CHP!C[48],Flow!R2C10,CHP!C[-6])*1000000,""-"")"
i = i + 1
Next Irow
 
Upvote 0
Mong anh em trong GPE ai giúp chuyển từ công thức qua dạng vòng lặp để tính toán cho nhanh giúp.
Điểm khác biệt trong các công thức đã được chuyển thành màu đỏ.
Xin chân thanh cảm ơn.
Thử nhập công thức này vào ô I3 rồi copy xuống các ô dưới xem.
Mã:
=IFERROR(SUMIF(CHP!BF:BF,Flow!$I$2,INDIRECT("CHP!C"&ROW(A6),0))/SUMIF(CHP!BF:BF,Flow!$I$2,CHP!D:D)*1000000,"-")
 
Upvote 0
PHP:
Sub PPM_0805()
    Application.ScreenUpdating = False
    For i = 3 To 55
    Sheets("Flow").Cells(i, 9) = Application.SumIf(Sheets("CHP").Range("BF:BF"), Sheets("Flow").Cells(2, 9), Sheets("CHP").Columns(i + 3)) / Application.SumIf(Sheets("CHP").Range("BF:BF"), Sheets("Flow").Cells(2, 9), Sheets("CHP").Columns(4)) * 1000000
    Next
    ActiveWorkbook.Save
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Mong anh em trong GPE ai giúp chuyển từ công thức qua dạng vòng lặp để tính toán cho nhanh giúp.
...

Dạng vòng lặp tính toán nhanh?
Thực ra, code đủ mấy chục lần như thế mới nhanh, bởi vì:
1. Code không phải rẽ nhánh như vòng lặp.
2. Công thức gán là chuỗi literal, code chỉ việc ghép vào, không cần phải tính toán.
Chỉ hiếm chỗ code cứ phải select từ range này sang range khác, và chọn range theo địa chỉ thì có hơi phiền.
Chỉ cần đổi Range thành Cells(dòng, cột) thì được. Theo lý thuyết, tính bằng chỉ số nhanh hơn địa chỉ.
 
Upvote 0
Dạng vòng lặp tính toán nhanh?
Thực ra, code đủ mấy chục lần như thế mới nhanh, bởi vì:
1. Code không phải rẽ nhánh như vòng lặp.
2. Công thức gán là chuỗi literal, code chỉ việc ghép vào, không cần phải tính toán.
Chỉ hiếm chỗ code cứ phải select từ range này sang range khác, và chọn range theo địa chỉ thì có hơi phiền.
Chỉ cần đổi Range thành Cells(dòng, cột) thì được. Theo lý thuyết, tính bằng chỉ số nhanh hơn địa chỉ.
Đúng là như thế, nhưng theo tôi thì cái gì ngắn gọn và khoa học thì làm, nhanh chậm chút ít chưa hẳn là vấn đề, quan trọng là quản lý và kiểm soát tốt những gì mình làm. Trường hợp đặt ra không phải chỉ bấy nhiêu dữ liệu mà thực tế cho thấy dữ liệu luôn được cập nhật liên tục. Cần phải có một cách quản lý khoa học, phù hợp! (Chứ code kiểu #1 tôi nghĩ không nên để vậy!)
 
Upvote 0
Đúng là như thế, nhưng theo tôi thì cái gì ngắn gọn và khoa học thì làm, nhanh chậm chút ít chưa hẳn là vấn đề, quan trọng là quản lý và kiểm soát tốt những gì mình làm. Trường hợp đặt ra không phải chỉ bấy nhiêu dữ liệu mà thực tế cho thấy dữ liệu luôn được cập nhật liên tục. Cần phải có một cách quản lý khoa học, phù hợp! (Chứ code kiểu #1 tôi nghĩ không nên để vậy!)

Tôi cốt ý cảnh báo chủ thớt. Cái chủ thớt muốn không phải để tính cho nhanh.
Thâu ngắn code lại thì code mềm dẻo hơn, dễ sửa và dễ kiểm soát. Mềm dẻo không hề liên quan đến tính toán nhanh hay chậm. Thậm chí code mềm có thể chậm hơn code cứng 1 chút.
 
Upvote 0
Tôi cốt ý cảnh báo chủ thớt. Cái chủ thớt muốn không phải để tính cho nhanh.
Thâu ngắn code lại thì code mềm dẻo hơn, dễ sửa và dễ kiểm soát. Mềm dẻo không hề liên quan đến tính toán nhanh hay chậm. Thậm chí code mềm có thể chậm hơn code cứng 1 chút.

Vâng,
Xin cảm ơn bạn.
Do code dài quá nếu để vậy khó chỉnh sửa.
Xin cảm ơn.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom