Bạn dùng Code sau: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!
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ạ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
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?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 ạ
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 ạ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 ạ
Dữ liệu phải copy, delete liên tục nên em ko muốn công thức ở đó nữaNế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ó.![]()
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Đâ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
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 đỡ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
If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate
Arr(i, 1) +[COLOR=#ff0000][B] [SIZE=5]7[/SIZE][/B][/COLOR] = TargetDate
Arr(i, 1) +[COLOR=#FF0000][B] [SIZE=5]sheet1.[A1][/SIZE][/B][/COLOR] = TargetDate
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?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
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ốMã:Arr(i, 1) +[COLOR=#ff0000][B] [SIZE=5]7[/SIZE][/B][/COLOR] = TargetDate
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
If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate
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 ...
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 ?????Mã:If Arr(i, 1) + 1 = TargetDate Or Arr(i, 1) + 2 = TargetDate Or Arr(i, 1) + 7 = TargetDate
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 ...