Gán mã thỏa mản điều kiện (1 người xem)

  • Thread starter Thread starter cachabu
  • Ngày gửi Ngày gửi

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

cachabu

Thành viên hoạt động
Tham gia
27/4/14
Bài viết
122
Được thích
2
chào các anh chị
bài tập của em như sau:

mục đích là cần lấy mã của số tiền 2 gắn vào mã của số tiền 1,

lấy số tiền lần lượt của cột số tiền 1 trừ lần lượt cột số tiền 2 và nếu không đủ thì lây tiếp số tiền của dòng tiếp theo trừ tiếp cho đên khi =0

e có nói rỏ trong file đính kèm, nhờ các anh chị xem giúp

cám ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Cho tôi hỏi, khi ra bảng Kết Quả, nguyên tắc nào khi bảng dữ liệu phần Diễn Giải ở các mã khác nhau, nhưng trong bảng kết quả, cụ thể tại CTU 13503 cột diễn giải cho ra AA toàn bộ, trong khi ở bảng gốc lại có rất nhiều diễn giải (AA, BB, CC, QQ,...)?
 
Upvote 0
chào các anh chị
bài tập của em như sau:

mục đích là cần lấy mã của số tiền 2 gắn vào mã của số tiền 1,

lấy số tiền lần lượt của cột số tiền 1 trừ lần lượt cột số tiền 2 và nếu không đủ thì lây tiếp số tiền của dòng tiếp theo trừ tiếp cho đên khi =0

e có nói rỏ trong file đính kèm, nhờ các anh chị xem giúp

cám ơn
............................................................
Mod có đi ngang xoá dùm bài này dùm nghen. Nội dung post kém quá
 
Lần chỉnh sửa cuối:
Upvote 0
Cho tôi hỏi, khi ra bảng Kết Quả, nguyên tắc nào khi bảng dữ liệu phần Diễn Giải ở các mã khác nhau, nhưng trong bảng kết quả, cụ thể tại CTU 13503 cột diễn giải cho ra AA toàn bộ, trong khi ở bảng gốc lại có rất nhiều diễn giải (AA, BB, CC, QQ,...)?
Dòng diễn giải anh thích sao cũng được anh nhe e chỉ quan tâm đến mấy cái kia thôi
 
Upvote 0
Ý tác giả có thể như sau: trừ lần lượt từ trên xuống
E3=F6=500000, bên sheet kết quả sẽ ghi 500000 và 2 mã ở data!G3 và G6
Tiếp dòng sau: E4 = 1.000.000, F7 = 500.000 ở kết quả sẽ ghi 500.000 và 2 mã data!G4 và G7
Sau khi trừ thì E4 còn dư 500.000 sẽ được trừ tiếp cho ô F8=300.000, kết quả sẽ ghi 300.000 và 2 mã data!G4 và G8.
Sau khi trừ thì E4 còn dư 200.000 không đủ trừ cho F9=2.200.000 nên số dư này sẽ được cộng vào E5 = 2.000.000 để thành 2.200.000. Bên kết quả sẽ ghi 2.200.000 và 2 mã G5 và G9.
Còn code phức tạp thế này thì phải nhờ các thầy rồi.
 
Upvote 0
chào các anh chị
bài tập của em như sau:

mục đích là cần lấy mã của số tiền 2 gắn vào mã của số tiền 1,

lấy số tiền lần lượt của cột số tiền 1 trừ lần lượt cột số tiền 2 và nếu không đủ thì lây tiếp số tiền của dòng tiếp theo trừ tiếp cho đên khi =0

e có nói rỏ trong file đính kèm, nhờ các anh chị xem giúp

