Xin code tách dữ liệu theo ngày tháng (1 người xem)

  • Thread starter Thread starter LYSM
  • Ngày gửi Ngày gửi
Liên hệ QC

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

LYSM

Thành viên thường trực
Tham gia
16/3/11
Bài viết
290
Được thích
26
Em chào các anh các chị! Em có file dữ liệu muốn tách theo ngày như file đính kèm, nhờ các anh chị viết code giúp em với ạ. Em cảm ơn nhiều!
 

File đính kèm

Em chào các anh các chị! Em có file dữ liệu muốn tách theo ngày như file đính kèm, nhờ các anh chị viết code giúp em với ạ. Em cảm ơn nhiều!
Bạn dùng Code sau:
Mã:
Sub Loc()
    Dim Arr, Res, TargetDate As Date
    Dim i As Long, j As Long, k As Long
    TargetDate = VBA.DateSerial(Sheet1.[E3], Sheet1.[D3], Sheet1.[C3])
    Arr = Sheet1.Range("A7:E" & Sheet1.Range("A65536").End(3).Row)
    ReDim Res(1 To UBound(Arr, 1), 1 To 6)
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate Then
            k = k + 1
            Res(k, 1) = k
            Res(k, 2) = Arr(i, 1)
            Res(k, 3) = Arr(i, 2)
            Res(k, 4) = Arr(i, 3)
            Res(k, 5) = Arr(i, 4) / 6
            Res(k, 6) = Arr(i, 5)
        End If
    Next
    Sheet2.Range("A8:F65536").ClearContents
    Sheet2.Range("A8").Resize(k, 6) = Res
End Sub
 
Upvote 0
Bạn dùng Code sau:
Mã:
Sub Loc()
    Dim Arr, Res, TargetDate As Date
    Dim i As Long, j As Long, k As Long
    TargetDate = VBA.DateSerial(Sheet1.[E3], Sheet1.[D3], Sheet1.[C3])
    Arr = Sheet1.Range("A7:E" & Sheet1.Range("A65536").End(3).Row)
    ReDim Res(1 To UBound(Arr, 1), 1 To 6)
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate Then
            k = k + 1
            Res(k, 1) = k
            Res(k, 2) = Arr(i, 1)
            Res(k, 3) = Arr(i, 2)
            Res(k, 4) = Arr(i, 3)
            Res(k, 5) = Arr(i, 4) / 6
            Res(k, 6) = Arr(i, 5)
        End If
    Next
    Sheet2.Range("A8:F65536").ClearContents
    Sheet2.Range("A8").Resize(k, 6) = Res
End Sub

bác ơi, bác chuyển nốt cho em công thức số tồn của cột E bên sheet "Du lieu vao" sang VBA với ạ
 
Upvote 0
bác ơi, bác chuyển nốt cho em công thức số tồn của cột E bên sheet "Du lieu vao" sang VBA với ạ
Thật không hiểu tại sao bạn lại muốn chuyển "Công thức" trong khi sheet "Mo mau" là sheet trích lọc các kết quả từ sheet "Dữ liệu vào" sang?

Nếu cần công thức tại sheet Mo mau thì bạn làm công thức luôn chứ VBA để làm gì?
 
Upvote 0
Thật không hiểu tại sao bạn lại muốn chuyển "Công thức" trong khi sheet "Mo mau" là sheet trích lọc các kết quả từ sheet "Dữ liệu vào" sang?

Nếu cần công thức tại sheet Mo mau thì bạn làm công thức luôn chứ VBA để làm gì?
Bác nhiều nhầm ý em rồi ạ, em muốn chuyển đổi từ công thức sang VBA ở sheet "Du lieu vao" (công thức =IFERROR((6-MATCH(VALUE(DATE($E$3,$D$3,$C$3)-A7),$G$4:$I$4,1))*D7/6,D7) em muốn đưa luôn vào code), sheet "Mo mau" là chuẩn rồi ạ chứ không phải chuyển VBA về công thức. Vì file này có rất nhiều dữ liệu (khoảng 700 dòng) mà cùng 1 công thức lặp đi lặp lại sẽ rối nên em muốn chuyển sang VBA ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Bác nhiều nhầm ý em rồi ạ, em muốn chuyển đổi từ công thức sang VBA ở sheet "Du lieu vao" (công thức =IFERROR((6-MATCH(VALUE(DATE($E$3,$D$3,$C$3)-A7),$G$4:$I$4,1))*D7/6,D7) em muốn đưa luôn vào code), sheet "Mo mau" là chuẩn rồi ạ chứ không phải chuyển VBA về công thức. Vì file này có rất nhiều dữ liệu (khoảng 700 dòng) mà cùng 1 công thức lặp đi lặp lại sẽ rối nên em muốn chuyển sang VBA ạ

Nếu bạn muốn đơn giản công thức thì có 2 cách:

#1_ lập công thức tự tạo trong VBA
#2_ đặt Name cho nó. :-=
 
