Trang 2 của 4 Đầu tiênĐầu tiên 1234 CuốiCuối
Kết quả 11 đến 20 của 37

Chủ đề: Nhờ các Anh chị viết macro giải quyết bài toán xét nhiều điều kiện

  1. #11
    vivaclinic Guest
    Trích dẫn Gửi bởi doveandrose
    nói như vậy có nghĩa là cần phải chọn cho đủ hết chỉ tiêu của 1 loại (thí dụ A) rồi mới bắt đầu đi chọn chỉ tiêu cho loại khác phải không ? nếu bạn xác nhận là đúng thì ta tiến hành code
    ------------------------------
    Chọn đủ chỉ tiêu của 1 loại là đúng còn xét hết A thì mới xét B,C,D thì ko đúng
    Xét theo ưu tiên; xét hết ưu tiên 1 của A,B,C,D nếu vẫn chưa đủ của loại nào thì xét tiếp ưu tiên 2 của các loại đó và tiếp đến 3,4 nếu vẫn chưa đủ

  2. #12
    phonghan Guest
    Trích dẫn Gửi bởi QuocDung2510
    ---------------------------------------
    Không đúng; Xét hết ưu tiên 1 rồi xét đến ưu tiên 2,3,4( Nếu hết ưu tiên 1 của A chưa đủ thì xét tiếp ưu tiên 2 của A với điều kiện các ưu tiên 1 của B,C,D phải xét trước khi xét ưu tiên 2 của A)
    vẫn cần thêm 1 chi tiết : so sánh dòng 263 và dòng 4 . E4 > E263 nhưng C4 ưu tiên thấp hơn C263 . vậy nếu phải chọn 1 trong 2 thì chọn dòng nào ?

  3. #13
    machao112 Guest
    Trích dẫn Gửi bởi QuocDung2510
    ------------------------------
    Chọn đủ chỉ tiêu của 1 loại là đúng còn xét hết A thì mới xét B,C,D thì ko đúng
    Xét theo ưu tiên; xét hết ưu tiên 1 của A,B,C,D nếu vẫn chưa đủ của loại nào thì xét tiếp ưu tiên 2 của các loại đó và tiếp đến 3,4 nếu vẫn chưa đủ
    đây là câu bạn phải nói ngay từ #1 . chạy Sub này

    Mã:
    Public Sub hello()
    Dim arr As Variant, lr As Long, dicMA As Object, dicThamChieu As Object, arrThamChieu As Variant, r As Long
    Dim dArr As Variant
    With Sheet1
        lr = .Range("E1000000").End(xlUp).Row
        If lr > 1 Then
            Application.ScreenUpdating = False
            .Range("A2:F" & lr).Sort key1:=.[C2], order1:=xlAscending, key2:=.[D2], order2:=xlAscending, _
                                     key3:=.[E2], order3:=xlDescending
            arr = .Range("A2:E" & lr).Value
            ReDim dArr(1 To UBound(arr), 1 To 1)
            Set dicMA = CreateObject("Scripting.Dictionary")
            Set dicThamChieu = CreateObject("Scripting.Dictionary")
            arrThamChieu = .Range("L3:N" & .[N2].End(xlDown).Row).Value
            For r = 1 To UBound(arrThamChieu) Step 1
                dicThamChieu.Add arrThamChieu(r, 1), Array(arrThamChieu(r, 2), arrThamChieu(r, 3), 0)
            Next
            
            
            For r = 1 To UBound(arr) Step 1
                If Not dicMA.exists(arr(r, 2)) And dicThamChieu.exists(arr(r, 4)) Then
                    If arr(r, 5) > dicThamChieu(arr(r, 4))(0) Then
                        If dicThamChieu(arr(r, 4))(2) < dicThamChieu(arr(r, 4))(1) Then
                             dArr(r, 1) = True
                             arrThamChieu = dicThamChieu(arr(r, 4))
                             arrThamChieu(2) = arrThamChieu(2) + 1
                             dicThamChieu(arr(r, 4)) = arrThamChieu
                             dicMA(arr(r, 2)) = 1
                        End If
                    End If
                End If
            Next
            
            .Range("F2:F" & lr).Value = dArr
            .Range("A2:F" & lr).Sort key1:=.[A2], order1:=xlAscending
            Application.ScreenUpdating = True
        End If
    End With
    
    
    End Sub

  4. #14
    Ngày tham gia
    Aug 2015
    Bài viết
    0

    1 Mã chỉ có kết quả là True tối đa 1 lần và ưu tiên theo cột ưu tiên từ 1-4
    điều này cần phải bàn bạc lại vì nó kéo theo nhiều hệ lụy



    hãy xét 1 cái bảng đơn giản chỉ có 16 dòng thế này
    theo cách chọn của bạn dòng số 2 được chọn TRUE vì 19 > 15 . tuy 19 chưa phải cao nhất nhưng loại A có tối đa 10 lần được xét True .
    kéo theo hệ lụy dòng 4 phải xét FALSE vì 1 mã chỉ có tối đa 1 loại được xét TRUE mặc dù dòng 4 là giá trị tốt nhất cho loại C theo mọi tiêu chí của bạn . vậy cách chọn điều kiện xét TRUE đã vô tình làm mất đi 1 số giá trị tốt nhất cho từng loại A,B,C,D ???

  5. #15
    dienlanhhongphuc Guest
    Trích dẫn Gửi bởi doveandrose
    đây là câu bạn phải nói ngay từ #1 . chạy Sub này

    <div class="bbcode_container">
    <div class="bbcode_description">Code:
    </div>
    </div>
    --------------------------------------------------------------------------------
    Bác ơi báo lỗi tại
    lr = .Range("E1000000").End(xlUp).Row
    Mình không rành cái này lắm!

  6. #16
    sonnt Guest
    Trích dẫn Gửi bởi QuocDung2510
    --------------------------------------------------------------------------------
    Bác ơi báo lỗi tại
    lr = .Range("E1000000").End(xlUp).Row
    Mình không rành cái này lắm!
    đưa cái file có lỗi lên đây

  7. #17
    hoangkiso Guest
    Trích dẫn Gửi bởi QuocDung2510
    --------------------------------------------------------------------------------
    Bác ơi báo lỗi tại
    lr = .Range("E1000000").End(xlUp).Row
    Mình không rành cái này lắm!
    Thay dòng đó thành:


    lr = .Range("E10000").End(xlUp).Row
    thử xem sao?

  8. #18
    Ricky1990 Guest
    Trích dẫn Gửi bởi doveandrose
    đưa cái file có lỗi lên đây
    Tôi nghĩ tác giả Test File trên office 2003.

  9. #19
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Trích dẫn Gửi bởi chuot0106
    Tôi nghĩ tác giả Test File trên office 2003.
    #1 gửi file .xlsx lên mà

  10. #20
    sunshinexxxx Guest
    Trích dẫn Gửi bởi chuot0106
    Thay dòng đó thành:

    thử xem sao?
    -------
    Đã thử nhưng vẫn báo lỗi tại dòng lệnh đó
    Mình dung office 2013

Trang 2 của 4 Đầu tiênĐầu tiên 1234 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •