Hàm Max trong VBA

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Chi tiết em gửi file đính kèm, Nhờ anh chị giúp đỡ ah. Em cảm ơn

Em có một file đính kèm nếu dùng max trong Excel để tính thì em đã làm được
Nhưng ko biết nếu giờ dùng Max trong VBA thì code thể hiện như thế nào ah

Sub Max()
Dim Rng As Range, i As Long
With Sheets("sheet1")
Rng = .Range(.[C7].End(xlDown).Row)
For i = 7 To UBound(Rng)
i = i + 1
If Rng(i, 4) <> 0 Then

Application.WorksheetFunction.Max ([D5].Value + Sum(.Range("D7:D" & i + 7)) - Sum(.Range("E7:E" & i + 7)) - [E5].Value)
End If
End With
End Sub

Em viết kiểu thế này hướng có được ko anh
Chi tiết em gửi file đính kèm, Nhờ anh chị giúp đỡ ah. Em cảm ơn

Thử vầy đi nha

Sub abc()
Dim Fr, Lr, r, rng1, rng2
Fr = 7: Lr = .End(3).Row
For r = Fr To Lr
rng1 = Application.Sum(Range("D7:D" & r))
rng2 = Application.Sum(Range("E7:E" & r))
Cells(r, 6) = + rng1 – rng2 –
Next
End Sub

www.giaiphapexcel.com/diendan/threads/h%C3%A0m-max-trong-vba.95900/

Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ
Khóa học SprinGO phù hợp

Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ

Con người là một trong những yếu tố quan trọng của công ty, là tài sản quý giá của doanh nghiệp. Chính vì thế,...

Xem khóa học
★★★★★ 5 ★ 1 👤 6 ▥ 0
Quảng cáo

Bạn nên đọc

