Truy vấn dữ liệu theo điều kiện bằng hàm hoặc VBA

buiquangthuan

Quyết tâm học để biết đến VBA
Tham gia ngày
17 Tháng mười hai 2010
Bài viết
229
Được thích
58
Điểm
395
Nơi ở
Bắc Ninh
Chào các Thầy cô
Do sếp bắt phải quản lý giờ tăng ca của nhân viên trong bộ phận nên em tạo form nhờ các thầy cô giúp đỡ với ạ.
Hiện tại em có form (như đính kèm) gồm 3 sheet: FORM , DATA, Q-LY
Yêu cầu:
Các cột được bôi màu vàng ở sheet FORM sẽ lấy dữ liệu từ sheet DATA và Q-LY theo ngày hiện tại.

Em cũng đã lấy ví dụ ngày hôm nay luôn và kết quả sẽ trả về tương ứng như trong file đính kèm.

Vậy nên nhờ các thầy cô giúp em với ạ. Em cám ơn
 

File đính kèm

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,079
Được thích
11,182
Điểm
1,560
Chào các Thầy cô
Do sếp bắt phải quản lý giờ tăng ca của nhân viên trong bộ phận nên em tạo form nhờ các thầy cô giúp đỡ với ạ.
Hiện tại em có form (như đính kèm) gồm 3 sheet: FORM , DATA, Q-LY
Yêu cầu:
Các cột được bôi màu vàng ở sheet FORM sẽ lấy dữ liệu từ sheet DATA và Q-LY theo ngày hiện tại.

Em cũng đã lấy ví dụ ngày hôm nay luôn và kết quả sẽ trả về tương ứng như trong file đính kèm.

Vậy nên nhờ các thầy cô giúp em với ạ. Em cám ơn
Thử code
Mã:
Sub Form_Run()
  Dim i As Long, ik As Long, eR As Long, eC As Long, sR As Long, sC As Long
  Dim aData(), aQLy(), Res(), S, Rng As Range
  Dim Ngay As Date, dNam As Date, dThang As Date, ThoiGian, GioPhut As String
 
  Ngay = Date
  With Range("A14:AD36")
    ReDim Res(1 To .Rows.Count, 1 To .Columns.Count)
  End With
  Set Rng = Sheets("Form").Range("AG14:AG36")
  With Sheets("Data")
    eR = .Range("A" & Rows.Count).End(xlUp).Row
    If eR < 7 Then MsgBox ("Khong co du lieu"): Exit Sub
    aData = .Range("A7:E" & eR).Value
    GioPhut = .Range("C1")
  End With
  With Sheets("Q-Ly")
    sR = .Range("A1").End(xlDown).Row
    sC = .Range("A1").End(xlToRight).Column
    aQLy = .Range("A1").Resize(sR, sC).Value
  End With
  dNam = DateSerial(Year(Ngay), 1, 1)
  dThang = DateSerial(Year(Ngay), Month(Ngay), 1)
  For j = 3 To sC
    If aQLy(1, j) = Ngay Then
      For i = 2 To sR
        ThoiGian = aQLy(i, j)
        If ThoiGian > 0 Then
          k = k + 1
          Res(k, 1) = k
          Res(k, 2) = aQLy(i, 1)
          Res(k, 7) = aQLy(i, 2)
          Res(k, 20) = ThoiGian
          
          If Rng(k, 1) = "HC" Then S = 2 Else S = Rng(k, 1) + 1
          Res(k, 15) = aData(ThoiGian, S)

          For jk = 3 To j
            If aQLy(1, jk) >= dThang Then Res(k, 23) = Res(k, 23) + aQLy(i, jk)
            If aQLy(1, jk) >= dNam Then Res(k, 24) = Res(k, 24) + aQLy(i, jk)
          Next jk
          
          Res(k, 25) = GioPhut
          S = Split(Application.Trim(Res(k, 7)), " ")
          Res(k, 29) = S(UBound(S))
        End If
      Next i
      Exit For
    End If
  Next j
  If k Then Sheets("Form").Range("A14").Resize(k, 29) = Res
End Sub
 

buiquangthuan

