Pagi om @Caton
Saya mempunyai case seperti pada gambar dibawah ini
Bisakah dikondisikan dengan VBA yaa om
File dan penjelasan terlampir
Terima kasih atas bantuannya :)
Pagi om @Caton
Saya mempunyai case seperti pada gambar dibawah ini
Bisakah dikondisikan dengan VBA yaa om
File dan penjelasan terlampir
Terima kasih atas bantuannya :)
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.
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
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.
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 :)
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.