Tự nhảy qua ngày mới khi đến mốc 24 giờ

Liên hệ QC

Thư Sinh Áo Trắng

Thành viên hoạt động
Tham gia
26/3/21
Bài viết
160
Được thích
31
- Chia thời gian trong ngày thành 46 mốc, tức 30 phút = 1 mốc thời gian. Vậy 1 ngày có 46 mốc. Làm sao để nhảy qua ngày mới khi qua thời điểm 23h30 ngày hôm đó.
- Xin giúp đỡ công thức (hàm excel) hoặc Sub/Function (chương trình VBA) để lịch tự nhảy qua ngày mới khi kéo ô ngày vượt qua mộc 23h30
(file đính kèm)nhayquangaymoikhiden00gio00phut.jpg
 

File đính kèm

  • tunhaysangngaymoikhidenmoc0h.xlsm
    10.7 KB · Đọc: 27
Thử code này:
PHP:
Public Sub NgayGio()
Dim sDate As Long, sTime As Double, i As Long
Dim lrow As Long, a As Variant
sDate = Range("A2").Value
sTime = Range("B2").Value
lrow = (VBA.Date - sDate + 1) * 48
If lrow > 1000000 Then
    MsgBox "So dong: " & lrow & " la qua lon"
    Exit Sub
End If
ReDim a(1 To lrow, 1 To 2)

For i = 1 To lrow
    sTime = sTime + 1 / 48
    If VBA.Round(sTime, 8) >= 1 Then
        sTime = sTime Mod 1
        sDate = sDate + 1
    End If
    If sDate > Date Then Exit For
    a(i, 1) = sDate
    a(i, 2) = sTime
  
Next i
Range("A3").Resize(lrow, 2) = a
Range("A3").Resize(lrow, 1).NumberFormat = "dd/mm/yyyy"
Range("B3").Resize(lrow, 1).NumberFormat = "hh:mm"
End Sub
gggggggggggggg.jpg
Anh @phuocam ơi!
- Code trên là trường hợp 1 ngày 24 giờ chia 30 phút 1 mốc, thì có 48 mốc
- Giờ một ngày 24 giờ em chia 24*60 = 1440 phút, tức là 1 ngày chia thàng 1440 mốc
Anh giúp em chỉnh sửa code tự nhảy qua ngày mới khi đến mốc 1440 phút với ạ!
:xmasw00t: em sửa hoài nhưng không được, em kéo từ 30/04/1975 đến 30/04/1976 ạ!
Em cảm ơn anh!
 

File đính kèm

  • tunhaysangngaymoikhidenmoc0h.xlsm
    349.4 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
Anh @phuocam ơi!
- Code trên là trường hợp 1 ngày 24 giờ chia 30 phút 1 mốc, thì có 48 mốc
- Giờ một ngày 24 giờ em chia 24*60 = 1440 phút, tức là 1 ngày chia thàng 1440 mốc
Anh giúp em chỉnh sửa code tự nhảy qua ngày mới khi đến mốc 1440 phút với ạ!
:xmasw00t: em sửa hoài nhưng không được, em kéo từ 30/04/1975 đến 30/04/1976 ạ!
Em cảm ơn anh!
Tôi thấy có 2 con số 48 trong code đó. Bạn thử thay bằng 1440 xem!
Bài đã được tự động gộp:

Tôi thấy có 2 con số 48 trong code đó. Bạn thử thay bằng 1440 xem!
Bạn @phuocam đừng cười tôi nghe. Thú thật là tôi "tăng bài" hợp pháp đấy. Bạn thấy tôi nói đúng thì cho xin cái 1619432763655.png
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thấy có 2 con số 48 trong code đó. Bạn thử thay bằng 1440 xem!
Bài đã được tự động gộp:


Bạn @phuocam đừng cười tôi nghe. Thú thật là tôi "tăng bài" hợp pháp đấy. Bạn thấy tôi nói đúng thì cho xin cái View attachment 257672
0000.jpg
Code sửa mỗi chỗ đó chạy chưa được ạ!
PHP:
Sub NgayGio_1_mn_Mr_phuocam()
Dim sDate As Double, sTime As Double, i As Double, MyDate As Double
Dim lrow As Long, a As Variant
MyDate = Sheets("Sheet1").Range("N1").Value
sDate = Sheets("Sheet1").Range("O2").Value
sTime = Sheets("Sheet1").Range("P2").Value
lrow = (MyDate - sDate) * 24 * 60
If lrow > 1000000 Then Exit Sub
ReDim a(1 To lrow, 1 To 2)
For i = 1 To lrow
    sTime = sTime + 1 / (24 * 60)
    If VBA.Round(sTime, 8) >= 1 Then
        sTime = sTime Mod 8
        sDate = sDate + 1
    End If
    If sDate > Date Then Exit For
    a(i, 1) = sDate
    a(i, 2) = sTime
    
Next i
Sheets("Sheet1").Range("O3").Resize(lrow, 2) = a
Sheets("Sheet1").Range("O3").Resize(lrow, 1).NumberFormat = "dd/mm/yyyy"
Sheets("Sheet1").Range("P3").Resize(lrow, 1).NumberFormat = "hh:mm"
End Sub
Sửa như anh chỉ chắc vẫn thiếu ạ! vì qua ngày hôm sau cháu nó chỉ hiện ra số 0. Anh @phuocam @Maika8008 sửa giúp em với!
 
Lần chỉnh sửa cuối:
Upvote 0
- Giúp em bài #23 với các anh ơi
- Nếu có các ngày 21/11, 13/4, 06/9, 28/2 không dùng hàm Sort (vba) thì có thể có một Sub khác sắp xếp các ngày tăng dần được không ạ?
 
Upvote 0
Upvote 0
Sửa như anh chỉ chắc vẫn thiếu ạ! vì qua ngày hôm sau cháu nó chỉ hiện ra số 0. Anh @phuocam @Maika8008 sửa giúp em với!
Bạn dùng file này.
Cách dùng:
- Ở D2 nhập số phút làm công sai (gọi là bước nhảy, để cộng vào sau mỗi dòng).
- Ở E2 nhập dòng cuối cùng muốn làm.
- Ở A2 nhập ngày đầu, B2 nhập giờ phút đã được định dạng text "hh:mm"

Chỉ thế thôi. Code chạy đến dòng đã chỉ định ở ô E2 thì dừng.
 

File đính kèm

  • tunhaysangngaymoikhidenmoc0h.xlsm
    14.2 KB · Đọc: 6
Upvote 0
Vài tỷ dòng cũng được
Đọc lại bài #19. Người ta chỉ có "ý tưởng" thôi, chưa lường được tầm vực của yêu cầu.
Tôi không thích làm việc kiểu cắm câu này. Bạn không thể ra tiệm mua một chiếc xe hơi về trước khi biết cổng nhà mình xe ấy vào có lọt hay không. Ít nhất người hỏi phải biết mình yêu cầu gì và hậu quả của nó.
 
Upvote 0
Đọc lại bài #19. Người ta chỉ có "ý tưởng" thôi, chưa lường được tầm vực của yêu cầu.
Tôi không thích làm việc kiểu cắm câu này. Bạn không thể ra tiệm mua một chiếc xe hơi về trước khi biết cổng nhà mình xe ấy vào có lọt hay không. Ít nhất người hỏi phải biết mình yêu cầu gì và hậu quả của nó.
Code top nhảy qua ngày mới qua khi tới 00:00 của các anh và Sub noisuytuyentinh của @HieuCD thì em mới "đo được cái cổng" anh ạ!
Anh có nói từ khóa "nội suy chỉnh tối ưu phương sai" phương pháp này so với nội suy tuyến tính có ưu điểm gì ạ, và nó thực sự phức tạp về toán và vba để giải nó phải không ạ. Mong được nghe anh nói về nội suy chỉnh tối ưu phương sai.
Chúc sức khỏe anh!
 
Upvote 0
Bạn dùng file này.
Cách dùng:
- Ở D2 nhập số phút làm công sai (gọi là bước nhảy, để cộng vào sau mỗi dòng).
- Ở E2 nhập dòng cuối cùng muốn làm.
- Ở A2 nhập ngày đầu, B2 nhập giờ phút đã được định dạng text "hh:mm"

Chỉ thế thôi. Code chạy đến dòng đã chỉ định ở ô E2 thì dừng.
PHP:
Public Sub NgayGio_Mr_Maika8008()
Dim K As Long, i As Long, tmp As Long, tmp2 As Long, lrow As Long, sDate As Long
Dim sTime As String
Dim arr

K = Range("D2")   'Thay doi gia tri tu 1 den 59 phut

sDate = Range("A2")
sTime = CStr(Range("B2").Text)
lrow = Range("E2")           'Thay doi dong cuoi can lam
arr = Range("A2:B" & lrow).Value

For i = 1 To lrow - 1
    If i > 1 And i < lrow - 1 Then
        tmp = Right(arr(i - 1, 2), 2)
        tmp2 = Left(arr(i - 1, 2), 2)
        tmp = tmp + K
        If tmp >= 60 Then
            tmp2 = tmp2 + 1
            tmp = tmp - 60
            If tmp2 = 24 Then
                tmp2 = 0
                sDate = sDate + 1
            End If
        End If
        arr(i, 2) = Right("0" & tmp2, 2) & ":" & Right("0" & tmp, 2)
        arr(i, 1) = sDate
    End If
Next
Range("A3").Resize(50000, 2).ClearContents
Range("A2").Resize(lrow - 1, 2) = arr
Range("A2").Resize(lrow - 1, 1).NumberFormat = "dd/mm/yyyy"
End Sub
Cảm ơn anh nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các anh chỉnh sửa 1 trong 2 code này của anh @phuocam và anh @Maika8008, khi dữ liệu đạt số dòng 366*24*60 nó nhảy sang bảng mới, vào tạo dữ liệu cho đến ngày cuối cùng!
Thử code này:
PHP:
Public Sub NgayGio()
Dim sDate As Long, sTime As Double, i As Long
Dim lrow As Long, a As Variant
sDate = Range("A2").Value
sTime = Range("B2").Value
lrow = (VBA.Date - sDate + 1) * 48
If lrow > 1000000 Then
    MsgBox "So dong: " & lrow & " la qua lon"
    Exit Sub
End If
ReDim a(1 To lrow, 1 To 2)

For i = 1 To lrow
    sTime = sTime + 1 / 48
    If VBA.Round(sTime, 8) >= 1 Then
        sTime = sTime Mod 1
        sDate = sDate + 1
    End If
    If sDate > Date Then Exit For
    a(i, 1) = sDate
    a(i, 2) = sTime
  
Next i
Range("A3").Resize(lrow, 2) = a
Range("A3").Resize(lrow, 1).NumberFormat = "dd/mm/yyyy"
Range("B3").Resize(lrow, 1).NumberFormat = "hh:mm"
End Sub

Bạn dùng file này.
Cách dùng:
- Ở D2 nhập số phút làm công sai (gọi là bước nhảy, để cộng vào sau mỗi dòng).
- Ở E2 nhập dòng cuối cùng muốn làm.
- Ở A2 nhập ngày đầu, B2 nhập giờ phút đã được định dạng text "hh:mm"

Chỉ thế thôi. Code chạy đến dòng đã chỉ định ở ô E2 thì dừng.
777777777777.jpg
 

File đính kèm

  • tunhaysangngaymoikhidenmoc0h.xlsm
    295.3 KB · Đọc: 1
Upvote 0
Upvote 0
Vậy bạn cứ cho con số tại E2 đi
Vâng em thử lúc chiều rồi ạ!
Kết quả như code anh @phuocam
- Ý em là:
+ Số lượng dòng một Sheet là hơn một triệu (1.048.000 dòng)
+ Trong khi đó nếu em kéo thời gian theo từng phút của 2 năm trở lên thì nó bị lỗi. Ở đây VD em kéo từ 00:00 giờ, ngày 30/04/1975 đến 00:00 giờ ngày 30/04/1978. Tức là 1.578.240 dòng. Khi đó sẽ bị out memory
+ Ở bài 32 em xin các anh nâng cấp code nên môt bước nữa. Giả sở số phút của 1 năm là 365*24*60 = 525.000 dòng, khi dữ liệu vượt qua chỉ số dòng 525.000 nó sẽ tại ra bảng mới cho đến khi nào số bảng tạo ra chứa đủ số lượng dòng dữ liệu 1.578.240 dòng.
Để tránh số dòng số liệu tạo ra nhiều hơn số dòng trên 1 trang tính excel, thì đến dòng giới hạn thì tự động tạo ra bảng bên cạnh.
Nhờ anh xem dùm và nâng cấp code giúp em với!
88888888.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng em thử lúc chiều rồi ạ!
Kết quả như code anh @phuocam
- Ý em là:
+ Số lượng dòng một Sheet là hơn một triệu (1.048.000 dòng)
+ Trong khi đó nếu em kéo thời gian theo từng phút của 2 năm trở lên thì nó bị lỗi. Ở đây VD em kéo từ 00:00 giờ, ngày 30/04/1975 đến 00:00 giờ ngày 30/04/1978. Tức là 1.578.240 dòng. Khi đó sẽ bị out memory
+ Ở bài 32 em xin các anh nâng cấp code nên môt bước nữa. Giả sở số phút của 1 năm là 365*24*60 = 525.000 dòng, khi dữ liệu vượt qua chỉ số dòng 525.000 nó sẽ tại ra bảng mới cho đến khi nào số bảng tạo ra chứa đủ số lượng dòng dữ liệu 1.578.240 dòng.
Để tránh số dòng số liệu tạo ra nhiều hơn số dòng trên 1 trang tính excel, thì đến dòng giới hạn thì tự động tạo ra bảng bên cạnh.
Nhờ anh xem dùm và nâng cấp code giúp em với!
View attachment 257777
Các thông tin đã điền sẵn. Bấm nút để chạy code.

Muốn sửa vị trí chép kết quả thi báo lại tôi.
 

File đính kèm

  • tunhaysangngaymoikhidenmoc0h.xlsm
    19.7 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Các thông tin đã điền sẵn. Bấm nút để chạy code.

Muốn sửa vị trí chép kết quả thi báo lại tôi.
PHP:
Option Explicit

Public Sub NgayGio_by_Maika8008()
Dim K As Long, R As Long, i As Long, tmp As Long, tmp2 As Long, lrow As Long, sDate As Long
Dim sTime As String
Dim arr, arr2
Dim S As Double, j As Long, T As Long, C As Long, x As Long, SD As Long

sDate = Range("D2")
sTime = CStr(Range("E2").Text)
K = Range("A2")     'Thay doi gia tri tu 1 den 59 phut
R = Range("C2")
lrow = Range("B2")  'Thay doi dong cuoi can lam
x = lrow Mod R
arr = Range("D2:E" & R + 1).Value

If lrow < R Then
    MsgBox "Tong so dong khong duoc nho hon so dong cua 1 bang!"
    Exit Sub
End If

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

T = Int(lrow / R) + 1

For j = 1 To T
    C = 3 * j + 1
    SD = IIf(j < T, R, x)
    For i = 1 To SD
        If i > 1 And i < SD + 1 Then
            tmp = Right(arr(i - 1, 2), 2)
            tmp2 = Left(arr(i - 1, 2), 2)
            tmp = tmp + K
            If tmp >= 60 Then
                tmp2 = tmp2 + 1
                tmp = tmp - 60
                If tmp2 = 24 Then
                    tmp2 = 0
                    sDate = sDate + 1
                End If
            End If
            arr(i, 2) = Right("0" & tmp2, 2) & ":" & Right("0" & tmp, 2)
            arr(i, 1) = sDate
        End If
    Next
    
    Cells(2, C).Resize(50000, 2).ClearContents
    Cells(2, C).Resize(SD, 2) = arr
    Cells(2, C).Resize(SD, 1).NumberFormat = "dd/mm/yyyy"
    
    sDate = arr(SD, 1)
    sTime = arr(SD, 2)
    arr(1, 1) = sDate
    arr(1, 2) = IIf(Left(arr(SD, 2), 2) & ":" & Right("0" & Right(arr(SD, 2), 2) + 1, 2) = "23:60", _
    "00:00", Left(arr(SD, 2), 2) & ":" & Right("0" & Right(arr(SD, 2), 2) + 1, 2))
Next

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub
Đúng như mong muốn. Cảm ơn anh nhiều @Maika8008
 
Upvote 0
- Anh @phuocam @Maika8008 @HieuCD ơi, em có cái code chế không biết sai cho nào, mà chạy chưa đúng ý. Giúp em với!
(file đính kèm)
nhayngaykhonglientuc.jpg
PHP:
Sub oianh_phuocam_Maika8008_HieuCD_oi()
Dim sDate As Long, sTime As Double, i As Long, JDate()
Dim lrow As Long, a As Variant, tren As Range, duoi As Range
sDate = Range("A2").Value
sTime = Range("B2").Value
iRow = Range("D" & Rows.Count).End(xlUp).Row
JDate = Range("D2:D" & iRow).Value
For i = 1 To iRow - 1 Step 3
Set tren = Range("D" & i + 1)
Set duoi = Range("D" & i + 2)
lrow1 = lrow1 + (duoi.Value - tren.Value)
Next
lrow = lrow1 * 48
If lrow > 1000000 Then Exit Sub
ReDim a(1 To lrow, 1 To 2)
For J = 1 To iRow - 1
    For i = 1 To lrow
        sTime = sTime + 1 / 48
        If VBA.Round(sTime, 8) >= 1 Then
        sTime = sTime Mod 1
        sDate = JDate(J, 1)
        End If
        a(i, 1) = sDate
        a(i, 2) = sTime
Next i
Next J
Range("A2:B" & Range("A" & Rows.Count).End(xlUp).Row).Clear
Range("A3").Resize(lrow, 2) = a
Range("A3").Resize(lrow, 1).NumberFormat = "dd/mm/yyyy"
Range("B3").Resize(lrow, 1).NumberFormat = "hh:mm"
End Sub
 

File đính kèm

  • nhayquangaykhonglientuc.xlsm
    68 KB · Đọc: 2
Upvote 0
- Anh @phuocam @Maika8008 @HieuCD ơi, em có cái code chế không biết sai cho nào, mà chạy chưa đúng ý. Giúp em với!
(file đính kèm)
View attachment 258215
PHP:
Sub oianh_phuocam_Maika8008_HieuCD_oi()
Dim sDate As Long, sTime As Double, i As Long, JDate()
Dim lrow As Long, a As Variant, tren As Range, duoi As Range
sDate = Range("A2").Value
sTime = Range("B2").Value
iRow = Range("D" & Rows.Count).End(xlUp).Row
JDate = Range("D2:D" & iRow).Value
For i = 1 To iRow - 1 Step 3
Set tren = Range("D" & i + 1)
Set duoi = Range("D" & i + 2)
lrow1 = lrow1 + (duoi.Value - tren.Value)
Next
lrow = lrow1 * 48
If lrow > 1000000 Then Exit Sub
ReDim a(1 To lrow, 1 To 2)
For J = 1 To iRow - 1
    For i = 1 To lrow
        sTime = sTime + 1 / 48
        If VBA.Round(sTime, 8) >= 1 Then
        sTime = sTime Mod 1
        sDate = JDate(J, 1)
        End If
        a(i, 1) = sDate
        a(i, 2) = sTime
Next i
Next J
Range("A2:B" & Range("A" & Rows.Count).End(xlUp).Row).Clear
Range("A3").Resize(lrow, 2) = a
Range("A3").Resize(lrow, 1).NumberFormat = "dd/mm/yyyy"
Range("B3").Resize(lrow, 1).NumberFormat = "hh:mm"
End Sub
30/4 nhảy sang 3/5, hết 3/5 chuyện gì sẽ xảy ra :p
 
Upvote 0
Web KT

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

Back
Top Bottom