Quyết tâm học để biết đến VBA
Tham gia ngày
17 Tháng mười hai 2010
Bài viết
229
Được thích
58
Điểm
395
Nơi ở
Bắc Ninh
Thầy ơi. Đoạn code này đang được thầy setup cho ngày hiện thại đúng không ạ. Chẳng hạn khi em nhập lần 1 rồi cho chạy code. thì nó đúng. nhưng trường hợp em sửa lần 2. cho chạy lại. thì nó cứ vẫn giữ y kết quả như lần 1 ạ
 

buiquangthuan

Quyết tâm học để biết đến VBA
Tham gia ngày
17 Tháng mười hai 2010
Bài viết
229
Được thích
58
Điểm
395
Nơi ở
Bắc Ninh
Cám ơn @HieuCD ạ. vấn đề trên em đã sửa được rồi ạ. Em test sau rồi thông tin thêm cho anh sau ạ
 

buiquangthuan

Quyết tâm học để biết đến VBA
Tham gia ngày
17 Tháng mười hai 2010
Bài viết
229
Được thích
58
Điểm
395
Nơi ở
Bắc Ninh
Chào Thầy @HieuCD . cám ơn thầy vì đã giúp đỡ em hoàn thành form trên. Có 1 chút vấn đề em gặp phải khi chạy đoạn code trên:
- Trên sheet "FORM", cột Lũy kế tháng và năm số liệu nhảy chưa chính xác thầy ạ?
- Phần Lũy kế tháng cách lấy khác với ban đầu em đưa ra yêu cầu: do công ty em tính tháng lương dựa vào 1 nửa tháng trước và 1 nửa tháng sau (ví dụ: tháng tính lương tháng 1/2019 sẽ bắt đầu từ 16/12/2018 đến 15/01/2019). khả năng vì thế mà chỗ lũy kế tháng nó ra số liệu không khớp.
- Còn cột lũy kế năm thì nhảy chưa đúng.
Chính vì vậy phiền thầy 1 lần nữa kiểm tra giúp em đươc không ạ. vì em không biết chỗ code của thầy phải chỉnh sửa chỗ nào ạ. xin cám ơn thầy nhiều
 

buiquangthuan

Quyết tâm học để biết đến VBA
Tham gia ngày
17 Tháng mười hai 2010
Bài viết
229
Được thích
58
Điểm
395
Nơi ở
Bắc Ninh
Thầy ơi. em xin lỗi. dữ liệu lũy kế năm đúng rồi ạ
 

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,079
Được thích
11,182
Điểm
1,560
Chào Thầy @HieuCD . cám ơn thầy vì đã giúp đỡ em hoàn thành form trên. Có 1 chút vấn đề em gặp phải khi chạy đoạn code trên:
- Trên sheet "FORM", cột Lũy kế tháng và năm số liệu nhảy chưa chính xác thầy ạ?
- Phần Lũy kế tháng cách lấy khác với ban đầu em đưa ra yêu cầu: do công ty em tính tháng lương dựa vào 1 nửa tháng trước và 1 nửa tháng sau (ví dụ: tháng tính lương tháng 1/2019 sẽ bắt đầu từ 16/12/2018 đến 15/01/2019). khả năng vì thế mà chỗ lũy kế tháng nó ra số liệu không khớp.
- Còn cột lũy kế năm thì nhảy chưa đúng.
Chính vì vậy phiền thầy 1 lần nữa kiểm tra giúp em đươc không ạ. vì em không biết chỗ code của thầy phải chỉnh sửa chỗ nào ạ. xin cám ơn thầy nhiều
Ngày 10/8/2019. Nói rỏ lũy kế tháng và năm , từ ngày nào tới ngày nao?
Gởi file với kết quả đúng nhập tay mà code chạy sai để mình kiểm tra
 

buiquangthuan

Quyết tâm học để biết đến VBA
Tham gia ngày
17 Tháng mười hai 2010
Bài viết
229
Được thích
58
Điểm
395
Nơi ở
Bắc Ninh
Ngày 10/8/2019. Nói rỏ lũy kế tháng và năm , từ ngày nào tới ngày nao?
Gởi file với kết quả đúng nhập tay mà code chạy sai để mình kiểm tra
Em lấy ngày 12/08 để nhập giờ tăng ca. Sheet("FORM") là kết quả em muốn ạ. Lũy kế năm thì đúng rồi. Xin lỗi thầy do em đặt sai công thức. Còn lũy kế tháng = từ ngày 16 tháng trước đến 15 tháng này
 

