ongke0711 > 10-07-17, 06:50 PM
truongtrungviet > 10-07-17, 08:27 PM
(10-07-17, 06:50 PM)ongke0711 Đã viết: Cái vụ định dạng ngày/ tháng/ năm này nó rắc rồi thật.
- Anh chuyển ngày hệ thống (Windows) thành dạng: mm/dd/yyyy. Nó đúng với định dạng cho VBA code.
- Các table thì anh cứ giữ định dạng như hiện nay là:
+ Format: dd/mm/yyyy
+ Input mask: 00/00/0000
- Nhưng khi nhập liệu phải nhập tháng trước ngày sau (nhập mm/dd/yyyy) thì kết quả mới đúng yêu cầu. Khi nhập xong vô table, table sẽ tự động chuyển lại thành ngày/ tháng/ năm như định dạng.
Anh xóa dữ liệu Date và nhập lại kiểu trên đi, sẽ chạy ok.
Trích dẫn:Mình đang làm cái cách bình thường là nếu nghỉ 2 ngày thì cứ bù kế tiếp nhau thêm 2 ngày học nữa là bù thêm ngày thứ 2 và thứ 4. Anh nghĩ sao?Còn cái hàm học bù thì sao bạn ơi.
ongke0711 > 11-07-17, 03:27 AM
Option Explicit
Dim BuoiHocArr() As String
Public Function BuNgayHoc(NgayBD As Date, NgayKT As Date, BuoiHoc As String) As Integer
Dim tmpBuoiHoc As String
tmpBuoiHoc = Replace(BuoiHoc, "CN", 1)
BuoiHocArr = Split(tmpBuoiHoc, "-")
Dim tmpSoNgayBu As Integer
Dim tmpNgay As Date
Dim tmpNgayBD As Date
tmpNgay = NgayBD
tmpSoNgayBu = 0
Do Until tmpNgay > NgayKT
If DCount("*", "tblNgayNghiChung", "[NgayNghi] =#" & tmpNgay & "#") > 0 Then
If IsInArray(Weekday(tmpNgay), BuoiHocArr) Then
tmpSoNgayBu = tmpSoNgayBu + 1
End If
End If
tmpNgay = tmpNgay + 1
Loop
BuNgayHoc = tmpSoNgayBu
End Function
Function IsInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean
Dim element As Variant
For Each element In arr
If element = stringToBeFound Then
IsInArray = True
Exit Function
End If
Next element
End Function
Public Function NgayKTKhoa(NgayBD As Date, NgayKT As Date, BuoiHoc As String) As Date
Dim intSoNgayBu As Integer
intSoNgayBu = BuNgayHoc(NgayBD, NgayKT, BuoiHoc)
If intSoNgayBu = 0 Then
NgayKTKhoa = NgayKT
Exit Function
End If
'-----------------------------------------------------------------------------------------
'Tim buoi hoc cuoi khóa vào thu may? <=> So thu tu trong mang cua ngay do - BuoiHocArr(k)
Dim i As Integer, k As Integer, j As Integer
Dim blnFlag As Boolean
Dim BuoiHocCuoi As Integer
Dim intBuoiHocCuoi_ArrNo As Integer
i = LBound(BuoiHocArr)
k = UBound(BuoiHocArr)
If BuoiHocArr(i) > Weekday(NgayKT) Then
intBuoiHocCuoi_ArrNo = k
blnFlag = True 'Dùng de tinh so tuan bu them cua code ben duoi (-1)
ElseIf BuoiHocArr(k) < Weekday(NgayKT) Then
intBuoiHocCuoi_ArrNo = k
blnFlag = False
Else
j = k
BuoiHocCuoi = BuoiHocArr(j)
Do While BuoiHocCuoi > Weekday(NgayKT)
j = j - 1
BuoiHocCuoi = BuoiHocArr(j)
intBuoiHocCuoi_ArrNo = j '--> Tim ra so thu tu trong mang Arr
Loop
blnFlag = False
End If
'------------------------------------------------------------------------------------------
'Tinh ngay bu them cuoi cung roi vao thu may?
Dim intBuoiHocBuCuoi As Integer
Dim intBuoiHocBuCuoi_ArrNo As Integer
Dim intSoTuanBuThem As Integer, SoLan As Integer
intBuoiHocBuCuoi_ArrNo = (intBuoiHocCuoi_ArrNo + intSoNgayBu) Mod (k + 1)
intBuoiHocBuCuoi = BuoiHocArr(intBuoiHocBuCuoi_ArrNo)
If blnFlag Then
intSoTuanBuThem = Int((intBuoiHocCuoi_ArrNo + intSoNgayBu) / (k + 1)) - 1
Else
intSoTuanBuThem = Int((intBuoiHocCuoi_ArrNo + intSoNgayBu) / (k + 1))
End If
NgayKTKhoa = NgayKT + (intSoTuanBuThem * 7 - Weekday(NgayKT)) + intBuoiHocBuCuoi
End Function
truongtrungviet > 11-07-17, 10:24 AM
tranthanhan1962 > 11-07-17, 05:44 PM
truongtrungviet > 11-07-17, 07:53 PM
Trích dẫn:Thôi thì gom lại ngày-tháng-năm hay tháng-ngày-năm nó rắc rối thì xé nó ra luôn. Ở table cho thêm 3 cột: Ngày, Tháng, Năm. Khi nhập dữ liệu vào tách luôn. Đến khi viết code thì dùng hàm gom nó lại theo cấu trúc code. Ý tưởng thì như vậy, nhưng không biết thực hiện như thế nào. Nếu xử lý được thì không cần đổi ngày hệ thống.Bây giờ cái đầu nó muốn nổ tung rồi anh. Em thấy phương án can thiệp code VBA Ngày theo kiểu dd/mm/yyyy là tối ưu nhất, nhưng không biết can thiệp nó như thế nào, rất mong ace trợ giúp. Xin cảm ơn tất cả vì sự nhiệt tình.
tranthanhan1962 > 11-07-17, 10:52 PM
MTNQ > 12-07-17, 06:45 AM
(11-07-17, 07:53 PM)truongtrungviet Đã viết: ...
Bây giờ cái đầu nó muốn nổ tung rồi anh. Em thấy phương án can thiệp code VBA Ngày theo kiểu dd/mm/yyyy là tối ưu nhất, nhưng không biết can thiệp nó như thế nào, rất mong ace trợ giúp. Xin cảm ơn tất cả vì sự nhiệt tình.
If DCount("*", "tblNgayNghiChung", "[NgayNghi] =#" & tmpNgay & "#") > 0 Then
If DCount("*", "tblNgayNghiChung", "[NgayNghi] =#" & Format(tmpNgay, "mm/dd/yyyy") & "#") > 0 Then
ongke0711 > 13-07-17, 11:51 PM
(12-07-17, 06:45 AM)MTNQ Đã viết: Sửa thành:
Mã:If DCount("*", "tblNgayNghiChung", "[NgayNghi] =#" & Format(tmpNgay, "mm/dd/yyyy") & "#") > 0 Then