Nhờ sửa code lọc danh sách duy nhất (1 người xem)

Liên hệ QC

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

kieuhuy_bmt

Thành viên thường trực
Tham gia
18/10/07
Bài viết
288
Được thích
36
Nghề nghiệp
Đang thất nghiệp
Kính gửi các Pro!
Tôi có 1 đoạn Code trích lọc danh sách duy nhất, copy trên GPE về với hy vọng sửa thêm nếm để sử dụng vào công việc, nhưng vọc mãi mà kg được (dốt quá) nay đành lại nhờ các Bác.
Nhờ các bác bày cho sửa cái code ở đoạn nào để thêm được cột và xuất sang 1 sheet khác.
Các bác xem File dưới đây (file nhẹ mà sao kg gửi lên trực tiếp được đành gửi qua Mediefre). Cảm ơn mọi người và xin lỗi tác giả của Code này.
http://www.mediafire.com/?6u7ker9oghm7ewl
 
Kính gửi các Pro!
Tôi có 1 đoạn Code trích lọc danh sách duy nhất, copy trên GPE về với hy vọng sửa thêm nếm để sử dụng vào công việc, nhưng vọc mãi mà kg được (dốt quá) nay đành lại nhờ các Bác.
Nhờ các bác bày cho sửa cái code ở đoạn nào để thêm được cột và xuất sang 1 sheet khác.
Các bác xem File dưới đây (file nhẹ mà sao kg gửi lên trực tiếp được đành gửi qua Mediefre). Cảm ơn mọi người và xin lỗi tác giả của Code này.
http://www.mediafire.com/?6u7ker9oghm7ewl
Cái này bạn dùng PivotTable cái rẹt là ra ngay, cân gì phải code
 
Upvote 0
Kính gửi các Pro!
Tôi có 1 đoạn Code trích lọc danh sách duy nhất, copy trên GPE về với hy vọng sửa thêm nếm để sử dụng vào công việc, nhưng vọc mãi mà kg được (dốt quá) nay đành lại nhờ các Bác.
Nhờ các bác bày cho sửa cái code ở đoạn nào để thêm được cột và xuất sang 1 sheet khác.
Các bác xem File dưới đây (file nhẹ mà sao kg gửi lên trực tiếp được đành gửi qua Mediefre). Cảm ơn mọi người và xin lỗi tác giả của Code này.
http://www.mediafire.com/?6u7ker9oghm7ewl

Xài Pivottable đi cho khoẻ, code làm gì cho nhức đầu

Nhưng nếu muốn nhức đầu thì mình tặng cho cái code lu xu bu này đọc cho đuối luôn
 

File đính kèm

Upvote 0
Nếu dữ liệu không quá lớn (tốc độ chậm) thì thử dùng củ chuối này

Mã:
Sub Duynhat()
    Application.ScreenUpdating = False
    [h:k].Clear
    [a1].SpecialCells(5).Copy [h1]
    [h1].SpecialCells(5).Offset(1).Sort [h2], 1
    Set Rng = Range([h2], [h65000].End(3))
    For Each cls In Rng
        If cls(2) <> cls And cls > 0 Then cls(2).Resize(, 4).Insert Shift:=xlDown
    Next
    Range("h2:h" & [i65000].End(3).Row).Offset(, 1).Resize(, 3).Copy [i3]
    With Rng.SpecialCells(2)
        For i = 1 To .Areas.Count
            For j = 2 To 3
                .Areas(i)(1).Offset(, j) = Application.Sum(.Areas(i).Offset(1, j))
                .Areas(i).Offset(1).ClearContents
            Next
        Next
    End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đoạn mã này các bác làm vội nên sai

Sub duynhat_thongke()
Dim dic As Object
Dim dulieu, i As Long, j As Long, kq(), dl, r, a, b, c, d
Set dic = CreateObject("scripting.dictionary")
dulieu = Range([a2], [a65536].End(3)).Resize(, 4).Value
ReDim kq(1 To UBound(dulieu), 1 To 4)
With dic
For i = 1 To UBound(dulieu)
If Not .exists(dulieu(i, 1) & dulieu(i, 2)) Then
r = r + 1
.Add dulieu(i, 1) & dulieu(i, 2), ""
kq(r, 1) = dulieu(i, 1): kq(r, 2) = dulieu(i, 2)
End If
Next
End With
With Sheet2
.[a6:d10000].ClearContents
.[a6].Resize(r, 2) = kq
.Range(.[a6], .[a65536].End(3)).Resize(, 4).Sort key1:=.[a5], key2:=.[b5], header:=1
dl = .Range(.[a6], .[a65536].End(3)).Resize(, 4).Value
End With
ReDim kq(1 To UBound(dulieu), 1 To 4)
For j = 1 To UBound(dl)
For i = 1 To UBound(dulieu)
If dl(j, 1) = dulieu(i, 1) And dl(j, 2) = dulieu(i, 2) Then
kq(j + a, 2) = dl(j, 2)
kq(j + a, 3) = kq(j + a, 3) + dulieu(i, 3)
kq(j + a, 4) = kq(j + a, 4) + dulieu(i, 4)
c = c + dulieu(i, 3): d = d + dulieu(i, 4)
End If
Next
r = IIf(j = UBound(dl), 0, 1)
If r = 0 Then
kq(j + a + 1, 1) = dl(j, 1): kq(j + a + 1, 2) = "TOTAL"
kq(j + a + 1, 3) = c: kq(j + a + 1, 4) = d
End If
If dl(j, 1) <> dl(j + r, 1) Then
kq(j + a + 1, 1) = dl(j, 1): kq(j + a + 1, 2) = "TOTAL"
kq(j + a + 1, 3) = c: kq(j + a + 1, 4) = d
a = a + 1: b = b + 1: c = 0: d = 0
End If
Next
Sheet2.[a6].Resize(j + b, 4) = kq
Set dic = Nothing
End Sub

Mã A00z của bà C, nó tổng hợp cho ô B
nhờ các bác xem giúp
 
Upvote 0
Mã A00z của bà C, nó tổng hợp cho ô B
nhờ các bác xem giúp

Bạn đọc kỹ kết quả đi, kết quả của từng người mình thống kế phía dưới không phải thống kê phía trên như file của bạn

Nếu dữ liệu không quá lớn (tốc độ chậm) thì thử dùng củ chuối này

Mã:
Sub Duynhat()
    Application.ScreenUpdating = False
    [h:k].Clear
    [a1].SpecialCells(5).Copy [h1]
    [h1].SpecialCells(5).Offset(1).Sort [h2], 1
    Set Rng = Range([h2], [h65000].End(3))
    For Each cls In Rng
        If cls(2) <> cls And cls > 0 Then cls(2).Resize(, 4).Insert Shift:=xlDown
    Next
    Range("h2:h" & [i65000].End(3).Row).Offset(, 1).Resize(, 3).Copy [i3]
    With Rng.SpecialCells(2)
        For i = 1 To .Areas.Count
            For j = 2 To 3
                .Areas(i)(1).Offset(, j) = Application.Sum(.Areas(i).Offset(1, j))
                .Areas(i).Offset(1).ClearContents
            Next
        Next
    End With
End Sub

Thuật toán này quá hay, ngắn gọn mà mình không nghĩ ra. Giờ mới học được.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn đọc kỹ kết quả đi, kết quả của từng người mình thống kế phía dưới không phải thống kê phía trên như file của bạn

Xin lỗi bác,mắt kém, nhìn kg ra. Bác chỉ giúp: nếu muốn phát triển thêm nhiều cột thi sửa code ra sao.

Thuật toán này quá hay, ngắn gọn mà mình không nghĩ ra. Giờ mới học được.
Cũng như code của bác nếu muốn phát triển thêm nhiều cột thi sửa code này thế nào.
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng may dữ liệu chỉ cần lọc duy nhất 2 cột ---> Nếu mà lọc cở chừng 10 cột thì không biết các đại cao thủ sẽ viết sao? (riêng tôi không dám tưởng tượng)
 
Upvote 0
Em nghĩ phương án dùng Pivot là ngon nhất. Sao chúng ta không sử dụng nó trong khi nó đáp ứng theo đúng yêu cầu.
 
Upvote 0
Cái này bạn dùng PivotTable cái rẹt là ra ngay, cân gì phải code
Kính gửi Bác ndu96081631!
Với PivotTable, có lần tôi làm thấy vấn đề chỉnh sửa để in, trang trí cho vừa mắt thì PivotTable còn hạn chế (đấy là những trang đơn giản) còn những dữ liệu có nhiều cấp thì tôi chưa làm bao giờ, thấy cũng khó làm lắm.
Bác ndu96081631 quay giúp đoạn VIDEO giúp tôi làm với (tôi dùng of 2007).
 