Upvote 0
Đây là Code chuyển đổi công thức của bạn
Mã:
Sub ChangeFormulas()
    Arr = Sheet1.Range("A7:E" & Sheet1.Range("A65536").End(3).Row)
    For i = 1 To UBound(Arr, 1)
        Select Case VBA.DateSerial(Sheet1.[E3], Sheet1.[D3], Sheet1.[C3]) - Arr(i, 1)
        Case Is < Sheet1.[G4]
            Arr(i, 5) = Arr(i, 4)
        Case Is = Sheet1.[G4]
            Arr(i, 5) = (6 - 1) * Arr(i, 4) / 6
        Case Is < Sheet1.[H4]
            Arr(i, 5) = (6 - 1) * Arr(i, 4) / 6
        Case Is < Sheet1.[I4]
            Arr(i, 5) = (6 - 2) * Arr(i, 4) / 6
        Case Is = Sheet1.[I4]
            Arr(i, 5) = (6 - 3) * Arr(i, 4) / 6
        Case Is > Sheet1.[I4]
            Arr(i, 5) = Arr(i, 4)
        End Select
    Next
    Sheet1.Range("A7").Resize(UBound(Arr, 1), 5) = Arr
End Sub
 
Upvote 0
Đây là Code chuyển đổi công thức của bạn
Mã:
Sub ChangeFormulas()
    Arr = Sheet1.Range("A7:E" & Sheet1.Range("A65536").End(3).Row)
    For i = 1 To UBound(Arr, 1)
        Select Case VBA.DateSerial(Sheet1.[E3], Sheet1.[D3], Sheet1.[C3]) - Arr(i, 1)
        Case Is < Sheet1.[G4]
            Arr(i, 5) = Arr(i, 4)
        Case Is = Sheet1.[G4]
            Arr(i, 5) = (6 - 1) * Arr(i, 4) / 6
        Case Is < Sheet1.[H4]
            Arr(i, 5) = (6 - 1) * Arr(i, 4) / 6
        Case Is < Sheet1.[I4]
            Arr(i, 5) = (6 - 2) * Arr(i, 4) / 6
        Case Is = Sheet1.[I4]
            Arr(i, 5) = (6 - 3) * Arr(i, 4) / 6
        Case Is > Sheet1.[I4]
            Arr(i, 5) = Arr(i, 4)
        End Select
    Next
    Sheet1.Range("A7").Resize(UBound(Arr, 1), 5) = Arr
End Sub
Em hỏi thêm một chút ạ, giờ em muốn số ngày là 1 tháng thì phải sửa code thế nào ạ? Vì tháng thừa tháng thiếu nên nếu sửa thành Arr(i,1)+30 =Targedate thì số ngày sẽ không đúng
 
Upvote 0
Chào bạn,

Mình không hiểu ý bạn muốn như thế nào? Bạn hãy mô tả cụ thể thêm 1 chút nữa.

Code bạn trích dẫn tại bài #9 chỉ là Code thay đổi công thức của bạn thôi.
 
Upvote 0
Bạn dùng Code sau:
Mã:
Sub Loc()
    Dim Arr, Res, TargetDate As Date
    Dim i As Long, j As Long, k As Long
    TargetDate = VBA.DateSerial(Sheet1.[E3], Sheet1.[D3], Sheet1.[C3])
    Arr = Sheet1.Range("A7:E" & Sheet1.Range("A65536").End(3).Row)
    ReDim Res(1 To UBound(Arr, 1), 1 To 6)
    For i = 1 To UBound(Arr, 1)
        [B]If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate Then
          [/B]  k = k + 1
            Res(k, 1) = k
            Res(k, 2) = Arr(i, 1)
            Res(k, 3) = Arr(i, 2)
            Res(k, 4) = Arr(i, 3)
            Res(k, 5) = Arr(i, 4) / 6
            Res(k, 6) = Arr(i, 5)
        End If
    Next
    Sheet2.Range("A8:F65536").ClearContents
    Sheet2.Range("A8").Resize(k, 6) = Res
End Sub
Chào bác, cụ thể là dòng bôi đậm ấy, em có 1 nhóm sản phẩm cần tách theo 1 tháng, 3 tháng v.v.. VD sản xuất 15/2 thì sẽ tách vào ngày 15/3 (1tháng nhưng chỉ có 28 ngày). Nhưng nếu sản xuất 15/3 thì tách 15/4 (cũng là 1 tháng nhưng lại là 31 ngày). Nên ko thể thay dòng trên là 30 ngày, 90 ngày được vì tháng có tháng thiếu có tháng thừa. Mong bác giúp đỡ
 
Upvote 0
Chào bạn,

Quả thật mình không hiểu bởi tách như thế nào là việc mang tính chất chuyên ngành, mình chỉ giúp được theo yêu cầu cụ thể thôi.

Mình chỉ đoán như sau:

Với Code trên thì làm theo yêu cầu bài #1. Nếu mình hiểu đúng thì bạn muốn tách theo 30, 31 ngày hoặc số ngày cụ thể. Nếu đúng bạn sửa đoạn này
Mã:
If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate

thành

Mã:
Arr(i, 1) +[COLOR=#ff0000][B] [SIZE=5]7[/SIZE][/B][/COLOR] = TargetDate
Bạn sửa số 7 thành số mong muốn, nếu muốn nhiều điều kiện thì sửa tương tự tại code đầu tiên và thay số

hoặc nếu bạn muốn chủ động số ngày thì bạn thay bởi Code
Mã:
Arr(i, 1) +[COLOR=#FF0000][B] [SIZE=5]sheet1.[A1][/SIZE][/B][/COLOR] = TargetDate

trong đó A1 là giá trị số ngày bạn muốn tách

Hy vọng là hiểu đúng ý bạn
 
Upvote 0
Chào bạn,

Quả thật mình không hiểu bởi tách như thế nào là việc mang tính chất chuyên ngành, mình chỉ giúp được theo yêu cầu cụ thể thôi.

Mình chỉ đoán như sau:

Với Code trên thì làm theo yêu cầu bài #1. Nếu mình hiểu đúng thì bạn muốn tách theo 30, 31 ngày hoặc số ngày cụ thể. Nếu đúng bạn sửa đoạn này
Mã:
If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate

thành

Mã:
Arr(i, 1) +[COLOR=#ff0000][B] [SIZE=5]7[/SIZE][/B][/COLOR] = TargetDate
Bạn sửa số 7 thành số mong muốn, nếu muốn nhiều điều kiện thì sửa tương tự tại code đầu tiên và thay số

hoặc nếu bạn muốn chủ động số ngày thì bạn thay bởi Code
Mã:
Arr(i, 1) +[COLOR=#FF0000][B] [SIZE=5]sheet1.[A1][/SIZE][/B][/COLOR] = TargetDate

trong đó A1 là giá trị số ngày bạn muốn tách

Hy vọng là hiểu đúng ý bạn
Em hiểu đoạn code đó, ý em muốn là tách theo 1 tháng (tháng thì có tháng 30, 31 ngày) chứ không phải 30 hay 31 ngày nhưng không biết có hàm tách theo đơn vị là tháng ko?
 
Upvote 0
Bạn dùng
Mã:
Arr(i, 1) = VBA.DateSerial(Year(TargetDate), Month(TargetDate) + 1, Day(TargetDate))

Nếu bạn chú ý thì bạn cứ bám vào Dateserial ở Code bên trên là có thể sửa được
 
Upvote 0
Mã:
If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate
Nếu cần tìm hạn đúng ngày thì cách cộng ngày cho từng điểm tính là cách kém hữu hiệu. Cứ mỗi dòng dữ liệu lại phải lặp lai con toán tính ?????

Trong trường hợp này, người ta trừ số tháng/ngày ra khỏi TargetDate rồi so sánh với ngày của dữ liệu. Như vậy chỉ phải tính một loạt ngày thôi.

code như vầy:

Mã:
TDate1 = DateAdd("m", -1, TargetDate) ' 1 thàng trước ngày mở mẫu
TDate2 = DateAdd("m", -3, TargetDate) ' 3 tháng trước ngày mở mẫu
...
If Arr(i, 1) TDate1 Or Arr(i, 1) = TDate2 Or Arr(i, 1) = TDate3 ...
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate
Nếu cần tìm hạn đúng ngày thì cách cộng ngày cho từng điểm tính là cách kém hữu hiệu. Cứ mỗi dòng dữ liệu lại phải lặp lai con toán tính ?????

Trong trường hợp này, người ta trừ số tháng/ngày ra khỏi TargetDate rồi so sánh với ngày của dữ liệu. Như vậy chỉ phải tính một loạt ngày thôi.

code như vầy:

Mã:
TDate1 = DateAdd("m", -1, TargetDate) ' 1 thàng trước ngày mở mẫu
TDate2 = DateAdd("m", -3, TargetDate) ' 3 tháng trước ngày mở mẫu
...
If Arr(i, 1) TDate1 Or Arr(i, 1) = TDate2 Or Arr(i, 1) = TDate3 ...

Bác ơi, em có 1 rắc rối khi chuyển về tháng là nếu rơi vào tháng thừa, thiếu. Ví dụ Dateadd("m",-1,datererial(2014,2,28)) thì nó trả về ngày 28/1, nhưng ngày 29, 30, 31/1 thì không biết phải làm như thế nào vì không có ngày 29, 30, 31 tháng 2. Em thử trong công thức sẵn có của excel thì nó sẽ lấy ngày 01,02,03 tháng 3 nhưng trong VBA những ngày này bị bỏ qua luôn. Em tải file lên cho bác dễ hình dung Mong bác giúp đỡ
 

File đính kèm

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

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

Back
Top Bottom