Wa'alaikumussalam wr wb Hai Edo,
Prosedur TransformCode nya sudah dibuat ya. Sebaiknya diletakkan di general module agar bisa digunakan oleh prosedur lainnya, termasuk prosedur-prosedur events milik sheet manapun dan sebagainya. Kemudian, cara memanggil prosedur nya diperbaiki. Kalau sempet, jalan-jalanlah ke blog milis tentang hal ini disini <http://b-excel.blogspot.co.id/2013/07/belajarvba-005-procedure-seri-1.html>, yang ada bagian tentang cara memanggil prosedur lain dari sebuah prosedur. Pada kasus Anda, berikut ini yang Anda buat : Cells(lRow, 3).Value = TransformCode.Cells(lRow, 3).Offset(0, -1).Resize(1, 2) ini yang ada diimil saya tempo lalu : transformcode cells(lrow,3).offset(0,-1).resize(1,2) dan saya rasa jelas bahwa : > tapi, ganti *bagian yang merah *dengan menunjukkan bahwa bagian yang berbunyi : cells(lrow,4).value=cells(lrow,2).value*cells(lrow,3).value 'isi kolom D if err.number=0 then 'kolom D terisi dengan baik ? cells(lrow,2).value=cells(lrow,2).value-cells(lrow,4).value 'isi kolom B endif 'selesai cek kolom D terisi dengan baik harus diganti alias HAPUS bagian merah tersebut dan tulis baris kode berikut : transformcode cells(lrow,3).offset(0,-1).resize(1,2) Ada baiknya jika tidak langsung terfokus kepada baris-baris kode nya saja, tetapi runut dari awal imil sampai akhir imil disempatkan ditelaah dengan tartil. Wassalamu'alaikum wr wb Kid 2015-11-29 8:59 GMT+07:00 Edo Hanggoro [email protected] [belajar-excel] <[email protected]>: > > > Dear Mr. Kid, > Assalamuallaikum Wr.Wb. > > Terima kasih banyak atas bantuanya, tetapi saya masih mendapatkan > kesulitan dalam melakukan proses pemanggilan transform code-nya dan selalu > error. > > Private Sub Worksheet_Change(ByVal Target As Range) > Dim rng As Range, lRow As Long > If Not Intersect(Target, Range("C:C")) Is Nothing Then 'cek yang > berubah beririsan dengan kolom C > Application.EnableEvents = False 'cegah Excel untuk responsif > terhadap perilaku > On Error Resume Next 'lewati error yang terjadi > For Each rng In Intersect(Target, Range("C:C")) 'di setiap cells > yang berubah di kolom C > lRow = rng.Row 'simpan baris > Cells(lRow, 3).Value = TransformCode.Cells(lRow, > 3).Offset(0, -1).Resize(1, 2) > Next rng 'ke range yang berubah berikutnya > On Error GoTo 0 'kembalikan setting trap error ke > default > Application.EnableEvents = True 'excel boleh responsif lagi > End If 'selesai cek > End Sub > > Saya dapatkan error di bagian yang merah tersebut. Kira-kira kesalahannya > ada dimana ya? > Mohon bantuannya sekali lagi. > > Terima kasih > > Edo > > > > > On Saturday, November 28, 2015 10:00 PM, "'Mr. Kid' [email protected] > [belajar-excel]" <[email protected]> wrote: > > > > Wa'alaikumussalam wr wb > > Hai Edo, > > *** sesuaikan dengan keadaan setempat jika berbeda dengan preview file > lampiran milik Pak Edo > Pada sebuah general module, buat prosedur berikut : (misal diberi nama > TransformCode) > public sub TransformCode( rngProc as range ) > dim lChar as long, sDate as string, sCode as string > > with rngproc 'kerja di range inputan rngProc > sdate=.cells(1).value2 'simpan nilai asli tanggal inputan > ke sdate > scode=.cells(2).value2 'simpan nilai asli kode inputan ke > scode > lchar=1 'karakter ke-1 -> mulainya > proses loop > > 'dapatkan angka pertama (max di karakter ke-6 alias ada ruang > max 5 karakter untuk header kode) > do until isnumeric( mid( scode , lchar , 1 ) ) or lchar>6 > 'cek dah nemu angka belum atau karakter diproses dah lebih dari 6 > lchar=lchar+1 'pindah ke karakter berikutnya > loop 'ke proses loop dengan nilai karakter yang baru > > 'tulis ke cells ke-2 dari inputan (posisi cell kode) > 'diawali petik satu ( ' ) > 'disambung hasil vlookup untuk ambil dari kolom H tabel > yang atas (kode barang) > 'disambung format tahun YY didahului delimiter dash ( - ) > 'disambung hasil vlookup untuk ambil dari kolom i tabel > yang bawah (kode tanggal) > 'disambung format kode digit dengan struktur format hasil > vlookup untuk ambil dari kolom i tabel yang atas (kode digit) > 'didahului delimiter dash ( - ) > .cells(2).value= "'" _ > & evaluate( "=vlookup(""" & left(scode,lchar-1) & > """,g3:h8,2,0)" ) _ > & format( sdate , "-YY" ) _ > & evaluate( "=vlookup(" & sdate & ", h12:i18 , 2 , 0 > )" ) _ > & format( mid( scode , lchar , 9 ) , "-" & evaluate( > "=vlookup(""" & left(scode,lchar-1) & """,g3:i8,3,0)" ) ) > end with > end sub > > Kemudian, pada event change milik worksheet terkait, diisi baris kode > seperti di-imil yang lalu, yang bunyinya begini : > dim rng as range,lRow as long > if not intersect( target,range("c:c") ) is nothing then 'cek yang > berubah beririsan dengan kolom C > application.enableevents=false 'cegah Excel untuk responsif > terhadap perilaku > on error resume next 'lewati error yang terjadi > for each rng in intersect( target,range("c:c") ) 'di setiap > cells yang berubah di kolom C > lrow=rng.row 'simpan baris > cells(lrow,4).value=cells(lrow,2).value*cells(lrow,3).value > 'isi kolom D > if err.number=0 then 'kolom D terisi dengan baik ? > cells(lrow,2).value=cells(lrow,2).value-cells(lrow,4).value > 'isi kolom B > endif 'selesai cek kolom D terisi dengan baik > err.clear 'hapus error yang terjadi > next rng 'ke range yang berubah berikutnya > on error goto 0 'kembalikan setting trap error ke > default > application.enableevents=true 'excel boleh responsif lagi > endif 'selesai cek > > tapi, ganti *bagian yang merah *dengan baris kode memanggil prosedur > TransformCode dengan menyertakan range yang diproses, yaitu range tanggal > inputan dan kode inputan (1 baris x 2 kolom) seperti bergini : > transformcode cells(lrow,3).offset(0,-1).resize(1,2) > yang bahasa manusianya : > "bi pibi, suruh anak buahmu si transformcode kerja ye. bi, kamu bawa > range yang bisa kamu ambil sendiri ngikutin arahanku ini, > 1. kamu ke kolom C lalu jalan sampe baris yang kuproses ini (sambil > nyerahin nota ke pibi yang isinya nomer baris Excel) > [ cells(lrow,3) ] (lrow adalah lembaran nota yang diserahkan) > 2. kalo dah nemu, kamu pindah ke kolom sebelumnya (berarti geser ke kiri > 1 kolom) tapi tetep dibaris itu ya > [ .offset( 0 , -1 ) ] (kalau kolom, ke kanan itu ples, dan ke kiri > itu min) > 3. terus, karungin tuh range, mulai tempatmu itu, sampai kamu dapetin 2 > kolom. Tapi cuman sebaris tempatmu doink ya > [ .resize( 1 , 2 ) ] > nah.. kalo dah penuh tuh karung, segera ke tempatnya si transformcode. > Dia bakal minta syarat tuh kalo disuruh. > Kalo dia minta syarat, kasihin tuh karung. Kamu harus nungguin dia sampai > selesai ya. Kalo dah selesai, lapor kesini." > > Catatan : > a. kode barang baru diset untuk maksimal diawali oleh 5 karakter bukan > angka. Silakan dikembangkan dan disesuaikan sendiri. > b. pencegahan kesalahan input tanggal (tidak bertipe datetime dan tidak > bisa dijadikan datetime yang benar) ditambahkan sendiri. > c. inputan tanggal (bertipe datetime) atau kode yang tidak ada dalam > daftar, silakan dicegah atau diberi proses sendiri. > d. pengubahan letak daftar-daftar, penambahan atau pengurangan isi dalam > daftar, dan kesesuaian tipe data dalam daftar, silakan dilakukan > penyesuaian di dalam baris-baris kode di atas secara mandiri. > e. proses yang dipicu bukan oleh pengubahan nilai kolom C atau beserta > kolom lainnya, silakan disesuaikan sendiri baris kodenya. > f. pengembangkan dan penyesuaian dengan permasalahan yang mirip tetapi > tidak sama datanya atau strukturnya, silakan dilakukan secara setahap demi > setahap secara mandiri. > > Moga-moga gak error ya.. > Kalo error, silakan dilacak dan dicari solusinya per penyebab error. > > > btw, > kenapa kasusnya selalu mengganti nilai inputan user ? kok gak ditulis di > kolom lain saja ? bukankah malah akan ada informasi dan bukti bahwa user > pernah mengisi kurang tepat (salah ketik atau seklian struktur isiannya > keliru) kalau hasil diletakkan di kolom lain. > Dan juga, bisa tanpa VBA. > Moga-moga bukan karena pengen tampak keren dengan begitu di-input langsung > ganti... Soale, dikuatirkan malah nanti jadi masalah... > Kalo jadi menimbulkan masalah, jadi gak keren lagi dah... > Moga-moga... > > Wa'alaikumussalam wr wb > Kid > > > > > 2015-11-28 14:49 GMT+07:00 [email protected] [belajar-excel] < > [email protected]>: > > > Assalamualaikum Wr.Wb. > > Dear All, > Saya sedang mencoba untuk membuat kode VBA dan mohon bantuannya untuk > dapat membuat kode VBA untuk format cell secara otomatis dimana jika > seandainya pada kolom Tanggal terdapat tanggal 1 jan 2016 dan pada kolom > Nomer Kode diketikan "SD1", maka akan secara otomatis menjadi > "SD002-1601-0001" (SD002 = Kode Barang, 16 =Kode Tahun , 02=Kode Tanggal, > 0001 =Kode Digit). > > Dan untuk lebih jelasnya saya lampirkan filenya. > Terima Kasih sebelumnya. > > Salam > > Edo > > > > > >

