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
>
>
>