minhhoai1963
Thành viên mới
- Tham gia
- 27/4/22
- Bài viết
- 3
- Được thích
- 1
Họ mới vào diễn đàn có lẽ cũng chưa đọc qua nội quy, tôi nghĩ nên nhắc nhở họ.Đợi xem ai giải bài này.
Bạn vào đọc nội quy tại đây (Mục III). Sau đó sửa tiêu đề cho phù hợp:Tôi mới tham gia Diễn đàn và muốn nhờ các Anh chị giúp tôi 1 đoạn code VBA đính kèm file sau. Xin trân trọng cảm ơn!
Option Explicit
Sub test()
Dim lr&, i&, j&, k&, c&, sum As Double, grand As Double, t&, arrKQ, rngDM, rngDS, cell As Range
Sheets("DMHD").Activate
lr = Cells(Rows.Count, "B").End(xlUp).Row
rngDS = Sheets("Sheet2").Range("A1:B" & Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Row).Value ' Danh sách loai hop dong, them cot B dien giai ten hop dong
rngDM = Range("B7:G" & lr).Value
ReDim arrKQ(1 To 10000, 1 To 5)
For i = 1 To UBound(rngDS)
For j = 1 To UBound(rngDM)
If rngDS(i, 1) = rngDM(j, 3) Then
c = c + 1' dem so lan xuat hien cua hop dong
k = k + 1
If c = 1 Then ' tai dong dau tien cua loai hop dong
t = k' danh dau dong dau tien
arrKQ(k, 1) = WorksheetFunction.Roman(i) ' dong tong hop moi loai hop dong cua vung ket qua
arrKQ(k, 2) = rngDM(j, 3)
arrKQ(k, 3) = rngDS(i, 2)
k = k + 1 ' dong dau tien cua chi tiet
arrKQ(k, 1) = c
arrKQ(k, 2) = rngDM(j, 1)
arrKQ(k, 3) = rngDM(j, 2)
arrKQ(k, 4) = rngDM(j, 5)
arrKQ(k, 5) = rngDM(j, 6)
sum = sum + rngDM(j, 5)' cong don gia tri cua tung loai hop dong
Else
'k = k + 1
arrKQ(k, 1) = c ' dong chi tiet
arrKQ(k, 2) = rngDM(j, 1)
arrKQ(k, 3) = rngDM(j, 2)
arrKQ(k, 4) = rngDM(j, 5)
arrKQ(k, 5) = rngDM(j, 6)
sum = sum + rngDM(j, 5) ' cong don gia tri cua tung loai hop dong
End If
End If
Next
arrKQ(t, 4) = sum' gan sum cho dong dau tien cua hop dong
grand = grand + sum ' cong don tat ca cac loai hop dong
c = 0: sum = 0
Next
arrKQ(k + 2, 3) = "TONG CONG"
arrKQ(k + 2, 4) = grand
Range("J6:N100").Delete
Range("J6").Resize(UBound(arrKQ), 5) = arrKQ
For Each cell In Range("J6").Resize(UBound(arrKQ), 1).SpecialCells(xlCellTypeConstants, xlTextValues)
cell.Resize(1, 5).Font.Bold = True
Next
Range(Cells(k + 7, "L"), Cells(k + 7, "M")).Font.Bold = True
End Sub
Ở đây ngoài bạn ra còn ai muốn nhận làm "cao thủ" nữa mà nói chuyện "khác".Dùng tạm trong khi chờ các cao thủ khác ra tay:
...
Đúng là thừa chữ "cao thủ" thật. Thừa 1 li "lên 1 chín tầng mây".)Ở đây ngoài bạn ra còn ai muốn nhận làm "cao thủ" nữa mà nói chuyện "khác".
Cái này dùng Dictionary có vẻ nhanh hơn anh à.Dùng tạm trong khi chờ các cao thủ khác ra tay:
PHP:Option Explicit Sub test() Dim lr&, i&, j&, k&, c&, sum As Double, grand As Double, t&, arrKQ, rngDM, rngDS, cell As Range Sheets("DMHD").Activate lr = Cells(Rows.Count, "B").End(xlUp).Row rngDS = Sheets("Sheet2").Range("A1:B" & Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Row).Value ' Danh sách loai hop dong, them cot B dien giai ten hop dong rngDM = Range("B7:G" & lr).Value ReDim arrKQ(1 To 10000, 1 To 5) For i = 1 To UBound(rngDS) For j = 1 To UBound(rngDM) If rngDS(i, 1) = rngDM(j, 3) Then c = c + 1' dem so lan xuat hien cua hop dong k = k + 1 If c = 1 Then ' tai dong dau tien cua loai hop dong t = k' danh dau dong dau tien arrKQ(k, 1) = WorksheetFunction.Roman(i) ' dong tong hop moi loai hop dong cua vung ket qua arrKQ(k, 2) = rngDM(j, 3) arrKQ(k, 3) = rngDS(i, 2) k = k + 1 ' dong dau tien cua chi tiet arrKQ(k, 1) = c arrKQ(k, 2) = rngDM(j, 1) arrKQ(k, 3) = rngDM(j, 2) arrKQ(k, 4) = rngDM(j, 5) arrKQ(k, 5) = rngDM(j, 6) sum = sum + rngDM(j, 5)' cong don gia tri cua tung loai hop dong Else 'k = k + 1 arrKQ(k, 1) = c ' dong chi tiet arrKQ(k, 2) = rngDM(j, 1) arrKQ(k, 3) = rngDM(j, 2) arrKQ(k, 4) = rngDM(j, 5) arrKQ(k, 5) = rngDM(j, 6) sum = sum + rngDM(j, 5) ' cong don gia tri cua tung loai hop dong End If End If Next arrKQ(t, 4) = sum' gan sum cho dong dau tien cua hop dong grand = grand + sum ' cong don tat ca cac loai hop dong c = 0: sum = 0 Next arrKQ(k + 2, 3) = "TONG CONG" arrKQ(k + 2, 4) = grand Range("J6:N100").Delete Range("J6").Resize(UBound(arrKQ), 5) = arrKQ For Each cell In Range("J6").Resize(UBound(arrKQ), 1).SpecialCells(xlCellTypeConstants, xlTextValues) cell.Resize(1, 5).Font.Bold = True Next Range(Cells(k + 7, "L"), Cells(k + 7, "M")).Font.Bold = True End Sub
Bac có thể thực hiện thêm cách này cho em dễ hình dung không? Cảm ơn bác trướcCái này dùng Dictionary có vẻ nhanh hơn anh à.
Cái này dùng Dictionary có vẻ nhanh hơn anh à.
Lót dép hóng @snow25 giải bài này với dic !!!!!Bac có thể thực hiện thêm cách này cho em dễ hình dung không? Cảm ơn bác trước
Thử code.Lót dép hóng @snow25 giải bài này với dic !!!!!
Sub fdfsdfs()
Dim i As Long, lr As Long, dic As Object, arr, kq, data, T, k As Integer, c As Long, tong As Double, dk As String, a As Long
Set dic = CreateObject("scripting.dictionary")
With Sheets("DMHD")
lr = .Range("B" & Rows.Count).End(xlUp).Row
arr = .Range("B7:F" & lr).Value
ReDim kq(1 To UBound(arr) + 100, 1 To 5)
For i = 1 To UBound(arr)
dk = arr(i, 3)
If Not dic.exists(dk) Then
dic.Add dk, Array(i)
Else
T = dic.Item(dk)
ReDim Preserve T(UBound(T) + 1)
T(UBound(T)) = i
dic.Item(dk) = T
End If
Next i
data = dic.keys
For k = 0 To UBound(data)
a = a + 1
c = a
kq(a, 1) = WorksheetFunction.Roman(k + 1)
kq(a, 2) = data(k)
dk = data(k)
T = dic.Item(dk)
For i = 0 To UBound(T)
a = a + 1
kq(a, 1) = i + 1
kq(a, 2) = arr(T(i), 1)
kq(a, 3) = arr(T(i), 2)
kq(a, 4) = arr(T(i), 5)
kq(c, 4) = kq(c, 4) + kq(a, 4)
Next i
tong = tong + kq(c, 4)
Next k
a = a + 2
kq(a, 3) = "Tong cong"
kq(a, 4) = tong
lr = .Range("J" & Rows.Count).End(xlUp).Row
If lr > 6 Then .Range("J6:N" & lr).ClearContents
.Range("J6:N6").Resize(a).Value = kq
End With
Set dic = Nothing
End Sub
Dạng nầy dữ liệu không nhiều tốc độ code rất nhanhTôi mới tham gia Diễn đàn và muốn nhờ các Anh chị giúp tôi 1 đoạn code VBA đính kèm file sau. Xin trân trọng cảm ơn!
Sub XYZ()
Dim sh As Worksheet, sArr(), res(), aCP
Dim sRow&, i&, r&, stt&, j&, k&, c&, tong#
aCP = Array("", "HDVATTU", "HDMTC", "HDNC", "HDTP")
Set sh = Sheets("DMHD")
sArr = sh.Range("B7:G" & sh.Range("B" & Rows.Count).End(xlUp).Row).Value
sRow = UBound(sArr)
ReDim res(1 To sRow + 6, 1 To 5)
For c = 1 To UBound(aCP)
k = k + 1: r = k: stt = 0
res(r, 1) = WorksheetFunction.Roman(c)
res(r, 2) = aCP(c)
For i = 1 To sRow
If sArr(i, 3) = aCP(c) Then
k = k + 1
stt = stt + 1
res(k, 1) = stt
res(k, 2) = sArr(i, 1)
res(k, 3) = sArr(i, 2)
res(k, 4) = sArr(i, 5)
res(k, 5) = sArr(i, 6)
res(r, 4) = res(r, 4) + sArr(i, 5)
tong = tong + sArr(i, 5)
End If
Next i
Next c
res(k + 2, 3) = "TONG CONG"
res(k + 2, 4) = tong
sh.Range("J6:N1000").Clear
sh.Range("J6").Resize(k + 2, 5) = res
End Sub
Chào bác,Dùng tạm trong khi chờ các cao thủ khác ra tay:
PHP:Option Explicit Sub test() Dim lr&, i&, j&, k&, c&, sum As Double, grand As Double, t&, arrKQ, rngDM, rngDS, cell As Range Sheets("DMHD").Activate lr = Cells(Rows.Count, "B").End(xlUp).Row rngDS = Sheets("Sheet2").Range("A1:B" & Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Row).Value ' Danh sách loai hop dong, them cot B dien giai ten hop dong rngDM = Range("B7:G" & lr).Value ReDim arrKQ(1 To 10000, 1 To 5) For i = 1 To UBound(rngDS) For j = 1 To UBound(rngDM) If rngDS(i, 1) = rngDM(j, 3) Then c = c + 1' dem so lan xuat hien cua hop dong k = k + 1 If c = 1 Then ' tai dong dau tien cua loai hop dong t = k' danh dau dong dau tien arrKQ(k, 1) = WorksheetFunction.Roman(i) ' dong tong hop moi loai hop dong cua vung ket qua arrKQ(k, 2) = rngDM(j, 3) arrKQ(k, 3) = rngDS(i, 2) k = k + 1 ' dong dau tien cua chi tiet arrKQ(k, 1) = c arrKQ(k, 2) = rngDM(j, 1) arrKQ(k, 3) = rngDM(j, 2) arrKQ(k, 4) = rngDM(j, 5) arrKQ(k, 5) = rngDM(j, 6) sum = sum + rngDM(j, 5)' cong don gia tri cua tung loai hop dong Else 'k = k + 1 arrKQ(k, 1) = c ' dong chi tiet arrKQ(k, 2) = rngDM(j, 1) arrKQ(k, 3) = rngDM(j, 2) arrKQ(k, 4) = rngDM(j, 5) arrKQ(k, 5) = rngDM(j, 6) sum = sum + rngDM(j, 5) ' cong don gia tri cua tung loai hop dong End If End If Next arrKQ(t, 4) = sum' gan sum cho dong dau tien cua hop dong grand = grand + sum ' cong don tat ca cac loai hop dong c = 0: sum = 0 Next arrKQ(k + 2, 3) = "TONG CONG" arrKQ(k + 2, 4) = grand Range("J6:N100").Delete Range("J6").Resize(UBound(arrKQ), 5) = arrKQ For Each cell In Range("J6").Resize(UBound(arrKQ), 1).SpecialCells(xlCellTypeConstants, xlTextValues) cell.Resize(1, 5).Font.Bold = True Next Range(Cells(k + 7, "L"), Cells(k + 7, "M")).Font.Bold = True End Sub