6 Responses

  1. hands says:

    Thử vầy đi nha

    Sub abc()
    Dim Fr, Lr, r, rng1, rng2
    Fr = 7: Lr = .End(3).Row
    For r = Fr To Lr
    rng1 = Application.Sum(Range("D7:D" & r))
    rng2 = Application.Sum(Range("E7:E" & r))
    Cells(r, 6) = + rng1 – rng2 –
    Next
    End Sub

    Em test đã ok
    nếu vẫn đề bài như thế, bây h em muốn lấy số dư đó nhưng ở sheet thứ hai thi thế nào hả anh ( em chỉ hỏi phần số dư thôi anh nhé)
    Em cảm ơn anh

    Thọt lét cái.
    Chạy code đó thì còn gì là Max? số âm nó cũng thành âm………..
    Ké vào 1 Sub cho vui chớ hổng biết trúng trật

    Public Sub MaxXXX()
    Dim Rng As Range, Cll As Range, Tem As Double
    Set Rng = Range([C7], [C50000].End(xlUp))
    Tem = [D5].Value
    For Each Cll In Rng
        Tem = Tem + Cll.Offset(, 1) - Cll.Offset(, 2)
        Cll.Offset(, 3) = IIf(Tem > 0, Tem, 0)
        Cll.Offset(, 4) = IIf(Tem < 0, Abs(Tem), 0)
    Next Cll
    Set Rng = Nothing
    End Sub
  2. hands says:

    Thọt lét cái.
    Chạy code đó thì còn gì là Max? số âm nó cũng thành âm………..
    Ké vào 1 Sub cho vui chớ hổng biết trúng trật

    Public Sub MaxXXX()
    Dim Rng As Range, Cll As Range, Tem As Double
    Set Rng = Range([C7], [C50000].End(xlUp))
    Tem = [D5].Value
    For Each Cll In Rng
        Tem = Tem + Cll.Offset(, 1) - Cll.Offset(, 2)
        Cll.Offset(, 3) = IIf(Tem > 0, Tem, 0)
        Cll.Offset(, 4) = IIf(Tem < 0, Abs(Tem), 0)
    Next Cll
    Set Rng = Nothing
    End Sub

    ah, vâng, "Thầy nhắc em mới để ý, nếu vậy trường hợp âm thì phải có max(a,0) thì công thức trên chưa đúng ah
    Công thức của Thầy đã khắc phục được số âm ah,
    Ở bài 7 em có nêu, nếu h em để số dư ở sheet thứ hai thì sửa thế nào ah
    em cảm ơn thấy nhiều

    Cái dòng Tem=.Value nếu viết đầy đủ phải là Tem=Sheet1..Value
    Bạn tự "ngâm kiếu" đi.

  3. hands says:

    Cái dòng Tem=.Value nếu viết đầy đủ phải là Tem=Sheet1..Value
    Bạn tự "ngâm kiếu" đi.

    Dạ vâng, em sẽ ngâm ah, em nghĩ mình có thể sửa được, cảm ơn thấy nhiều ah

    Ai biểu cung cấp dữ liệu bèo nhèo có 3 dòng thì chơi theo 3 dòng. Nói rồi mà, tối thiểu 3 bài trả lời cho 1 câu hỏi. Anh không thấy thắm thoát mà em đã lên 4 sao rồi đó ư?

  4. hands says:

    .

    Cảm ơn thầy và anh Quang Hải, em đã làm được rồi ah

    Sub Hung()
    Dim Rng(), i As Long, KQ(1 To 10000, 1 To 7), k As Long
    Dim  Tem As Double
    With Sheets("Sheet1")
    Rng = .Range(.[C7], .[C50000].End(xlUp)).Resize(, 4).Value2
    End With
    With Sheets("Sheet2")
        Tem = .[D5].Value
    
    .Range("C7:G10").ClearContents
       k = 0
    For i = 1 To UBound(Rng)
        If Rng(i, 2) = .Range("E3").Value2 Then
            k = k + 1
            KQ(k, 1) = Rng(i, 1)
            KQ(k, 2) = Rng(i, 3)
            KQ(k, 3) = Rng(i, 4)
            Tem = Tem + KQ(k, 2) - KQ(k, 3)
            KQ(k, 4) = IIf(Tem > 0, Tem, 0)
            KQ(k, 5) = IIf(Tem < 0, Abs(Tem), 0)
         End If
         If k Then
        .Range("C7").Resize(k, 7).Value = KQ
        End If
    Next
    End With
    End Sub

    Giữ nguyên các tên biến của bạn.
    Túm gọn lại một chút đi kẻo có người bảo "chướng chướng"

    Public Sub Hung()
    Dim Rng(), KQ(), I As Long, Tem As Double, Ma As String, K As Long
    With Sheet1
        Rng = .Range(.[C7], .[C50000].End(xlUp)).Resize(, 4).Value
    End With
    ReDim KQ(1 To UBound(Rng, 1), 1 To 5)
    With Sheet2
        Tem = .[D5].Value
        Ma = UCase(.[E3])
        For I = 1 To UBound(Rng, 1)
            If UCase(Rng(I, 2)) = Ma Then
                K = K + 1
                Tem = Tem + Rng(I, 3) - Rng(I, 4)
                    KQ(K, 1) = Rng(I, 1)
                    KQ(K, 2) = Rng(I, 3)
                    KQ(K, 3) = Rng(I, 4)
                KQ(K, 4) = IIf(Tem > 0, Tem, 0)
                KQ(K, 5) = IIf(Tem < 0, Abs(Tem), 0)
            End If
        Next I
        .[C7:G1000].ClearContents
        If K Then .[C7].Resize(K, 5) = KQ
    End With
    End Sub
  5. hands says:

    Giữ nguyên các tên biến của bạn.
    Túm gọn lại một chút đi kẻo có người bảo "chướng chướng"

    Public Sub Hung()
    Dim Rng(), KQ(), I As Long, Tem As Double, Ma As String, K As Long
    With Sheet1
        Rng = .Range(.[C7], .[C50000].End(xlUp)).Resize(, 4).Value
    End With
    ReDim KQ(1 To UBound(Rng, 1), 1 To 5)
    With Sheet2
        Tem = .[D5].Value
        Ma = UCase(.[E3])
        For I = 1 To UBound(Rng, 1)
            If UCase(Rng(I, 2)) = Ma Then
                K = K + 1
                Tem = Tem + Rng(I, 3) - Rng(I, 4)
                    KQ(K, 1) = Rng(I, 1)
                    KQ(K, 2) = Rng(I, 3)
                    KQ(K, 3) = Rng(I, 4)
                KQ(K, 4) = IIf(Tem > 0, Tem, 0)
                KQ(K, 5) = IIf(Tem < 0, Abs(Tem), 0)
            End If
        Next I
        .[C7:G1000].ClearContents
        If K Then .[C7].Resize(K, 5) = KQ
    End With
    End Sub
    Sub Hung()
    Dim Rng(), KQ(), I As Long, Tem As Double, Ma As String, K As Long
    With Sheet1
        Rng = .Range(.[C7], .[C50000].End(xlUp)).Resize(, 4).Value
    End With
    ReDim KQ(1 To UBound(Rng, 1), 1 To 5)
    With Sheet2
        Tem = .[F7].Value
        Ma = UCase(.[E3])
        For I = 1 To UBound(Rng, 1)
            If UCase(Rng(I, 2)) = Ma Then
                K = K + 1
    
    KQ(K, 1) = Rng(I, 1)
                    KQ(K, 2) = Rng(I, 3)
                    KQ(K, 3) = Rng(I, 4)
                Tem = Tem + Rng(I, 3) - Rng(I, 4) - [G7]
                Tem1 = [G7] + Rng(I, 4) - Rng(I, 3) - Tem
                KQ(K, 4) = Application.Max(Tem, 0)
                KQ(K, 5) = Application.Max(Tem1, 0)
            End If
        Next I
        .[C8:G1000].ClearContents
        If K Then .[C8].Resize(K, 5) = KQ
    End With
    End Sub

    Với sự trợ giúp của Thầy Bate và anh Quang Hải em đã giải quyết đuợc bài toàn trên
    Giờ em muốn mở rộng bài toàn một chút
    Nếu giờ số dư có 2 cột, và em muốn chỉ sử dụng hàm Max
    Em thử đoạn code trên như chưa được
    Nhờ mọi người trợ giúp ah

    [COLOR=#000000][COLOR=#0000BB]Sub abc[/COLOR][COLOR=#007700]()
    [/COLOR][COLOR=#0000BB]Dim Fr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]Lr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]rng1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]rng2
    Fr [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]7[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]Lr [/COLOR][COLOR=#007700]= [[/COLOR][COLOR=#0000BB]C65536[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]3[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Row
    [/COLOR][COLOR=#007700]For [/COLOR][COLOR=#0000BB]r [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Fr To Lr
       rng1 [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Sum[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"D7:D" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700]))
       [/COLOR][COLOR=#0000BB]rng2 [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Sum[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"E7:E" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700]))
       [/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]6[/COLOR][COLOR=#007700]) = [[/COLOR][COLOR=#0000BB]D5[/COLOR][COLOR=#007700]] + [/COLOR][COLOR=#0000BB]rng1 [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000BB]rng2 [/COLOR][COLOR=#007700]- [[/COLOR][COLOR=#0000BB]E5[/COLOR][COLOR=#007700]]
    [/COLOR][COLOR=#0000BB]Next
    End Sub  [/COLOR][/COLOR]

    Bạn thử bài này kết hợp với Application.Max xem sao nhé

  6. hands says:
    [COLOR=#000000][COLOR=#0000BB]Sub abc[/COLOR][COLOR=#007700]()
    [/COLOR][COLOR=#0000BB]Dim Fr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]Lr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]rng1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]rng2
    Fr [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]7[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]Lr [/COLOR][COLOR=#007700]= [[/COLOR][COLOR=#0000BB]C65536[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]3[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Row
    [/COLOR][COLOR=#007700]For [/COLOR][COLOR=#0000BB]r [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Fr To Lr
       rng1 [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Sum[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"D7:D" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700]))
       [/COLOR][COLOR=#0000BB]rng2 [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Sum[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"E7:E" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700]))
       [/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]6[/COLOR][COLOR=#007700]) = [[/COLOR][COLOR=#0000BB]D5[/COLOR][COLOR=#007700]] + [/COLOR][COLOR=#0000BB]rng1 [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000BB]rng2 [/COLOR][COLOR=#007700]- [[/COLOR][COLOR=#0000BB]E5[/COLOR][COLOR=#007700]]
    [/COLOR][COLOR=#0000BB]Next
    End Sub  [/COLOR][/COLOR]

    Bạn thử bài này kết hợp với Application.Max xem sao nhé

    Mình cũng đã làm thử rồi nhưng không được.
    Như bài 20 mình có nói là mình muốn sử dụng hàm Max, còn nếu trường hợp có số dư ở hai bên mình chế lại một chút phần số dư đầu kỳ thế này

    =IFERROR(IF(VLOOKUP(E3,sodu_dau!$A$5:$C$6,3,0)<>0,-VLOOKUP(E3,sodu_dau!$A$5:$C$6,3,0),VLOOKUP(E3,sodu_dau!$A$5:$C$6,2,0)),0)

    thì với hướng dẫn của Thầy Bate vẫn ra bình thường

    [COLOR=#0000cd]=MAX($F$7+SUM($D$8:D8)-SUM($E$8:E80)-$G$7,0[/COLOR])
    =[COLOR=#0000cd]MAX($G$7+SUM($E$8:E8)-SUM($D$8:D8)-F7,0[/COLOR])

    Và mình muốn hỏi không biết hai công thức này trong VBA có sử dụng được địa chỉ tuyệt đối và tương đối giống như Excel hay không
    Nếu áp dụng cho bài 20 thì giải quyết thế nào.
    Không biết có phải kiểu thế này

    [COLOR=#000000][COLOR=#0000BB]rng1 [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Sum[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"D7:D" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]r[/COLOR][COLOR=#007700]))[/COLOR][/COLOR]

    hay kiểu R1C1
    Nhờ các bác giúp em

    Thử chạy sub này coi sao

    Sub Hung()
    Dim Rng(), KQ(), I As Long, No As Double, Co As Double, Ma As String, K As Long
    With Sheet1
        Rng = .Range(.[C7], .[C50000].End(xlUp)).Resize(, 4).Value
    End With
    ReDim KQ(1 To UBound(Rng, 1), 1 To 5)
    With Sheet2
        No = .[F7].Value
        Co = .[G7].Value
        Ma = UCase(.[E3])
        For I = 1 To UBound(Rng, 1)
            If UCase(Rng(I, 2)) = Ma Then
                K = K + 1
                    KQ(K, 1) = Rng(I, 1)
                    KQ(K, 2) = Rng(I, 3)
                    KQ(K, 3) = Rng(I, 4)
                KQ(K, 4) = WorksheetFunction.Max(No + Rng(I, 3) - Co - Rng(I, 4), 0)
                KQ(K, 5) = WorksheetFunction.Max(Co + Rng(I, 4) - No - Rng(I, 3), 0)
                No = KQ(K, 4): Co = KQ(K, 5)
            End If
        Next I
        .[C8:G1000].ClearContents
        If K Then .[C8].Resize(K, 5) = KQ
    End With
    End Sub
    No = KQ(K, 4): Co = KQ(K, 5)

    Đoạn này thật là hay đấy ah
    Em đã thử thành công
    File thật của em nó khá lằng nhằng nhưng khi chế thêm với code của Thầy kết quả thật tuyệt vời ah
    Cảm ơn thấy nhiều ah

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm