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

Liên hệ QC

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

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

- 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)View attachment 257354
Một ngày có 24 giờ / 0.5 = 48 mốc, không phải 46 mốc.
 
Upvote 0
- 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)View attachment 257354
Thử B2=IF(A2=0;"";IF(A2=A1;SUM(B1;"0:30");0))
rồi copi xuống
 
Upvote 0
Cột giờ bị thiếu mốc "11:00" và "19:00"?
Ô A3
=A2+B2+"00:30:01"
Kéo A3 xuống.
 
Upvote 0
Một phương án đơn giản cho bạn tham khảo: gõ ngày đầu tiên ở ô A2, xong làm công thức ở ô A3
=IF(B3="00:00",A2+1,A2)
Kéo xuống là ok :D
 
Upvote 0
Cột giờ bị thiếu mốc "11:00" và "19:00"?
Ô A3
=A2+B2+"00:30:01"
Kéo A3 xuống.
Một phương án đơn giản cho bạn tham khảo: gõ ngày đầu tiên ở ô A2, xong làm công thức ở ô A3
=IF(B3="00:00",A2+1,A2)
Kéo xuống là ok :D
Em cảm ơn ạ!
Các phần chia thời gian và công thức của anh @tijikama đúng cái em cần ạ!
 
Upvote 0
Làm chỉnh luôn hai đầu:
- Đầu tiên hết, chỉnh định dạng cột B là Time (hiện tại dạng General sẽ gây khó khăn về sau).
- Vào Name Manager add 1 cái name sau. Name này xác định trị của nửa giờ:
1618829908187.png
- Gõ 20/07/2020 vào ô A2, "00:00" vào ô B2
- Gõ công thức này vào A3
1618829767021.png
- Gõ công thức này vào B3
1618829824156.png

- Kéo A3:B3 xuống đến chừng nào chán thì nghỉ
 

File đính kèm

  • 1618829806573.png
    1618829806573.png
    22.7 KB · Đọc: 3
Upvote 0
Làm chỉnh luôn hai đầu:
- Đầu tiên hết, chỉnh định dạng cột B là Time (hiện tại dạng General sẽ gây khó khăn về sau).
- Vào Name Manager add 1 cái name sau. Name này xác định trị của nửa giờ:
View attachment 257381
- Gõ 20/07/2020 vào ô A2, "00:00" vào ô B2
- Gõ công thức này vào A3
View attachment 257378
- Gõ công thức này vào B3
View attachment 257380

- Kéo A3:B3 xuống đến chừng nào chán thì nghỉ
Cảm ơn anh ạ! Vậy là có đủ cách làm vừa hàm vừa code
 
Upvote 0
Cảm ơn anh ạ! Vậy là có đủ cách làm vừa hàm vừa code
Tôi cũng chả biết mấy cách.
Cách tôi đưa ra là phương pháp một người sử dụng bảng tính theo truyền thống sẽ dùng (hoặc tương tự vậy).
Các bài khác đưa ra cách truyền thống của GPE (công thức gọn đẹp), những người chuyên sử dụng công thức sẽ dùng.
 
Upvote 0
Làm chỉnh luôn hai đầu:
- Đầu tiên hết, chỉnh định dạng cột B là Time (hiện tại dạng General sẽ gây khó khăn về sau).
- Vào Name Manager add 1 cái name sau. Name này xác định trị của nửa giờ:
View attachment 257381
- Gõ 20/07/2020 vào ô A2, "00:00" vào ô B2
- Gõ công thức này vào A3
View attachment 257378
- Gõ công thức này vào B3
View attachment 257380

- Kéo A3:B3 xuống đến chừng nào chán thì nghỉ
Cách này đổi thành code VBA được không ạ!
Xin anh giúp cho vì dư liệu em nhiều quá gần 100.000 dòng dùng công thức thì nặng file về sau. Ban đầu em không lường đến vấn đề nặng file ạ!
Cụ thể ở đây em muốn kéo từ 20/07/2020 đến đến 20/04/2021 bằng VBA ạ!
Em cảm ơn anh!
 
Upvote 0
Cách này đổi thành code VBA được không ạ!
Xin anh giúp cho vì dư liệu em nhiều quá gần 100.000 dòng dùng công thức thì nặng file về sau. Ban đầu em không lường đến vấn đề nặng file ạ!
Cụ thể ở đây em muốn kéo từ 20/07/2020 đến đến 20/04/2021 bằng VBA ạ!
Em cảm ơn anh!
từ 20/07/2020 đến đến 20/04/2021 tính cách nào ra 100.000 dòng ?
 
Upvote 0
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
 
Upvote 0
If lrow > 1000000 Then

Cho dùng 500.000 dòng thôi bạn, 1 triệu lớn quá mà cũng chỉ có >48 ngàn dòng nữa là hết vốn rồi, kekekekeke @!>><
 
Upvote 0
Kéo tới đâu thì ngưng?
ô B2 lấy từ đâu? tại sao là dạng chuổi?
Có vài lý do:
- Do em dùng hàm Rand() để chế ra dữ liệu làm ví dụ ạ.
- Vợ em có bà sếp hay chơi tiền ảo đe nó đừng có chơi chăm mà làm ăn. Nhưng vẫn lo nó dấu chơi tiền ảo thì ngu người quá
- Trc đây vài năm thì có đứa bạn em học cùng lớp nó rủ chơi tiền ảo, từ chối theo kiểu không chơi đa cấp. Giờ thấy bạn hay đăng ảnh ở các khu Rì Sọt và "văn" = chuyên gia tài chính
Lên em đanh chút thời gian ngâm cứu về tiền ảo xem nó là cái gì. Mục đích xây dựng 1 số đường hồi quy bằng các dữ liệu theo quan điểm ạ của mình.
Mục đích của em muốn hiểu và tự ngâm cứu được về chứng khoán và tiền ảo nếu có cao nhân nào mách và chỉ cho để có cái nhập môm. Vì em chưa biết gì cả?
Bài đã được tự động gộp:

If lrow > 1000000 Then

Cho dùng 500.000 dòng thôi bạn, 1 triệu lớn quá mà cũng chỉ có >48 ngàn dòng nữa là hết vốn rồi, kekekekeke @!>><
Vậy là 1.048.000 ngàn dòng à anh. Khả năng dữ liệu em dùng tới 10 triệu dòng. Vậy vậy phải chia thành 10 bảng 1 triệu dòng rồi. Ko biết vba có đáp ứng đc ko anh nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy là 1.048.000 ngàn dòng à anh. Khả năng dữ liệu em dùng tới 10 triệu dòng. Vậy vậy phải chia thành 10 bảng 1 triệu dòng rồi. Ko biết vba có đáp ứng đc ko anh nhỉ?
Vụ công ty có dữ liệu cả triệu dòng mà dùng Excel, nếu gặp cụ Vetmini thì cụ trề cái môi dài cả thước và buông 1 từ: keo kiệt
/*-*/
 
Upvote 0
Khiếp. 10 triệu cái 1/2 giờ là 10000000/48/365 = 570 năm.
Một đế quốc trung bình chỉ 200 năm. Công ty này làm ăn với ai mà lâu dài thế nhỉ.
 
Upvote 0
Khiếp. 10 triệu cái 1/2 giờ là 10000000/48/365 = 570 năm.
Một đế quốc trung bình chỉ 200 năm. Công ty này làm ăn với ai mà lâu dài thế nhỉ.
Ý bác là nếu chạy trên 1 máy tính ạ.
Vậy em mới rào trc là đang ngâm cứu. Và chưa định hình được hướng khả quan.
 
Upvote 0
Có vài lý do:
- Do em dùng hàm Rand() để chế ra dữ liệu làm ví dụ ạ.
- Vợ em có bà sếp hay chơi tiền ảo đe nó đừng có chơi chăm mà làm ăn. Nhưng vẫn lo nó dấu chơi tiền ảo thì ngu người quá
- Trc đây vài năm thì có đứa bạn em học cùng lớp nó rủ chơi tiền ảo, từ chối theo kiểu không chơi đa cấp. Giờ thấy bạn hay đăng ảnh ở các khu Rì Sọt và "văn" = chuyên gia tài chính
Lên em đanh chút thời gian ngâm cứu về tiền ảo xem nó là cái gì. Mục đích xây dựng 1 số đường hồi quy bằng các dữ liệu theo quan điểm ạ của mình.
Mục đích của em muốn hiểu và tự ngâm cứu được về chứng khoán và tiền ảo nếu có cao nhân nào mách và chỉ cho để có cái nhập môm. Vì em chưa biết gì cả?
Bài đã được tự động gộp:


Vậy là 1.048.000 ngàn dòng à anh. Khả năng dữ liệu em dùng tới 10 triệu dòng. Vậy vậy phải chia thành 10 bảng 1 triệu dòng rồi. Ko biết vba có đáp ứng đc ko anh nhỉ?
Vài tỷ dòng cũng được
 
Upvote 0
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

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

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

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

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

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
Upvote 0
Ý bạn như vầy
Từ ngàyĐến ngày
4/30/19755/3/1975
6/9/19757/3/1975
8/4/19759/15/1975
10/18/197512/11/1975
20210508_083025.jpg
Chia 1 ngày thành 48 mốc 30 phút. Và đến mốc 00:00 thì nhảy sang ngày khác.
Theo thứ tự từ trên xuống dưới như cột này anh ạ. Em có làm cái If-End khi 00:00 lựa lần lượt từ trên xuống dưới nhưng chạy chưa dc.
 
Upvote 0
View attachment 258230
Chia 1 ngày thành 48 mốc 30 phút. Và đến mốc 00:00 thì nhảy sang ngày khác.
Theo thứ tự từ trên xuống dưới như cột này anh ạ. Em có làm cái If-End khi 00:00 lựa lần lượt từ trên xuống dưới nhưng chạy chưa dc.
Chạy code
Mã:
Sub ABC()
  Dim aDate(), Res(), sRow&, srRes&, i&, j&, k&
  Dim N&, dTime#, iTime#, iDate As Date
 
  dTime = 1 / 24 / (60 / 30) 'buoc nhay 30 phut
  N = Application.RoundUp(1 / dTime, 0) 'so buoc nhay 30 phut trong 1 ngay
  aDate = Range("D2", Range("D" & Rows.Count).End(xlUp)).Value
  sRow = UBound(aDate)
  srRes = sRow * N
  If srRes > 1000000 Then Exit Sub
  ReDim Res(1 To srRes, 1 To 2)
  For i = 1 To sRow
    iDate = aDate(i, 1)
    iTime = 0
    For j = 1 To N
      k = k + 1
      Res(k, 1) = iDate
      Res(k, 2) = iTime
      iTime = iTime + dTime
    Next j
  Next i
  Range("A2", Range("B" & Rows.Count).End(xlUp)).ClearContents
  Range("A2").Resize(srRes, 1).NumberFormat = "dd/mm/yyyy"
  Range("B2").Resize(srRes, 1).NumberFormat = "hh:mm"
  Range("A2").Resize(srRes, 2) = Res
End Sub
 
Upvote 0
Chạy code
Mã:
Sub ABC()
  Dim aDate(), Res(), sRow&, srRes&, i&, j&, k&
  Dim N&, dTime#, iTime#, iDate As Date

  dTime = 1 / 24 / (60 / 30) 'buoc nhay 30 phut
  N = Application.RoundUp(1 / dTime, 0) 'so buoc nhay 30 phut trong 1 ngay
  aDate = Range("D2", Range("D" & Rows.Count).End(xlUp)).Value
  sRow = UBound(aDate)
  srRes = sRow * N
  If srRes > 1000000 Then Exit Sub
  ReDim Res(1 To srRes, 1 To 2)
  For i = 1 To sRow
    iDate = aDate(i, 1)
    iTime = 0
    For j = 1 To N
      k = k + 1
      Res(k, 1) = iDate
      Res(k, 2) = iTime
      iTime = iTime + dTime
    Next j
  Next i
  Range("A2", Range("B" & Rows.Count).End(xlUp)).ClearContents
  Range("A2").Resize(srRes, 1).NumberFormat = "dd/mm/yyyy"
  Range("B2").Resize(srRes, 1).NumberFormat = "hh:mm"
  Range("A2").Resize(srRes, 2) = Res
End Sub
Em xin. Cảm ơn anh @HieuCD !
Cảm ơn các bác @VetMini @phuocam @Maika8008 đã cho code trong Top này.
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom