Mengatur waktu secara otomatis

  1. 2 tahun lalu

    Pagi om @Caton

    Saya mempunyai case seperti pada gambar dibawah ini
    Screenshot_3.png

    Bisakah dikondisikan dengan VBA yaa om
    File dan penjelasan terlampir

    Terima kasih atas bantuannya :)

  2. Caton

    19 Agu 2022 Terverifikasi Indonesia + 20.101 Poin

    Mbak @anggun123 ...

    Contoh scriptnya bisa begini :

    Public Sub SalinWaktu()
        Dim xlRange As Range
        
        Err.Clear: On Error Resume Next
        Set xlRange = Application.InputBox(Prompt:="Masukkan range waktu :", Type:=8)
        Err.Clear: On Error GoTo 0
        
        If Not xlRange Is Nothing Then
            If xlRange.Parent.Name <> ActiveSheet.Name Then
                MsgBox "Masukkan data dari sheet yang aktif saja!", vbExclamation Or vbOKOnly
                Exit Sub
            ElseIf xlRange.Count = 1 Then
                MsgBox "Masukkan range waktu, bukan sel!", vbExclamation Or vbOKOnly
                Exit Sub
            Else
                '+-- Proses jika kolom > 1!
                If xlRange.Columns.Count > 1 Then
                    Dim vData As Variant, vValue As Variant
                    Dim lR As Long, lC As Long
                    
                    vData = xlRange.Value2
                    
                    Err.Clear: On Error Resume Next
                    
                    For lR = LBound(vData, 1) To UBound(vData, 1)
                        For lC = LBound(vData, 2) To UBound(vData, 2)
                            If Len(vData(lR, lC)) > 0 Then
                                vValue = CDate(vData(lR, lC))
                                If Err.Number = 0 Then
                                    If CDbl(vValue) > 1 Then
                                        vValue = vValue + 1
                                    Else
                                        vValue = TimeValue(vValue)
                                    End If
                                    vData(lR, lC) = vValue
                                Else
                                    vData(lR, lC) = vbNullString
                                    Err.Clear
                                End If
                            End If
                        Next
                    Next
                    
                    Err.Clear: On Error GoTo 0
                    
                    lR = xlRange.Rows.Count: lC = xlRange.Columns.Count
                    With xlRange.Parent
                        .Cells(xlRange.Row + lR, xlRange.Column).Resize(lR, lC).Value = vData
                    End With
                End If
            End If
        End If
    End Sub

    Demikian.

  3. terima kasih om @Caton

    uda saya coba...
    ada sedikit case om...
    jadi semisal datanya di kolom A ada sebanyak 20

    tapi yg ke copy hanya sampai 3 baris saja
    harapannya sampai 20 > mengikuti data yg dikolom A

  4. Caton

    20 Agu 2022 Terverifikasi Indonesia + 20.101 Poin

    Mbak @anggun123 ...

    Perlu diketahui, contoh script di atas saya susun berdasarkan asumsi saya, yakni bahwa data waktu (tanggal dan jam) diinput dahulu, kemudian user memilih range waktu yang sudah diinput, baru kemudian menjalankan scriptnya. Masalahnya, oleh karena minimnya informasi yang diberikan, asumsi saya bisa saja tidak sesuai ekspektasi.

    Untuk contoh script di atas, ketika scriptnya dijalankan, khan muncul jendela dialog untuk memilih range waktu yang akan diproses. Klo mbak pilihnya cuma 3 baris, maka baris data yang akan diproses... ya cuma 3 baris saja itu saja.

    Untuk case yang mbak inginkan, secara garis besar algoritmanya bisa seperti berikut :

    — Tentukan baris awal untuk membuat salinan data.
    Misalkan, datanya diinput di range B3:C22. Maka salinan datanya akan dibuat mulai dari sel B23. Untuk itu, ambil baris awal untuk memproses datanya, misalkan :

    lR = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row + 1

    — Salin data yang akan diproses.
    Untuk tahapan ini, data bisa disalin dengan menggunakan Array (Variant), atau menggunakan Range Object. Script di atas menggunakan Array sebagai penampung datanya. Klo pake Range Object, contohnya :

    lR = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row + 1
    Set xlRange = ActiveSheet.Range("B3:B" & lR - 1)

    — Iterasi sebanyak baris data yang akan diproses.
    Klo data disimpan menggunakan Array, contoh proses iterasinya bisa dilihat pada script di atas. Untuk data yang tersimpan pada Range Object, contohnya bisa seperti berikut :

        lR = Sheet2.Cells(Rows.Count, "B").End(xlUp).Row + 1
        Set xlRange = Sheet2.Range("B3:B" & lR - 1)
        For Each xlCell In xlRange.Rows
            '+-- Proses aktual per baris di sini.
        Next

    Proses aktualnya bisa beragam. Saya contohkan saja untuk proses data dengan Range Object seperti berikut :

    Err.Clear: On Error Resume Next
    
    For Each xlCell In xlRange.Rows
        If Len(xlCell.Value) > 0 Then
            '+-- Proses tanggal.
            vValue = vbNullString
            vValue = CDate(xlCell.Value)
            If Err.Number = 0 Then
                vValue = vValue + 1
            End If
            
            Err.Clear: Sheet2.Cells(lR, "B").Value = vValue
            
            '+-- Proses jam.
            vValue = vbNullString
            vValue = xlCell.Offset(, 1).Value
            If Err.Number = 0 Then
                If IsNumeric(vValue) Then
                    vValue = vValue
                Else
                    vValue = TimeValue(vValue)
                End If
            End If
            
            Err.Clear: Sheet2.Cells(lR, "C").Value = vValue
            
            lR = lR + 1
        End If
    Next
    
    Err.Clear: On Error GoTo 0

    Itu saja garis besarnya. Saya yakin tidak terlalu sulit untuk menyusun kembali script yang sudah saya contohkan di atas.

    Demikian.

  5. maaf banget om @Caton
    coba utak atik tapi aku masih ora mudeng :)

    jadi begini om..
    semisal aku ada data.. sampai baris ke 25
    untuk langkah awal,,, saya buat waktu secara manual dahulu,, semisal cuma 3 data waktu

    selanjutnya, untuk data waktu mulai baris ke 7 sampai 25..
    dijalankan via VBA,, apakah masih memungkinkan :)

    Screenshot_2.png

  6. Caton

    21 Agu 2022 Terverifikasi Indonesia + 20.101 Poin
    Di sunting 2 tahun lalu oleh Caton

    Mbak @anggun123 ...

    ... selanjutnya, untuk data waktu mulai baris ke 7 sampai 25 dijalankan via VBA, apakah masih memungkinkan ...

    Sudah saya contohkan di atas. Berikut saya berikan contoh sesuai maksud mbak di atas :

    Option Explicit
    
    Public Sub SalinWaktu()
        Dim lH As Long, lR As Long, lX As Long, lY As Long, lZ As Long
        Dim lMax As Long, lLoop As Long
        Dim vData As Variant
        
        lR = Sheet2.Cells(Rows.Count, "B").End(xlUp).Row
        
        If lR > 2 Then
            vData = Sheet2.Range("B3:C" & lR).Value
            For lX = LBound(vData, 1) To UBound(vData, 1)
                vData(lX, 1) = CDate(vData(lX, 1))
                vData(lX, 2) = CDate(TimeValue(vData(lX, 2)))
            Next
            
            lH = Sheet2.Range("B3:C" & lR).Rows.Count
            lMax = Sheet2.Cells(Rows.Count, "A").End(xlUp).Row - lR
            If (lMax + lH + 2) <= lR Then Exit Sub
            
            lR = lR + 1
            lLoop = (lMax \ lH) + 1
            For lX = 1 To lLoop
                For lZ = LBound(vData, 1) To UBound(vData, 1)
                    vData(lZ, 1) = vData(lZ, 1) + 1
                Next
                
                If lMax >= lH Then
                    lMax = lMax - lH
                    lZ = lH
                Else
                    lZ = lMax
                End If
                
                Sheet2.Cells(lR, 2).Resize(lZ, 2).Value = vData
                lR = lR + lH
            Next
        End If
    End Sub

    Pada script di atas, saya asumsikan data awal sudah dalam format tanggal dan jam untuk masing-masing kolom, dan tidak ada Error Handler — jadi silahkan ditambahkan jika diperlukan. Semoga sesuai dengan yang mbak maksudkan.

    Demikian.

 

atau Mendaftar untuk ikut berdiskusi!