Nhờ giúp cách lọc dữ liệu vào Báo cáo chi tiết trong excell bằng VBA

Liên hệ QC

muexcell

Thành viên chính thức
Tham gia
14/5/21
Bài viết
52
Được thích
8
Nhờ diễn đàn giải pháp excell mình mới biết về VBA,và thấy rất phù hợp với nhu cầu của việc mình đang làm nhưng mình vẫn chưa viết đc nên nhờ mọi người giúp
Từ bảng cáo cáo tổng hợp hàng ngày mình cần làm báo cáo chi tiết dựa theo điều kiện thay đổi ở các ô B5:B7 ( thời gian và mã hàng tại sheet thịt)
Nhờ mọi người viết giùm mình và cho mình cái hướng dẫn để mình có thể viết các sheet còn lại.
nhờ mọi người giúp mình với
Xin cảm ơn
 

File đính kèm

  • BCKDT5.xlsx
    174.6 KB · Đọc: 14
Lần chỉnh sửa cuối:
Chạy rồi bạn ơi
thông tin mới chạy mà số hàng thông tin cũ vẫn còn phía dưới.
bạn xem giúp mình
(^-^) cảm ơn bạn.
Chưa xóa dữ liệu cũ ấy mà. Bạn chép code này thay cho code cũ:
Rich (BB code):
Sub Loc_SQL()
Dim Ngay1 As String, Ngay2 As String, MS As String
Dim Rec As Object, dong As Long
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Sheet5.Range("A9:D5000").ClearContents
    
    Ngay1 = "#" & Sheet5.Range("B5") & "#"
    Ngay2 = "#" & Sheet5.Range("B6") & "#"
    MS = "'" & Sheet5.Range("B7") & "'"
    Dim cnn As String
    cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=No"""
    Set Rec = CreateObject("ADODB.Recordset")
    With Rec
        .Open ("Select F2,F3,F4,F6 From [THUCHI$A10:F592] Where F4 = " & MS & " And  F2 Between " & Ngay1 & " And " & Ngay2), cnn
        Sheet5.Range("A9").CopyFromRecordset .DataSource
        .Close
        .Open ("Select count(F2) From [THUCHI$A10:F592] Where F4 = " & MS & " And  F2 Between " & Ngay1 & " And " & Ngay2), cnn
        dong = Rec(0)
        .Close
        .Open ("Select sum(F6) From [THUCHI$A10:F592] Where F4 = " & MS & " And  F2 Between " & Ngay1 & " And " & Ngay2), cnn
        Sheet5.Range("D" & dong + 9).CopyFromRecordset .DataSource
        .Close
    End With
    Set Rec = Nothing
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
 
Upvote 0
Khi mình chạy máy báo như thế này bạn,bảng báo cáo tự động mình chạy hôm qua giờ ko đc
Nhờ bạn xem giúp
cảm ơn bạn nhiều
Chỉnh sub ABC để có thể chạy sự kiện cho các sheet khác, Lhi ô B7 =Empty sẽ liệt kê tất cả
Mã:
Sub ABC()
  Dim sArr(), Res()
  Dim sRow&, i&, k&, fDay, eDay, MH$, total#
 
  With Sheets("THUCHI")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 10 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("B10:F" & i).Value
  End With
  sRow = UBound(sArr)
 
  With ActiveSheet
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 8 Then .Range("A9:D" & i).Clear
    fDay = .Range("B5").Value: eDay = .Range("B6").Value
    MH = .Range("B7").Value
    If Len(MH) = 0 Then MH = "*"
    If TypeName(fDay) = "Date" And TypeName(eDay) = "Date" Then
      ReDim Res(1 To sRow, 1 To 4)
      For i = 1 To sRow
        If sArr(i, 1) >= fDay Then
          If sArr(i, 1) <= eDay Then
            If sArr(i, 3) Like MH Then
              k = k + 1
              Res(k, 1) = sArr(i, 1): Res(k, 2) = sArr(i, 2)
              Res(k, 3) = sArr(i, 3): Res(k, 4) = sArr(i, 5)
              total = total + sArr(i, 5)
            End If
          End If
        End If
      Next i
      If k Then
        k = k + 1
        Res(k, 3) = "Tong Cong": Res(k, 4) = total
        .Range("A9").Resize(k, 4) = Res
        .Range("A9").Resize(k, 4).Borders.LineStyle = 1
      ElseIf fDay > eDay Then
        MsgBox ("Tu Ngay phai <= Den Ngay!")
      End If
    Else
      MsgBox ("Phai Nhap chinh xac Ngay Thang!")
    End If
  End With
End Sub
Code trong sheet THỊT
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("B5:B7")) Is Nothing Then
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Call ABC 'Su kien goi sub ABC
    Application.ScreenUpdating = True
    Application.EnableEvents = True
  End If
End Sub
Copy code cho các sheet khác nếu muốn chạy sự kiện tương tự
 

File đính kèm

  • BCKDT5.xlsm
    198.4 KB · Đọc: 15
Upvote 0
Chỉnh sub ABC để có thể chạy sự kiện cho các sheet khác, Lhi ô B7 =Empty sẽ liệt kê tất cả
Mã:
Sub ABC()
  Dim sArr(), Res()
  Dim sRow&, i&, k&, fDay, eDay, MH$, total#
 
  With Sheets("THUCHI")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 10 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("B10:F" & i).Value
  End With
  sRow = UBound(sArr)
 
  With ActiveSheet
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 8 Then .Range("A9:D" & i).Clear
    fDay = .Range("B5").Value: eDay = .Range("B6").Value
    MH = .Range("B7").Value
    If Len(MH) = 0 Then MH = "*"
    If TypeName(fDay) = "Date" And TypeName(eDay) = "Date" Then
      ReDim Res(1 To sRow, 1 To 4)
      For i = 1 To sRow
        If sArr(i, 1) >= fDay Then
          If sArr(i, 1) <= eDay Then
            If sArr(i, 3) Like MH Then
              k = k + 1
              Res(k, 1) = sArr(i, 1): Res(k, 2) = sArr(i, 2)
              Res(k, 3) = sArr(i, 3): Res(k, 4) = sArr(i, 5)
              total = total + sArr(i, 5)
            End If
          End If
        End If
      Next i
      If k Then
        k = k + 1
        Res(k, 3) = "Tong Cong": Res(k, 4) = total
        .Range("A9").Resize(k, 4) = Res
        .Range("A9").Resize(k, 4).Borders.LineStyle = 1
      ElseIf fDay > eDay Then
        MsgBox ("Tu Ngay phai <= Den Ngay!")
      End If
    Else
      MsgBox ("Phai Nhap chinh xac Ngay Thang!")
    End If
  End With
End Sub
Code trong sheet THỊT
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("B5:B7")) Is Nothing Then
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Call ABC 'Su kien goi sub ABC
    Application.ScreenUpdating = True
    Application.EnableEvents = True
  End If
End Sub
Copy code cho các sheet khác nếu muốn chạy sự kiện tương tự
Mình chạy được hết rồi
Cảm ơn bạn rất nhiều
Cho mình hỏi mốn định dạng font chữ trong VBA để ra báo cáo cho đẹp thì dùng câu lệnh như thế nào,cột số tiền mình muốn ra định dạng số,
cột "số tiền" mình dùng câu lệnh :range("d:d").numberformat không được.
Mình muốn dùng font chữ time roman cho toàn bộ bảng chi tiết,chỉnh bảng kết quả lúc chạy VBA ra như vầy.
 

File đính kèm

  • Screenshot (11).png
    Screenshot (11).png
    347.5 KB · Đọc: 4
Upvote 0
Mình chạy được hết rồi
Cảm ơn bạn rất nhiều
Cho mình hỏi mốn định dạng font chữ trong VBA để ra báo cáo cho đẹp thì dùng câu lệnh như thế nào,cột số tiền mình muốn ra định dạng số,
cột "số tiền" mình dùng câu lệnh :range("d:d").numberformat không được.
Mình muốn dùng font chữ time roman cho toàn bộ bảng chi tiết,chỉnh bảng kết quả lúc chạy VBA ra như vầy.
Chỉnh lại
Mã:
Sub ABC()
  Dim sArr(), Res()
  Dim sRow&, i&, k&, fDay, eDay, MH$, total#
 
  With Sheets("THUCHI")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 10 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("B10:F" & i).Value
  End With
  sRow = UBound(sArr)
 
  With ActiveSheet
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 8 Then .Range("A9:D" & i).Clear
    fDay = .Range("B5").Value: eDay = .Range("B6").Value
    MH = .Range("B7").Value
    If Len(MH) = 0 Then MH = "*"
    If TypeName(fDay) = "Date" And TypeName(eDay) = "Date" Then
      ReDim Res(1 To sRow, 1 To 4)
      For i = 1 To sRow
        If sArr(i, 1) >= fDay Then
          If sArr(i, 1) <= eDay Then
            If sArr(i, 3) Like MH Then
              k = k + 1
              Res(k, 1) = sArr(i, 1): Res(k, 2) = sArr(i, 2)
              Res(k, 3) = sArr(i, 3): Res(k, 4) = sArr(i, 5)
              total = total + sArr(i, 5)
            End If
          End If
        End If
      Next i
      If k Then
        k = k + 1
        Res(k, 3) = "Tong Cong": Res(k, 4) = total
        .Range("A9").Resize(k, 4) = Res
        .Range("A9").Resize(k, 4).Borders.LineStyle = 1
        .Range("A9").Resize(k, 4).Font.Name = "Times New Roman"
        .Range("D9").Resize(k).NumberFormat = "#,###"
      ElseIf fDay > eDay Then
        MsgBox ("Tu Ngay phai <= Den Ngay!")
      End If
    Else
      MsgBox ("Phai Nhap chinh xac Ngay Thang!")
    End If
  End With
End Sub
 
Upvote 0
Chỉnh lại
Mã:
Sub ABC()
  Dim sArr(), Res()
  Dim sRow&, i&, k&, fDay, eDay, MH$, total#
 
  With Sheets("THUCHI")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 10 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("B10:F" & i).Value
  End With
  sRow = UBound(sArr)
 
  With ActiveSheet
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 8 Then .Range("A9:D" & i).Clear
    fDay = .Range("B5").Value: eDay = .Range("B6").Value
    MH = .Range("B7").Value
    If Len(MH) = 0 Then MH = "*"
    If TypeName(fDay) = "Date" And TypeName(eDay) = "Date" Then
      ReDim Res(1 To sRow, 1 To 4)
      For i = 1 To sRow
        If sArr(i, 1) >= fDay Then
          If sArr(i, 1) <= eDay Then
            If sArr(i, 3) Like MH Then
              k = k + 1
              Res(k, 1) = sArr(i, 1): Res(k, 2) = sArr(i, 2)
              Res(k, 3) = sArr(i, 3): Res(k, 4) = sArr(i, 5)
              total = total + sArr(i, 5)
            End If
          End If
        End If
      Next i
      If k Then
        k = k + 1
        Res(k, 3) = "Tong Cong": Res(k, 4) = total
        .Range("A9").Resize(k, 4) = Res
        .Range("A9").Resize(k, 4).Borders.LineStyle = 1
        .Range("A9").Resize(k, 4).Font.Name = "Times New Roman"
        .Range("D9").Resize(k).NumberFormat = "#,###"
      ElseIf fDay > eDay Then
        MsgBox ("Tu Ngay phai <= Den Ngay!")
      End If
    Else
      MsgBox ("Phai Nhap chinh xac Ngay Thang!")
    End If
  End With
End Sub
Cảm ơn bạn nhiều.
 
Upvote 0
Chỉnh lại
Mã:
Sub ABC()
  Dim sArr(), Res()
  Dim sRow&, i&, k&, fDay, eDay, MH$, total#
 
  With Sheets("THUCHI")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 10 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("B10:F" & i).Value
  End With
  sRow = UBound(sArr)
 
  With ActiveSheet
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 8 Then .Range("A9:D" & i).Clear
    fDay = .Range("B5").Value: eDay = .Range("B6").Value
    MH = .Range("B7").Value
    If Len(MH) = 0 Then MH = "*"
    If TypeName(fDay) = "Date" And TypeName(eDay) = "Date" Then
      ReDim Res(1 To sRow, 1 To 4)
      For i = 1 To sRow
        If sArr(i, 1) >= fDay Then
          If sArr(i, 1) <= eDay Then
            If sArr(i, 3) Like MH Then
              k = k + 1
              Res(k, 1) = sArr(i, 1): Res(k, 2) = sArr(i, 2)
              Res(k, 3) = sArr(i, 3): Res(k, 4) = sArr(i, 5)
              total = total + sArr(i, 5)
            End If
          End If
        End If
      Next i
      If k Then
        k = k + 1
        Res(k, 3) = "Tong Cong": Res(k, 4) = total
        .Range("A9").Resize(k, 4) = Res
        .Range("A9").Resize(k, 4).Borders.LineStyle = 1
        .Range("A9").Resize(k, 4).Font.Name = "Times New Roman"
        .Range("D9").Resize(k).NumberFormat = "#,###"
      ElseIf fDay > eDay Then
        MsgBox ("Tu Ngay phai <= Den Ngay!")
      End If
    Else
      MsgBox ("Phai Nhap chinh xac Ngay Thang!")
    End If
  End With
End Sub
Hi bạn
Cho mình hỏi thêm,trước giờ là mình chạy bên chi,riêng còn một sheet cuối mình chạy bên thu.
Thì ra kết quả như bảng này(không hiện ra cột số tiền),bạn chỉnh giùm mình với.
Cho mình hỏi thêm là tô màu cho ô tổng cộng đc ko?
Cảm ơn bạn nhiều lắm lắm...
 

File đính kèm

  • Screenshot (19).png
    Screenshot (19).png
    314.5 KB · Đọc: 3
Upvote 0
Hi bạn
Cho mình hỏi thêm,trước giờ là mình chạy bên chi,riêng còn một sheet cuối mình chạy bên thu.
Thì ra kết quả như bảng này(không hiện ra cột số tiền),bạn chỉnh giùm mình với.
Cho mình hỏi thêm là tô màu cho ô tổng cộng đc ko?
Cảm ơn bạn nhiều lắm lắm...
Gởi file với kết quả mong muốn nhập tay
 
Upvote 0
Mình gởi file,bạn xem giúp.
Cảm ơn bạn.
code trong sheet nghiệp vụ, có 2 lệnh
Call Thu_Chi(4, 4) 'Sheet nghiep vu "THU"
'Call Thu_Chi(10, 5) 'Sheet nghiep vu "CHI"
chọn 1 trong 2 phù hợp với nghiệp vụ thu hoặc chi
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("B5:B7")) Is Nothing Then
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Call Thu_Chi(4, 4) 'Sheet nghiep vu "THU"
    'Call Thu_Chi(10, 5) 'Sheet nghiep vu "CHI"
    Application.ScreenUpdating = True
    Application.EnableEvents = True
  End If
End Sub
Bỏ sub ABC thay bằng
Mã:
Sub Thu_Chi(ByVal fRow&, ByVal jCol&)
  Dim sArr(), Res()
  Dim sRow&, i&, k&, fDay, eDay, MH$, total#
 
  With Sheets("THUCHI")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < fRow Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("B" & fRow & ":F" & i).Value
  End With
  sRow = UBound(sArr)
 
  With ActiveSheet
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 8 Then .Range("A9:D" & i).Clear
    fDay = .Range("B5").Value: eDay = .Range("B6").Value
    MH = .Range("B7").Value
    If Len(MH) = 0 Then MH = "*"
    If TypeName(fDay) = "Date" And TypeName(eDay) = "Date" Then
      ReDim Res(1 To sRow, 1 To 4)
      For i = 1 To sRow
        If sArr(i, 1) >= fDay Then
          If sArr(i, 1) <= eDay Then
            If sArr(i, 3) Like MH Then
              k = k + 1
              Res(k, 1) = sArr(i, 1): Res(k, 2) = sArr(i, 2)
              Res(k, 3) = sArr(i, 3): Res(k, 4) = sArr(i, jCol)
              total = total + sArr(i, jCol)
            End If
          End If
        End If
      Next i
      If k Then
        k = k + 1
        Res(k, 3) = "Tong Cong": Res(k, 4) = total
        .Range("A9").Resize(k, 4) = Res
        .Range("A9").Resize(k, 4).Borders.LineStyle = 1
        .Range("A9").Resize(k, 4).Font.Name = "Times New Roman"
        .Range("D9").Resize(k).NumberFormat = "#,###"
        .Range("D9").Offset(k - 1).Interior.ColorIndex = 17
      ElseIf fDay > eDay Then
        MsgBox ("Tu Ngay phai <= Den Ngay!")
      End If
    Else
      MsgBox ("Phai Nhap chinh xac Ngay Thang!")
    End If
  End With
End Sub
 
Upvote 0
code trong sheet nghiệp vụ, có 2 lệnh
Call Thu_Chi(4, 4) 'Sheet nghiep vu "THU"
'Call Thu_Chi(10, 5) 'Sheet nghiep vu "CHI"
chọn 1 trong 2 phù hợp với nghiệp vụ thu hoặc chi
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("B5:B7")) Is Nothing Then
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Call Thu_Chi(4, 4) 'Sheet nghiep vu "THU"
    'Call Thu_Chi(10, 5) 'Sheet nghiep vu "CHI"
    Application.ScreenUpdating = True
    Application.EnableEvents = True
  End If
End Sub
Bỏ sub ABC thay bằng
Mã:
Sub Thu_Chi(ByVal fRow&, ByVal jCol&)
  Dim sArr(), Res()
  Dim sRow&, i&, k&, fDay, eDay, MH$, total#
 
  With Sheets("THUCHI")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < fRow Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("B" & fRow & ":F" & i).Value
  End With
  sRow = UBound(sArr)
 
  With ActiveSheet
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 8 Then .Range("A9:D" & i).Clear
    fDay = .Range("B5").Value: eDay = .Range("B6").Value
    MH = .Range("B7").Value
    If Len(MH) = 0 Then MH = "*"
    If TypeName(fDay) = "Date" And TypeName(eDay) = "Date" Then
      ReDim Res(1 To sRow, 1 To 4)
      For i = 1 To sRow
        If sArr(i, 1) >= fDay Then
          If sArr(i, 1) <= eDay Then
            If sArr(i, 3) Like MH Then
              k = k + 1
              Res(k, 1) = sArr(i, 1): Res(k, 2) = sArr(i, 2)
              Res(k, 3) = sArr(i, 3): Res(k, 4) = sArr(i, jCol)
              total = total + sArr(i, jCol)
            End If
          End If
        End If
      Next i
      If k Then
        k = k + 1
        Res(k, 3) = "Tong Cong": Res(k, 4) = total
        .Range("A9").Resize(k, 4) = Res
        .Range("A9").Resize(k, 4).Borders.LineStyle = 1
        .Range("A9").Resize(k, 4).Font.Name = "Times New Roman"
        .Range("D9").Resize(k).NumberFormat = "#,###"
        .Range("D9").Offset(k - 1).Interior.ColorIndex = 17
      ElseIf fDay > eDay Then
        MsgBox ("Tu Ngay phai <= Den Ngay!")
      End If
    Else
      MsgBox ("Phai Nhap chinh xac Ngay Thang!")
    End If
  End With
End Sub
Đúng hết rồi bạn.
Cảm ơn bạn rất nhiều.(^-^).
 
Upvote 0
Web KT

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

Back
Top Bottom