Upvote 0
Xin lỗi bác,mắt kém, nhìn kg ra. Bác chỉ giúp: nếu muốn phát triển thêm nhiều cột thi sửa code ra sao.


Cũng như code của bác nếu muốn phát triển thêm nhiều cột thi sửa code này thế nào.

Thử với file này xem, bao nhiêu cột số lượng cũng được tự động câp nhật. Nhưng code này xử lý trên bảng tính nên chậm như rùa. Mới thử dữ liệu có 1000 dòng và 5 cột số lượng mà đã rùa rồi. Nhiều nữa thì chả biết ra sao
 

File đính kèm

Upvote 0
Thử với file này xem, bao nhiêu cột số lượng cũng được tự động câp nhật. Nhưng code này xử lý trên bảng tính nên chậm như rùa. Mới thử dữ liệu có 1000 dòng và 5 cột số lượng mà đã rùa rồi. Nhiều nữa thì chả biết ra sao
mất 7 phút cho khỏang 12 ngàn dòng. Tuy nhiên thế cũng tốt rồi, vì nó cho phép tự động "thêm cột".
Các Bác có cách nào cải thiện tốc độ giúp anh em.
 
Lần chỉnh sửa cuối:
Upvote 0
Thử với file này xem, bao nhiêu cột số lượng cũng được tự động câp nhật. Nhưng code này xử lý trên bảng tính nên chậm như rùa. Mới thử dữ liệu có 1000 dòng và 5 cột số lượng mà đã rùa rồi. Nhiều nữa thì chả biết ra sao
Chậm thì mình dùng cách khác, ADO chẳn hạn.
PHP:
Public cnn As New ADODB.Connection

Sub Moketnoi()

  With cnn
    .ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & _
                        ThisWorkbook.FullName & "; " & _
                        "Extended Properties=Excel 8.0;"
    .CursorLocation = adUseClient
    .Open
  End With
    
End Sub

Sub Tinh()

Dim t, tArr As Variant
Dim adoRS As ADODB.Recordset
Dim sSQL As String
If cnn.State <> 1 Then Moketnoi
sSQL = "SELECT [KHACH], [SP], Sum([SL1]), Sum([SL2]), Sum([SL3]), Sum([SL4]), Sum([SL5]) " & _
        "FROM [DATA$] " & _
        "GROUP BY [KHACH], [SP];"

Set adoRS = New ADODB.Recordset
adoRS.Open sSQL, cnn
If adoRS.RecordCount Then
  tArr = adoRS.GetRows()
  ReDim t(1 To UBound(tArr, 2) + 1, 1 To UBound(tArr) + 1)
  For iR = 0 To UBound(tArr, 2)
    For iC = 0 To UBound(tArr)
      t(iR + 1, iC + 1) = tArr(iC, iR)
    Next iC
  Next iR
Else
Exit Sub
End If
With Sheet2
    .[A6].Resize(adoRS.RecordCount, 7) = t
    .Activate
End With
adoRS.Close: Set adoRS = Nothing
cnn.Close: Set cnn = Nothing
Erase tArr, t

End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Còn nhiều cách mà, nhưng chưa nghĩ ra. Hic

Dùng thử 2 vòng lặp và không sort nhưng code phức tạp quá
PHP:
Sub TaoBC()
Dim Tg
Tg = Timer
FirstCode
Dim endR&, i&, s&, k&, nR&, sodong&, SumRws&, j&, T&
Dim sMa$, sMaKh$, MyStr$
Dim sArr(), rArr, ArrKH, ArrKq
Dim Dic As Object, DicKH As Object
Set Dic = CreateObject("Scripting.Dictionary")
Set DicKH = CreateObject("Scripting.Dictionary")
With Sheets("Data")
  On Error Resume Next
    .ShowAllData
  On Error GoTo 0
  endR = .Cells(65000, 1).End(3).Row
  sArr = .Range("A2:D" & endR).Value
End With
s = 0: T = 0: sodong = 0
ReDim rArr(1 To UBound(sArr), 1 To 4)
ReDim ArrKH(1 To UBound(sArr), 1 To 2)
For i = 1 To UBound(sArr)
  sMa = sArr(i, 1) & sArr(i, 2)
  If Not Dic.Exists(sMa) Then
    s = s + 1
    Dic.Add sMa, s
    rArr(s, 1) = sArr(i, 1) 'KH
    rArr(s, 2) = sArr(i, 2) 'SP
  End If
  nR = Dic.Item(sMa)
  rArr(nR, 3) = rArr(nR, 3) + sArr(i, 3)
  rArr(nR, 4) = rArr(nR, 4) + sArr(i, 4)
  
  'Phan nay lay du lieu ArrKH de subtotal
  sMaKh = sArr(i, 1)
  If Not DicKH.Exists(sMaKh) Then
    T = T + 1
    DicKH.Add sMaKh, T
    ArrKH(T, 1) = sArr(i, 1) 'KH
  End If
  iR = DicKH.Item(sMaKh)
  'ArrKH(iR, 2) = ArrKH(iR, 2) + 1
  sodong = sodong + 1
  If InStr(ArrKH(iR, 2), vbBack & nR) = 0 Then
    ArrKH(iR, 2) = ArrKH(iR, 2) & vbBack & nR
  End If
Next i
ReDim ArrKq(1 To sodong + 1, 1 To 4)
nR = 0
'Tao them dong SubTotal
For i = 1 To T
  MyStr = Right(ArrKH(i, 2), Len(ArrKH(i, 2)) - 1) 'Bo VBBack o dau
  aSplit = Split(MyStr, vbBack)
  For j = LBound(aSplit) To UBound(aSplit)
    nR = nR + 1
    For k = 2 To 4
      ArrKq(nR, k) = rArr(aSplit(j), k)
    Next k
  Next j
  nR = nR + 1
  ArrKq(nR, 1) = ArrKH(i, 1)
  ArrKq(nR, 2) = "Total"
  SumRws = UBound(aSplit) + 1
  For k = 3 To 4
    ArrKq(nR, k) = "=Subtotal(9,R[-1]C:R[-" & SumRws & "]C)"
  Next k
Next i
nR = nR + 1
ArrKq(nR, 2) = "Sub Total"
For k = 3 To 4
    ArrKq(nR, k) = "=Subtotal(9,R[-1]C:R[-" & nR - 1 & "]C)"
Next k
With Sheets("TongHop")
  .[A6].Resize(1000, 4).ClearContents
  .[A6].Resize(sodong + 1, 4) = ArrKq
End With
Erase sArr(), rArr, ArrKH, ArrKq
EndCode
MsgBox Timer - Tg
End Sub
Sub EndCode()
With Application
  .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlCalculationAutomatic
End With
End Sub
Sub FirstCode()
With Application
  .EnableEvents = False: .DisplayAlerts = False: .ScreenUpdating = False: .Calculation = xlCalculationManual
End With
End Sub
Đổi tên sh Tong Hop thành TongHop
Gần 40.000 rows # 0.4 s
 
Lần chỉnh sửa cuối:
Upvote 0
Chậm thì mình dùng cách khác, ADO chẳn hạn.

Cho đến hiện nay, tôi nghĩ chỉ có PivotTable hoặc ADO mới có thể cho tốc độ nhanh thôi
Các code viết theo kiểu khác thôi khỏi nghĩ đến cho mất công (vì biết thực tế dữ liệu có bao nhiêu cột đâu mà lường trước)
--------------------------
Chú Dom này xem ra cũng học được "chân truyền" của HLMT rồi chứ
 
Upvote 0
Cho đến hiện nay, tôi nghĩ chỉ có PivotTable hoặc ADO mới có thể cho tốc độ nhanh thôi
Các code viết theo kiểu khác thôi khỏi nghĩ đến cho mất công (vì biết thực tế dữ liệu có bao nhiêu cột đâu mà lường trước)
--------------------------
Chú Dom này xem ra cũng học được "chân truyền" của HLMT rồi chứ
pivot table kết hợp với table đúng là cực nhanh . 49760 rows mà hết có 3.9 giây
 
Upvote 0
Dùng thử 2 vòng lặp và không sort nhưng code phức tạp quá
......
Đổi tên sh Tong Hop thành TongHop
Gần 40.000 rows # 0.4 s
Copy về máy báo lỗi và tô đỏ ở dòng sau: MyStr = Right(ArrKH(i, 2), Len(ArrKH(i, 2)) - 1) Bo VBBack o dau
bác ThuNghi xem giúp!

 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom