huyhoang1768
Nguyễn Hoàng Hùng
- Tham gia
- 21/9/11
- Bài viết
- 520
- Được thích
- 375
- Nghề nghiệp
- Kế toán
Chào anh chị Em có file gửi kèm cùng kết quả mong muốn anh chị giúp em viết đoạn code ạ em cảm ơn!
Dim Nguon As Variant, KQ(), i, j, k As Long
With Sheet1
Nguon = .[a5].Resize(.[a10000].End(3).Row, 7).Value
End With
ReDim KQ(1 To UBound(Nguon), 1 To 7)
For i = 1 To UBound(Nguon)
If Nguon(i, 1) = Sheet2.[i3] Then
k = k + 1
For j = 1 To 7
KQ(k, j) = Nguon(i, j)
Next j
[COLOR=#ff0000]tong = tong + Nguon(i, 7)[/COLOR]
End If
Next i
If k Then
With Sheet2
.Rows("5:1000").Delete
.[a5].Resize(k, 7).Value = KQ
.[g10000].End(3).Offset(1).Value = tong
.[a10000].End(3).Offset(1).Resize(, 6).Merge
.[a10000].End(3).Offset(1) = " Tong Cong"
With .[a5].Resize(k + 1, 7)
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlInsideVertical).LineStyle = xlContinuous
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
End With
End With
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tongtien As String
If Not Intersect(Target, [I3]) Is Nothing Then
tongtien = [A65536].End(3).Value
[A4:G10000].Clear
With Sheet1.[A4].CurrentRegion
.AutoFilter 1, [I3]
.SpecialCells(12).Copy [A4]
.AutoFilter
End With
[G65536].End(3).Offset(1) = "=Sum(R5C:R[-1]C)"
With [A65536].End(3).Offset(1)
.Resize(, 6).Merge
.HorizontalAlignment = xlCenter
.Value = tongtien
.CurrentRegion.Borders.Value = 1
End With
End If
End Sub
Xem đã đúng ý chưa nhé!Em cảm ơn các anh nhiều ạ, em đọc mà vẫn không hiểu nhiều lắm, đây là mình dùng autofilter lọc coppy sang pải không ạ, em thiếu mất cột STT ở đầu, giúp em sửa lại luôn được không ạ
Thầy giúp em được không ạBài này dùng Advanced Filter mới là nhanh nhất, sao không thấy ai viết code theo hướng này nhỉ?
Còn không thì chơi PivotTable, khỏi code gì ráo luôn
Tôi chẳng hiểu bạn ra sao nữa? Nhờ người ta sửa lại code mà không phản hồi gì cả? Ai chẳng biết là ô tô nhanh hơn xe đạp, nhưng lúc vội mà chưa có ô ô thì xe đạp cũng là 1 giải pháp quá tốt cho bạn rồi!Thầy giúp em được không ạvà giải thích giúp em dòng lệnh nào là input, và dòng lệnh nào là output, em tập ghép vào bài của em mà nó không ra
Thầy giúp em được không ạvà giải thích giúp em dòng lệnh nào là input, và dòng lệnh nào là output, em tập ghép vào bài của em mà nó không ra
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$I$3" Then
[COLOR=#b22222][B]Sheet1.Range("A4:G1000")[/B][/COLOR].AdvancedFilter [B][COLOR=#006400]xlFilterCopy[/COLOR][/B], [B][COLOR=#0000cd]Range("I2:I3")[/COLOR], [COLOR=#ff0000]Range("A4:G4")[/COLOR][/B]
End If
End Sub
AdvancedFilter và AutoFilter là anh em ruột mà anh NDU, èo, nhưng dạo này em đổi hướng qua dùng Auto-nếu yêu cầu lọc không chọn cột- vì không cần phải tạo vùng điều kiện và dòng tiêu đề không cần phải có sẵnBài này dùng Advanced Filter mới là nhanh nhất, sao không thấy ai viết code theo hướng này nhỉ?
Còn không thì chơi PivotTable, khỏi code gì ráo luôn
AdvancedFilter và AutoFilter là anh em ruột mà anh NDU, èo, nhưng dạo này em đổi hướng qua dùng Auto-nếu yêu cầu lọc không chọn cột- vì không cần phải tạo vùng điều kiện và dòng tiêu đề không cần phải có sẵn
Chưa hiểu lắm chỗ màu đỏ nàydạo này em đổi hướng qua dùng Auto-nếu yêu cầu lọc không chọn cột
Không pải đâu ạ, không pản hồi là vì em chưa hiểu, em đang nghiên cứu, và trong lúc nghiên cứu thì có thể tìm hiểu nhiều giải pháp khác nhau, để mình hiểu sâu hơn vấn đềTôi chẳng hiểu bạn ra sao nữa? Nhờ người ta sửa lại code mà không phản hồi gì cả? Ai chẳng biết là ô tô nhanh hơn xe đạp, nhưng lúc vội mà chưa có ô ô thì xe đạp cũng là 1 giải pháp quá tốt cho bạn rồi!
Nhưng Advanced Filter chắc chắn nhanh hơn. Trong trường hợp dữ liệu lớn, dùng AutoFilter + SpecialCells thì chắc chắn sẽ "tiêu đời" ----> Khi ấy dữ liệu bị "phân mảnh" thành nhiều vùng đến mức code không còn nhận biết được và báo lỗi mà ta chẳng biết đó là nguyên nhân gì
Chưa hiểu lắm chỗ màu đỏ này
và vùng đích đến phải có tiêu đề giống nhau
Em coppy vào thì nó báo lỗi dòngLấy dữ liệu tại bài 1 (không có STT) và làm bằng Advanced Filter theo hướng đơn giản nhất (không có dòng SUM) thì code sẽ thế này:
Để code chạy được, bạn làm như sau:Mã:Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$I$3" Then [COLOR=#b22222][B]Sheet1.Range("A4:G1000")[/B][/COLOR].AdvancedFilter [B][COLOR=#006400]xlFilterCopy[/COLOR][/B], [B][COLOR=#0000cd]Range("I2:I3")[/COLOR], [COLOR=#ff0000]Range("A4:G4")[/COLOR][/B] End If End Sub
1> Copy cell A4 của Sheet1, paste vào cell I2 của Sheet2 (để làm tiêu đề cho điều kiện lọc)
2> Copy code ở trên, mở cửa sổ VBA, chọn Sheet2 và paste vào khung bên phải
Vậy là xong, ra bảng tính, gõ SOHD vào cell I3 và xem kết quả
---------------------
Giải thích code:
- Màu nâu: Nguồn dữ liệu
- Màu xanh lá: Lọc và copy sang nơi khác
- Màu xanh dương: Điều kiện lọc
- Màu đỏ: Vùng kết quả
Sheet1.Range("A4:G1000").AdvancedFilter xlFilterCopy, Range("I2:I3"), Range("A4:G4")
Nhiều nguyên nhân lắm, chẳng hạn file gốc của bạn không có Sheet1, Sheet2...Em coppy vào thì nó báo lỗi dòng
Sheet1.Range("A4:G1000").AdvancedFilter xlFilterCopy, Range("I2:I3"), Range("A4:G4")
Cũng từ những lý do này mà em dùng Auto, vì nguời dùng hay bị mấy cái lỗi như thay đổi vùng dk, sửa dòng tiêu đề (nếu người dùng bỏ trống thì cũng đở khổ). Khi người dùng khá hơn chút thì tự nhiên họ sẽ đòi tới advanced thôi. Lúc đó có cơ hội viết lại để ôn bài. he he.Nhiều nguyên nhân lắm, chẳng hạn file gốc của bạn không có Sheet1, Sheet2...
Nói chung là: Hoặc là bạn tự mò, hoặc là đưa file lên, tránh tốn công người khác
Cũng từ những lý do này mà em dùng Auto, vì nguời dùng hay bị mấy cái lỗi như thay đổi vùng dk, sửa dòng tiêu đề (nếu người dùng bỏ trống thì cũng đở khổ). Khi người dùng khá hơn chút thì tự nhiên họ sẽ đòi tới advanced thôi. Lúc đó có cơ hội viết lại để ôn bài. he he.
Bài này dùng Advanced Filter mới là nhanh nhất, sao không thấy ai viết code theo hướng này nhỉ?
Còn không thì chơi PivotTable, khỏi code gì ráo luôn
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cl As Range, Luu As String
If Target.Address = "$I$3" Then
Set Cl = [G65536].End(3)
If Cl.Row > 4 Then
If Cells(Cl.Row, 1).Resize(, 6).Merge Then Cells(Cl.Row, 1).UnMerge
Luu = Cells(Cl.Row, 1).Value
Range([A5], Cl).Clear
End If
Sheet1.Range("A4:G16").AdvancedFilter 2, [I2:I3], [A4:G16], 0
Set Cl = [G65536].End(3).Offset(1)
Cl.Formula = "=SUM(" & Range([G5], Cl.Offset(-1)).Address & ")"
Cl.Offset(, -6) = Luu
Cl.Offset(, -6).Resize(, 6).Merge
set Cl=Nothing
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tongtien As String
If Not Intersect(Target, [I3]) Is Nothing Then
tongtien = [A65536].End(3).Value
[I2] = [A4].Value
[A5:G10000].Clear
[A4:G4] = Sheet1.[A4:G4].Value
Sheet1.[A4:G10000].AdvancedFilter 2, [I2:I3], [A4:G4]
[G65536].End(3).Offset(1) = "=Sum(R5C:R[-1]C)"
With [A65536].End(3).Offset(1)
.Resize(, 6).Merge
.HorizontalAlignment = xlCenter
.Value = tongtien
.CurrentRegion.Borders.Value = 1
End With
[I2].ClearContents
End If
End Sub
Hình như sử lý code chưa thành thạo lắm thì phải :
"Em coppy vào thì nó báo lỗi dòng
Sheet1.Range("A4:G1000").AdvancedFilter xlFilterCopy, Range("I2:I3"), Range("A4:G4") "
Bạn xem tập tin đính kèm xem được chưa nhé .
Sheet1.[A4:h2000].AdvancedFilter 2, [I2:I3], [A4]
Không phải nhà em nói code mà hình như bạn ấy không biêt dán code vào đâu, trong sheet, hay trong thisworbook hay ngoài modunle hoặc sử lý địa chỉ mấy các điều kiện trên đó thày . dòng trên là nhà em trích dẫn bài #18 bạn ấy "la" đấy ạ !Có thấy lỗi gì đâu?
Trong file bạn dùng:
Thử sửa mấy cái [I2:I3] và [A4] Thành Range("I2:I3") và Range("A4:G4") xemMã:Sheet1.[A4:h2000].AdvancedFilter 2, [I2:I3], [A4]
Em dán được rồi, để em nghiên cứu thêm có thắc mắc gì em xin trợ giúp tiếp ạ, em cảm ơn!Không phải nhà em nói code mà hình như bạn ấy không biêt dán code vào đâu, trong sheet, hay trong thisworbook hay ngoài modunle hoặc sử lý địa chỉ mấy các điều kiện trên đó thày . dòng trên là nhà em trích dẫn bài #18 bạn ấy "la" đấy ạ !