cám ơn
cái vụ trừ tiền thì có vẻ ok, nhưng cái vụ gán tên thì hình như quy luật không được thống nhất.
ví như E4 lặp qua 2 lần F6 và F7 (thì tổng = E4)
tôi lấy 2 kết quả.
bạn xem đúng ko nha
Mã:
Sub GanMa()
Sheet1.Select
Dim ng As Variant, kq(), i, j, k, tam As Long
ng = [b3:G23].Value
ReDim kq(1 To UBound(ng), 1 To 6)
For i = 1 To UBound(ng)
tam = 0
    If Not IsEmpty(ng(i, 4)) Then
        For j = i To UBound(ng) - 1
        If Not IsEmpty(ng(j, 5)) Then
            If ng(j, 2) = ng(i, 2) Then
                tam = ng(j, 5) + tam
                If ng(i, 4) >= tam Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    If ng(i, 4) = tam Then Exit For
                End If
              If ng(j + 1, 2) <> ng(i, 2) And ng(i, 4) - tam < ng(j, 4) Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    Exit For
                End If
            If ng(i, 2) <> ng(i - 1, 2) And ng(i, 4) < ng(j, 5) Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    ng(j, 5) = ng(j, 5) - ng(i, 4)
                    Exit For
          End If
          End If
        End If

        Next j
    End If
Next i
Sheet2.[j:n].ClearContents
If k Then Sheet2.[j3].Resize(k, 6).Value = kq

End Sub

đoạn code sau cho ra đúng kết quả của bạn.(đoạn này thì cần phải chỉnh một chút, nhưng đưa lên để xem ý bạn thế nào)
bạn xem đoạn code nào đúng,
Mã:
Sub GanMa()
Sheet1.Select
Dim ng As Variant, kq(), i, j, k, tam As Long
ng = [b3:G23].Value
ReDim kq(1 To UBound(ng), 1 To 6)
For i = 1 To UBound(ng)
l = k
tam = 0
    If Not IsEmpty(ng(i, 4)) Then
        For j = i To UBound(ng) - 1
        If Not IsEmpty(ng(j, 5)) Then
            If ng(j, 2) = ng(i, 2) Then
                tam = ng(j, 5) + tam
                If ng(i, 4) >= tam Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    kq(k, 6) = ng(j, 5)
                    If ng(i, 4) = tam Then Exit For
                End If
              If ng(j + 1, 2) <> ng(i, 2) And ng(i, 4) < tam Then
                    k = l + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    kq(k, 6) = ng(j, 5)
                    Exit For
                End If
            If ng(i, 2) <> ng(i - 1, 2) And ng(i, 4) < ng(j, 5) Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    kq(k, 6) = ng(i, 4)
                    ng(j, 5) = ng(j, 5) - ng(i, 4)
                    Exit For
          End If
          End If
        End If

        Next j
    End If
Next i
Sheet2.[j:n].ClearContents
If k Then Sheet2.[j3].Resize(k, 6).Value = kq

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
chào các anh chị
bài tập của em như sau:

mục đích là cần lấy mã của số tiền 2 gắn vào mã của số tiền 1,

lấy số tiền lần lượt của cột số tiền 1 trừ lần lượt cột số tiền 2 và nếu không đủ thì lây tiếp số tiền của dòng tiếp theo trừ tiếp cho đên khi =0

e có nói rỏ trong file đính kèm, nhờ các anh chị xem giúp

cám ơn
Tặng cho bạn cái đám rừng này coi chơi cho vui. Viết code xong đọc lại suýt nôn luôn.

PHP:
Sub QuangHai()
Dim data(), i, ii, j, k, Res(1 To 10000, 1 To 6)
With Sheet1
   data = .Range(.[B3], .[G65536].End(3).Offset(1)).Value
End With
i = 1
Do
   If data(i, 4) <> "" Then
      Do
         j = j + 1
         If data(i + j, 5) <> "" Then
            k = k + 1
            Res(k, 1) = data(i, 1)
            Res(k, 2) = data(i, 2)
            Res(k, 3) = data(i, 3)
            If data(i + ii, 4) = data(i + j, 5) Then
               Res(k, 6) = data(i + j, 5)
               Res(k, 5) = data(i + j, 6)
               If data(i + ii, 5) = "" Then
                  Res(k, 4) = data(i, 6)
               Else
                  Res(k, 4) = data(i + ii - 1, 6)
               End If
            ElseIf data(i + ii, 4) > data(i + j, 5) Then
               data(i + ii + 1, 4) = data(i + ii + 1, 4) + data(i + ii, 4) - data(i + j, 5)
               Res(k, 6) = data(i + j, 5)
               Res(k, 5) = data(i + j, 6)
               If data(i + ii - 1, 4) = data(i + j - 1, 5) Then
                  Res(k, 4) = data(i + ii, 6)
               Else
                  If data(i + ii - 1, 4) - data(i + j - 1, 5) > 0 Then
                     Res(k, 4) = data(i + ii - 1, 6)
                  Else
                     Res(k, 4) = data(i + ii, 6)
                  End If
               End If
            ElseIf data(i + ii, 4) < data(i + j, 5) Then
               data(i + ii + 1, 4) = data(i + ii + 1, 4) + data(i + ii, 4) - data(i + j, 5)
              Res(k, 6) = data(i, 4)
              Res(k, 5) = data(i + j, 6)
              Res(k, 4) = data(i, 6)
              Res(k + 1, 4) = data(i + 1, 6)
              Res(k + 1, 5) = data(i + j, 6)
              Res(k + 1, 6) = data(i + j, 5) - data(i, 4)
              Res(k + 1, 1) = data(i, 1)
              Res(k + 1, 2) = data(i, 2)
              Res(k + 1, 3) = data(i, 3)
              k = k + 1
            End If
            ii = ii + 1
         End If
      Loop Until data(i + j, 2) <> data(i + j - 1, 2)
   End If
   i = i + j
   j = 0
   ii = 0
Loop Until i >= UBound(data)
Sheet2.[H3].Resize(k, 6) = Res
End Sub
 
Upvote 0
Tặng cho bạn cái đám rừng này coi chơi cho vui. Viết code xong đọc lại suýt nôn luôn.

PHP:
Sub QuangHai()
Dim data(), i, ii, j, k, Res(1 To 10000, 1 To 6)
With Sheet1
   data = .Range(.[B3], .[G65536].End(3).Offset(1)).Value
End With
i = 1
Do
   If data(i, 4) <> "" Then
      Do
         j = j + 1
         If data(i + j, 5) <> "" Then
            k = k + 1
            Res(k, 1) = data(i, 1)
            Res(k, 2) = data(i, 2)
            Res(k, 3) = data(i, 3)
            If data(i + ii, 4) = data(i + j, 5) Then
               Res(k, 6) = data(i + j, 5)
               Res(k, 5) = data(i + j, 6)
               If data(i + ii, 5) = "" Then
                  Res(k, 4) = data(i, 6)
               Else
                  Res(k, 4) = data(i + ii - 1, 6)
               End If
            ElseIf data(i + ii, 4) > data(i + j, 5) Then
               data(i + ii + 1, 4) = data(i + ii + 1, 4) + data(i + ii, 4) - data(i + j, 5)
               Res(k, 6) = data(i + j, 5)
               Res(k, 5) = data(i + j, 6)
               If data(i + ii - 1, 4) = data(i + j - 1, 5) Then
                  Res(k, 4) = data(i + ii, 6)
               Else
                  If data(i + ii - 1, 4) - data(i + j - 1, 5) > 0 Then
                     Res(k, 4) = data(i + ii - 1, 6)
                  Else
                     Res(k, 4) = data(i + ii, 6)
                  End If
               End If
            ElseIf data(i + ii, 4) < data(i + j, 5) Then
               data(i + ii + 1, 4) = data(i + ii + 1, 4) + data(i + ii, 4) - data(i + j, 5)
              Res(k, 6) = data(i, 4)
              Res(k, 5) = data(i + j, 6)
              Res(k, 4) = data(i, 6)
              Res(k + 1, 4) = data(i + 1, 6)
              Res(k + 1, 5) = data(i + j, 6)
              Res(k + 1, 6) = data(i + j, 5) - data(i, 4)
              Res(k + 1, 1) = data(i, 1)
              Res(k + 1, 2) = data(i, 2)
              Res(k + 1, 3) = data(i, 3)
              k = k + 1
            End If
            ii = ii + 1
         End If
      Loop Until data(i + j, 2) <> data(i + j - 1, 2)
   End If
   i = i + j
   j = 0
   ii = 0
Loop Until i >= UBound(data)
Sheet2.[H3].Resize(k, 6) = Res
End Sub
ghê quá, nhìn vào hoa hết cả mắt, cám ơn anh quang hải, kết quả ra đúng như mong muốn luôn
 
Upvote 0
cái vụ trừ tiền thì có vẻ ok, nhưng cái vụ gán tên thì hình như quy luật không được thống nhất.
ví như E4 lặp qua 2 lần F6 và F7 (thì tổng = E4)
tôi lấy 2 kết quả.
bạn xem đúng ko nha
Mã:
Sub GanMa()
Sheet1.Select
Dim ng As Variant, kq(), i, j, k, tam As Long
ng = [b3:G23].Value
ReDim kq(1 To UBound(ng), 1 To 6)
For i = 1 To UBound(ng)
tam = 0
    If Not IsEmpty(ng(i, 4)) Then
        For j = i To UBound(ng) - 1
        If Not IsEmpty(ng(j, 5)) Then
            If ng(j, 2) = ng(i, 2) Then
                tam = ng(j, 5) + tam
                If ng(i, 4) >= tam Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    If ng(i, 4) = tam Then Exit For
                End If
              If ng(j + 1, 2) <> ng(i, 2) And ng(i, 4) - tam < ng(j, 4) Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    Exit For
                End If
            If ng(i, 2) <> ng(i - 1, 2) And ng(i, 4) < ng(j, 5) Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    ng(j, 5) = ng(j, 5) - ng(i, 4)
                    Exit For
          End If
          End If
        End If

        Next j
    End If
Next i
Sheet2.[j:n].ClearContents
If k Then Sheet2.[j3].Resize(k, 6).Value = kq

End Sub

đoạn code sau cho ra đúng kết quả của bạn.(đoạn này thì cần phải chỉnh một chút, nhưng đưa lên để xem ý bạn thế nào)
bạn xem đoạn code nào đúng,
Mã:
Sub GanMa()
Sheet1.Select
Dim ng As Variant, kq(), i, j, k, tam As Long
ng = [b3:G23].Value
ReDim kq(1 To UBound(ng), 1 To 6)
For i = 1 To UBound(ng)
l = k
tam = 0
    If Not IsEmpty(ng(i, 4)) Then
        For j = i To UBound(ng) - 1
        If Not IsEmpty(ng(j, 5)) Then
            If ng(j, 2) = ng(i, 2) Then
                tam = ng(j, 5) + tam
                If ng(i, 4) >= tam Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    kq(k, 6) = ng(j, 5)
                    If ng(i, 4) = tam Then Exit For
                End If
              If ng(j + 1, 2) <> ng(i, 2) And ng(i, 4) < tam Then
                    k = l + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    kq(k, 6) = ng(j, 5)
                    Exit For
                End If
            If ng(i, 2) <> ng(i - 1, 2) And ng(i, 4) < ng(j, 5) Then
                    k = k + 1
                    kq(k, 1) = ng(i, 1)
                    kq(k, 2) = ng(i, 2)
                    kq(k, 3) = ng(i, 3)
                    kq(k, 4) = ng(i, 6)
                    kq(k, 5) = ng(j, 6)
                    kq(k, 6) = ng(i, 4)
                    ng(j, 5) = ng(j, 5) - ng(i, 4)
                    Exit For
          End If
          End If
        End If

        Next j
    End If
Next i
Sheet2.[j:n].ClearContents
If k Then Sheet2.[j3].Resize(k, 6).Value = kq

End Sub

cám ơn anh nhé code của anh ra được kết quả như em mong muốn rồi.
 
Upvote 0
Tặng cho bạn cái đám rừng này coi chơi cho vui. Viết code xong đọc lại suýt nôn luôn.

PHP:
Sub QuangHai()
Dim data(), i, ii, j, k, Res(1 To 10000, 1 To 6)
With Sheet1
   data = .Range(.[B3], .[G65536].End(3).Offset(1)).Value
End With
i = 1
Do
   If data(i, 4) <> "" Then
      Do
         j = j + 1
         If data(i + j, 5) <> "" Then
            k = k + 1
            Res(k, 1) = data(i, 1)
            Res(k, 2) = data(i, 2)
            Res(k, 3) = data(i, 3)
            If data(i + ii, 4) = data(i + j, 5) Then
               Res(k, 6) = data(i + j, 5)
               Res(k, 5) = data(i + j, 6)
               If data(i + ii, 5) = "" Then
                  Res(k, 4) = data(i, 6)
               Else
                  Res(k, 4) = data(i + ii - 1, 6)
               End If
            ElseIf data(i + ii, 4) > data(i + j, 5) Then
               data(i + ii + 1, 4) = data(i + ii + 1, 4) + data(i + ii, 4) - data(i + j, 5)
               Res(k, 6) = data(i + j, 5)
               Res(k, 5) = data(i + j, 6)
               If data(i + ii - 1, 4) = data(i + j - 1, 5) Then
                  Res(k, 4) = data(i + ii, 6)
               Else
                  If data(i + ii - 1, 4) - data(i + j - 1, 5) > 0 Then
                     Res(k, 4) = data(i + ii - 1, 6)
                  Else
                     Res(k, 4) = data(i + ii, 6)
                  End If
               End If
            ElseIf data(i + ii, 4) < data(i + j, 5) Then
               data(i + ii + 1, 4) = data(i + ii + 1, 4) + data(i + ii, 4) - data(i + j, 5)
              Res(k, 6) = data(i, 4)
              Res(k, 5) = data(i + j, 6)
              Res(k, 4) = data(i, 6)
              Res(k + 1, 4) = data(i + 1, 6)
              Res(k + 1, 5) = data(i + j, 6)
              Res(k + 1, 6) = data(i + j, 5) - data(i, 4)
              Res(k + 1, 1) = data(i, 1)
              Res(k + 1, 2) = data(i, 2)
              Res(k + 1, 3) = data(i, 3)
              k = k + 1
            End If
            ii = ii + 1
         End If
      Loop Until data(i + j, 2) <> data(i + j - 1, 2)
   End If
   i = i + j
   j = 0
   ii = 0
Loop Until i >= UBound(data)
Sheet2.[H3].Resize(k, 6) = Res
End Sub
anh ơi cho em hỏi nếu bài này e insert ra thêm sau cột C 1 cột nữa thì code này sẻ sửa lại thế nào vậy, chỉ giúp em với nhé với lại code nay dữ liệu hơn 400 dòng thì nó chạy không nỗi cư quay vòng miết à, data của em khoảng 10 ngàn dòng lận anh ơi
có cách nào viết khi chạy nhẹ hơn không vậy?
cám ơn
 
Lần chỉnh sửa cuối:
Upvote 0
anh ơi cho em hỏi nếu bài này e insert ra thêm sau cột C 1 cột nữa thì code này sẻ sửa lại thế nào vậy, chỉ giúp em với nhé với lại code nay dữ liệu hơn 400 dòng thì nó chạy không nỗi cư quay vòng miết à, data của em khoảng 10 ngàn dòng lận anh ơi
có cách nào viết khi chạy nhẹ hơn không vậy?
cám ơn
1. Sửa lại dòng code trên đầu 1000 thành 65536
2 Mình thử trên máy mình 50000 dòng code chạy trong 1s
3. Tại sao lúc đầu không đưa cấu trúc đúng? Code này khó nhai nên ngán lắm
 
Upvote 0
1. Sửa lại dòng code trên đầu 1000 thành 65536
2 Mình thử trên máy mình 50000 dòng code chạy trong 1s
3. Tại sao lúc đầu không đưa cấu trúc đúng? Code này khó nhai nên ngán lắm

tại vì em không lường trước được vấn đề sory anh

vấn đề code chay chậm là do em đưa data vào sai nên no ko chạy, nhưng em đã khắc phục được vấn đề này rồi.

a xem giúp em cái code viết thế nào nếu như thêm cột vào như em nói nhé.

cám ơn nhiu
 
Upvote 0
sửa đoạn code gán mã

chuyển đề tài mới để các anh chị dễ hiểu hơn

cám ơn
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom