Hai Bagus, File terlampir baru berisi prosedur DistKeSheet. Dalam prosedur tersebut sudah ada berbagai bentuk rujukan tanpa harus mengaktifkan (select atau activate) si object. Pemasangan formula bisa langsung ke banyak range (beda kolom dan baris) dengan tetap memegang kaidah absolute reference (pengaturan karakter $ dalam formual)
Harapannya, contoh satu prosedur tersebut diimplementasikan ke prosedur lainnya. Wassalam, Kid. 2013/3/16 dhen.baguse <bagusejo...@yahoo.com> > ** > > > Salam master excel,**** > ** ** > Akhir tahun 2012 saya pernah menanyakan masalah ini ke milis dan sudah > ditanggapai temen-temen milis sangat memuaskan, setelah saya mendapat > jawaban dari temen-temen milis saya mencoba untuk mengembangkan sesuai apa > yang saya butuhkan dengan menggunakan pemahaman saya sendiri. **** > Setelah saya membuat modul VBA dengan pemahaman bahasa saya sendiri, saya > mohon masukan para master excel poin-point mana yang bisa > diringkas/diefisienkan. Modul saya pindah ke notepad, tadi saya mau > kirimkan dengan excelnya ukurannya hampir 700kb jadi saya hanya copykan > modulnya saja. Gambarannya setiap sub prosedur saya bikin satu tombol, dan > bagaimana jika satu modul yang terdiri dari beberapa sub dibuat 1 tombol.* > *** > ** ** > Semoga bahsa saya tidak membingungkan temen temen....**** > > Terimaskih > > >
Option Explicit ' ---------------------------- ' ' Code by Jan Raisin ' ' untuk millis Belajar Excel ' ' 12 November 2012 ' ' ---------------------------- ' ' diubah Kid, 2013-03-17 ' nama prosedur public Sub DistKeSheet() ' deklarasi header Tanggal, range Tanggal, & cell Tanggal ' tipe data adalah range karena yang akan diambil adalah object-nya Dim hdTgl as range, rgTgl as range, cTgl As Range ' deklarasi varabel untuk menyimpan nomor baris data ' tipe data adalah long integer (Long) agar dapat memuat nilai yang sangat besar Dim rData as long, c As Long ' deklarasi variabel untuk menyimpan nama sheet ' tipe data adalah string karena akan digunakan menyimpan data berupa text / string Dim NamaSheet As String ' deklarasi variabel untuk menyimpan saldo akhir ' tipe data adalah dobel untuk mengantisipasi nilai dalam bentuk desimal Dim Saldo As Double Dim rng As Range, lRec As Long '<<<<<<<<< Baru untuk bpp Set rng = Sheet2.Range("c10").CurrentRegion '<<<<<<< baru With rng lRec = .Rows.Count - 1 If lRec > 0 Then With .Resize(lRec, 1).Offset(9, 2) .Formula = "=if(d10="""","""",row()-9)" .Parent.Calculate .Value = .Value End With With .Resize(lRec, 1).Offset(9, 5) .Formula = "=if(d10="""","""",Index(Master!$B$4:$B$46, Match(D10, Master!$C$4:$C$46, 0)))" .Parent.Calculate .Value = .Value End With 'langsung pasang formula untuk 9 kolom dengan referensi yang diatur dengan $ 'jika proses kalkulasi berat, maka sebelum proses ini, 'buat sebuah kolom bantu (satu blok formula seperti di atas) berisi formula match bagian : 'MATCH($F10,Master!$B$4:$B$46,0) 'kemudian blok formula ini diganti dengan formula Index yang bagian Match-nya merujuk 'ke kolom bantu tadi '*** saat ini, dicoba langsung ke 9 kolom dulu saja *** With .Resize(lRec, 9).Offset(9, 20) .Formula = "=IF($F10="""",0,INDEX(Master!$E$4:$M$46, MATCH($F10,Master!$B$4:$B$46,0), MATCH(u$7,Master!$E$2:$M$2,0)))" .Parent.Calculate .Value = .Value End With endif end with 'untuk membersihkan sheet 'nama sheet yang akan dibersihkan : bku,Tunai,bank,perjadin,lain,kas 'range yang akan dibersihkan di setiap sheet : range("g8") dan range data mulai b11 kebawah dan kekanan 'variabel sheet yang akan diproses dan teks berupa daftar nama sheet (beserta pemisahnya) dim sht as worksheet dim sShtName as string 'susun daftar nama sheet sebagai sebuah text disertai pemisah nama sshtname=",bku,tunai,bank,perjadin,lain,kas," 'jadi setiap sheet pasti diapit karakter koma dan semua huruf kecil 'loop setiap sheet dalam workbook for each sht in thisworkbook.worksheets if instr( sshtname, "," & lcase$(sht.name) & "," ) <> 0 then 'sht yang diproses dalam loop punya nama dalam daftar sht.Range(Range("b11"), Range("b11").End(xlDown).End(xlToRight)).ClearContents sht.Range("g8").clearcontents endif next sht ' non-aktifkan fitur screen update agar vba berjalan lebih cepat Application.ScreenUpdating = False ' tentukan lokasi header untuk tanggal ' letaknya di sheet input cell b8 Set hdTgl = Sheets("Input").Range("b8") ' tentukan lokasi range tanggel ' letaknya 1 baris di bawah header ' sampai dengan baris terakhir yang berisi data Set rgTgl = Sheets("Input").Range(hdTgl.Offset(1, 0), hdTgl.End(xlDown)) ' lakukan loop terhadap range tanggal For Each cTgl In rgTgl ' ambil nilai baris dari setiap tanggal dengan menggunakan perintah .Row rData = cTgl.Row ' lakukan loop untuk kolom J (kolom nomer 10) sampai R (kolom nomer 18) For c = 21 To 26 ' periksa kondisi apakah perpotongan antara baris & kolom bernilai 0 (nol) atau tidak If Sheets("Input").Cells(rData, c).Value <> 0 Then ' simpan sheet sesuai namanya set sht=Sheets(Sheets("Input").Cells(7, c).Value) ' simpan lokasi cell B10, karena ini adalah header tanggal dari setiap sheet set rng=sht.Range("b10") ' periksa apakah 1 baris di bawah header tanggal tersebut ada datanya atau tidak If lenb(rng.Offset(1, 0).value) = 0 Then 'data pertamakah ? 'yup, baris penulisan adalah 2 baris setelah header 'set rng dengan lokasi kolom B pada baris penulisan set rng=rng.offset(2) Else ' selain itu ' kalo sampai di sini, berarti di sheet tersebut sudah ada datanya ' dari header turun ke data yang paling bawah menggunakan perintah .End(xlDown) ' lalu turun lagi 1 baris ke baris yang kosong dengan menggunakan perintah .Offset(1, 0) 'alias turun sampai baris baru set rng=rng.End(xlDown).offset(1) ' yang ini adalah akhir dari pemeriksaan apakah di sheet yang dituju sudah ada datanya atau belum End If ' mulai dari sini kita akan bekerja dengan cell yang disimpan dalam variabel rng pada sheet terpilih ' untuk itu selalu dibuka dengan perintah With nama_object dan selalu ditutup dengan End With With rng 'tulis data nomor bukti di 1 kolom kanannya rng yang sudah merujuk ke baris penulisan rng.offset(0,1).value=Sheets("Input").Cells(rData, 3).Value ' pada aktif cell diisi dengan tanggal ' nilainya berasal dari sheet Input, terletak pada perpotongan baris dengan kolom 2 (kolom B) .Value = Sheets("Input").Cells(rData, 2).Value ' 2 kolom di sebelah kanan aktif cell diisi dengan Uraian Transaksi ' nilainya berasal dari sheet Input, terletak pada perpotongan baris dengan kolom 4 (kolom d) .Offset(, 2).Value = Sheets("Input").Cells(rData, 5).Value ' sekarang kita melakukan pengujian data terhadap kode yang tercantum dalam kolom nama baris ' dan perpotongan baris tanggal ' kondisi pertama jika kode adalah D/K If Sheets("Input").Cells(rData, c).value = "D/K" Then ' maka nilai kolom Masuk & kolom Keluar pada sheet yang terpilih ' diisi dengan nilai yang berasal dari kolom Jumlah pada sheet Input ' untuk menunjuk kolom masuk yang terletak 3 kolom di sebelah kanan cell aktif ' menggunakan perintah .Offset(, 3) .Offset(, 3).Value = Sheets("Input").Cells(rData, 9).Value ' untuk menunjuk kolom masuk yang terletak 4 kolom di sebelah kanan cell aktif ' menggunakan perintah .Offset(, 4) .Offset(, 4).Value = Sheets("Input").Cells(rData, 9).Value ' lakukan pengujian dengan kondisi berikutnya yaitu kode adalah D ElseIf Sheets("Input").Cells(rData, c).value = "D" Then ' pada kondisi ini yang diisi dengan nilai adalah kolom Masuk .Offset(, 3).Value = Sheets("Input").Cells(rData, 9).Value ' sedangkan kolom keluar diisi dengan nilai 0 (nol) .Offset(, 4).Value = 0 Else ' selain itu, berarti kode adalah K ' pada kondisi ini kolom Masuk diisi dengan 0 (nol) .Offset(, 3).Value = 0 ' sedangkan kolom Keluar diisi dengan nilai yang berasal dari sheet Input .Offset(, 4).Value = Sheets("Input").Cells(rData, 9).Value ' ini adalah penutup dari pengecekan kode End If ' sekarang dilakukan pengujian untuk menenukan nilai Saldo Akhir ' jika cell aktif ada di baris 11, berarti ini adalah data pertama If .Row = 11 Then ' maka Saldo akhir adalah nilai pada cell g7 + e11 - f11 Saldo = Range("g7").Value + Range("e11").Value - Range("f11").Value Else ' selain itu, berarti ini bukanlah data pertama ' nilai Saldo akhir berasal dari saldo akhir pada 1 baris di atasnya ' letaknya adalah 1 baris di atas cell aktif ' dan 6 kolom di sebelah kanan cell aktif ' untuk menunjuknya digunakan perintah .Offset(-1, 5) ' ditambah nilai pada kolom Masuk ' letaknya 4 kolom di sebelah kanan cell aktif ' untuk menunjuknya digunakan perintah .Offset(, 3) ' dikurangi nilai kolom Keluar ' letaknya 5 kolom di sebelah kanan cell aktif ' untuk menunjuknya digunakan perintah .Offset(, 4) Saldo = .Offset(-1, 5).Value + .Offset(, 3).Value - .Offset(, 4).Value ' ini adalah penutup dari perhitungan Saldo Akhir End If ' pada cell g8 & kolom Saldo diisi dengan nilai Saldo Akhir yang sudah diperoleh sebelumnya sht.Range("g8").Value = Saldo .Offset(, 5).Value = Saldo ' ini adalah penutup dari blok With ActiveCell [variabel rng] End With ' ini adalah penutup dari blok pemeriksaan kode transaksi End If ' periksa kolom berikutnya Next c ' periksa baris tanggal berikutnya Next cTgl ' aktifkan kembali fitur screen update Application.ScreenUpdating = True ' ini adalah akhir dari prosedur Distribusi ke setiap sheet End Sub