File đính kèm

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,079
Được thích
11,182
Điểm
1,560
Em lấy ngày 12/08 để nhập giờ tăng ca. Sheet("FORM") là kết quả em muốn ạ. Lũy kế năm thì đúng rồi. Xin lỗi thầy do em đặt sai công thức. Còn lũy kế tháng = từ ngày 16 tháng trước đến 15 tháng này
Lũy kế tháng từ 16 tháng trước (nầy) đến ngày hiện tại
Mã:
Sub Form_Run()
  Dim i As Long, ik As Long, eR As Long, eC As Long, sR As Long, sC As Long
  Dim aData(), aQLy(), Res(), S, Rng As Range
  Dim Ngay As Date, dNam As Date, dThang As Date, ThoiGian, GioPhut As String
 
  Ngay = Date  'Ngay Hien hanh
  With Range("A14:AD36")
    ReDim Res(1 To .Rows.Count, 1 To .Columns.Count)
  End With
  Set Rng = Sheets("Form").Range("AG14:AG36")
  With Sheets("Data")
    eR = .Range("A" & Rows.Count).End(xlUp).Row
    If eR < 7 Then MsgBox ("Khong co du lieu"): Exit Sub
    aData = .Range("A7:E" & eR).Value
    GioPhut = .Range("C1")
  End With
  With Sheets("Q-Ly")
    sR = .Range("A1").End(xlDown).Row
    sC = .Range("A1").End(xlToRight).Column
    aQLy = .Range("A1").Resize(sR, sC).Value
  End With
  dNam = DateSerial(Year(Ngay), 1, 1)
  If tmp < 16 Then
    dThang = DateSerial(Year(Ngay), Month(Ngay) - 1, 16)
  Else
    dThang = DateSerial(Year(Ngay), Month(Ngay), 16)
  End If
  For j = 3 To sC
    If aQLy(1, j) = Ngay Then
      For i = 2 To sR
        ThoiGian = aQLy(i, j)
        If ThoiGian > 0 Then
          k = k + 1
          Res(k, 1) = k
          Res(k, 2) = aQLy(i, 1)
          Res(k, 7) = aQLy(i, 2)
          Res(k, 20) = ThoiGian
          
          If Rng(k, 1) = "HC" Then S = 2 Else S = Rng(k, 1) + 1
          Res(k, 15) = aData(ThoiGian, S)

          For jk = 3 To j
            If aQLy(1, jk) >= dThang Then Res(k, 23) = Res(k, 23) + aQLy(i, jk)
            If aQLy(1, jk) >= dNam Then Res(k, 24) = Res(k, 24) + aQLy(i, jk)
          Next jk
          
          Res(k, 25) = GioPhut
          S = Split(Application.Trim(Res(k, 7)), " ")
          Res(k, 29) = S(UBound(S))
        End If
      Next i
      Exit For
    End If
  Next j
  Sheets("Form").Range("A14").Resize(UBound(Res), 29) = Res
End Sub
 

buiquangthuan

Quyết tâm học để biết đến VBA
Tham gia ngày
17 Tháng mười hai 2010
Bài viết
229
Được thích
58
Điểm
395
Nơi ở
Bắc Ninh
Bảng dưới tính nguyên tháng, code tính theo bảng trên tới ngày hiện tại
Thầy @HieuCD ạ. Em phiền thầy chút được không ạ. Sau vài hôm test đoạn code thầy viết. Em có phát hiện ra chỗ này nhảy không đúng ạ
Mã:
 If Rng(k, 1) = "HC" Then S = 2 Else S = Rng(k, 1) + 1
          Res(k, 15) = aData(ThoiGian, S)
Phiền thầy có thể xem qua chút cho em được không ạ
 

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,079
Được thích
11,182
Điểm
1,560
Thầy @HieuCD ạ. Em phiền thầy chút được không ạ. Sau vài hôm test đoạn code thầy viết. Em có phát hiện ra chỗ này nhảy không đúng ạ
Mã:
 If Rng(k, 1) = "HC" Then S = 2 Else S = Rng(k, 1) + 1
          Res(k, 15) = aData(ThoiGian, S)
Phiền thầy có thể xem qua chút cho em được không ạ
Chỉnh
If Rng(k, 1) = "HC" Then S = 2 Else S = Rng(k, 1) + 1
Thành
If Rng(k, 1) = "HC" Then S = 2 Else S = Rng(k, 1) + 2
 
Top Bottom