makasih pak mrkid.
telah dipelajari, dan akan tetap dipelajari agar bisa dikembangkan sendiri 
untuk solusi atas kasus2 yang mirip. sekali lagi makasih :)
imam sinurat


________________________________
 Dari: Mr. Kid <[email protected]>
Kepada: BeExcel <[email protected]> 
Dikirim: Selasa, 14 Mei 2013 12:04
Judul: Re: Re: [belajar-excel] Border Formatting - Makro
 


  



Maaf baru sempat balas.

diurutkan prosesnya lagi ya.
0. deklarasi (sepertinya sudah ok)
Dim rngData As Range
Dim rangenya_kolom3 As Range
Dim rngDiProses As Range
Dim rngAwalMerge As Range
Dim lRec As Long, r As Long



1. persiapan data (sumber) dan lokasi kerja (lokasi hasil) yang bunyinya :

With Sheet1
'Lokasi Utak-atiknya dipindah agar data aslinya tidak terganggu:: copast range 
g5 ke range s5
.Range("g5:j25").Copy Destination:=.Range("s5")

'initialisasi data
Set rngData = .Range("s8").CurrentRegion
lRec = rngData.Rows.Count - 1

Set rangenya_kolom3 = rngData.Resize(lRec, 1).Offset(1, 2)
Set rngAwalMerge = rngData.Offset(1, 2).Resize(1, 1)
End With


>> persiapan 1 adalah menyiapkan lokasi kerja (hasil), yaitu menghapus semua 
>> hasil yang lama

lokasinya di range s8 (header lokasi kerja yang bersinggungan dengan record 
data hasil)
.Range("s5").currentregion.offset(1).delete xlshiftup


>> persiapan 2 menyalin data sumber ke lokasi kerja (sudah ada) di bagian :
'Lokasi Utak-atiknya dipindah agar data aslinya tidak terganggu:: copast range 
g5 ke range s5
.Range("g5:j25").Copy Destination:=.Range("s5")


>> persiapan 3 inisialisasi area kerja
'initialisasi data
Set rngData = .Range("s8").CurrentRegion
lRec = rngData.Rows.Count - 1

Set rangenya_kolom3 = rngData.Resize(lRec, 1).Offset(1, 2)


>> persiapan 4 menyatakan bahwa saat akan dimulai, jumlah cell yang harus 
>> di-merge adalah 0 (kan belum mulai proses per record)

r=0


>> persiapan 5 menyatakan bahwa saat akan dimulai, range awal yang harus 
>> di-merge belum ada (kan belum mulai proses per record)

set rngAwalMerge=nothing
End With


karena variabel rngAwalMerge dipesan (dim) dalam prosedur, maka persiapan 5 ini 
ndak perlu ada. 
Artinya, baris yang berbunyi Set rngAwalMerge = rngData.Offset(1, 2).Resize(1, 
1) juga ndak perlu ada (dihapus saja)


2. Proses setiap record data yang butuh di-merge (loop) yang bunyinya :

'loop setiap range di kolom 3
For Each rngDiProses In rangenya_kolom3

'didalam loop ada tahap cek isi range yang sedang diproses oleh loop (pada 
contoh for each diatas adalah cek isi rngDiProses)
'jika ada isinya, maka lakukan :

If rngDiProses.Value <> "" Then

'1. merge cell dari cell awal diperluas sebanyak variabel jumlah cell

'rngAwalMerge.Resize(variabel_
jumlah_cell).Merge
r = rngDiProses.Rows.Count
rngAwalMerge.Resize(r).Merge

'2. beri border dobel dibawah range yang sedang diproses oleh loop (misal di 
rngDiProses),
'tetapi mulai kolom ke-1 (offset 2 kolom kekiri) yang diperluas 1 baris x 
sekian kolom data

rngAwalMerge.Offset(0, -2).Resize(, 4).Borders(xlEdgeBottom).LineStyle = 
xlDouble

'3. set cell awal merge baru (untuk blok merge berikutnya)

'Set rngAwalMerge = rngDiProses
Set rngAwalMerge = rngDiProses

'4. set ulang jumlah cell kembali ke 1 karena cell awal merge yang 
baru adalah cell pertama yang dimerge untuk blok merge tersebut

'jika tidak ada isinya alias kosong, maka lakukan :
'1. penambahan jumlah cell yang harus di-merge dengan 1

Else
rngAwalMerge.Resize(r + 1).Merge

End If

'sampai akhir loop, yaitu di baris Next

Next rngDiProses

>> proses 1 : membuat awal blok loop (sudah ok)
'loop setiap range di kolom 3
For Each rngDiProses In rangenya_kolom3


>> proses 2 : cek range yang diproses ada isinya atau tidak (cukup ok)
'didalam loop ada tahap cek isi range yang sedang diproses oleh loop (pada 
contoh for each diatas adalah cek isi rngDiProses)
'jika ada isinya, maka lakukan :
If rngDiProses.Value <> "" Then            'bisa juga dengan IF 
LenB(rngdiproses.value)<>0 THEN


>> proses 3 : cek lagi, jika range di proses ada isinya, harus melakukan merge 
>> pada hasil pemeriksaan sebelumnya atau tidak

--> tentu saja tandanya adalah isi nilai r. Kalau nilai r > 0, maka ada yang 
harus di-merge (minimal 1 cell)

IF r>0 then


>> proses 4 : kalau r>0 (ada yang harus di-merge), maka pastilah rngawalmerge 
>> ada isinya. 
--> maka bisa lakukan merge mulai dari rngawalmerge sebanyak r baris (diperluas)

rngawalmerge.resize( r , 1 ).merge


>> proses 5 : selesai merge lakukan border pada baris sebelum baris range yang 
>> diproses, karena baris yang diproses ini sudah baris awal merge baru akibat 
>> ada isinya

--> jadi harus lompat 1 baris ke atas lalu lompat ke kolom 1 alias 2 kolom 
ke-kiri dari range yang diproses, kemudian diperluas sebanyak 1 baris  dan 
sekian banyak kolom tabel hasil (misal 4)

rngdiproses.offset(-1,-2).resize( 1,4).borders(xledgebottom).linestyle=xldouble


--> karena borders double itu butuh garus yang tebal maka diset garis bordernya 
tebal (thick)
rngdiproses.offset(-1,-2).resize( 1,4).borders(xledgebottom).weight=xlthick


>> proses 6 : selesai cek berdasar keharusan melakukan merge (akibat nilai 
>> dalam variabel r)

endif


>> proses 7 : karena proses pada cells sebelum range di proses sudah selesai 
>> (dengan melakukan merge dan pasang border double), maka set ulang isi range 
>> awal merge dan jumlah baris yang harus di merge (minimal 1 karena range yang 
>> diproses butuh dimerge)

set rngawalmerge=rngdiproses

r=1


>> proses 8 : seluruh kondisi saat range di proses ada isinya sudah selesai, 
>> maka sekarang kondisi jika rngdiproses tak ada isinya (kosong)

ELSE


>> proses 9 : pada saat rngdiproses kosong (pada area blok ELSE)

--> tentu yang terjadi adalah melakukan pernyataan bahwa cell kosong itu harus 
dimerge bersama rngawalmerge nantinya kalau sudah tahu persis sampai dimana 
cell kosong itu.

--> artinya, jumlah cell yang harus di-merge bertambah 1. Jadi nilai variabel r 
harus ditambah 1.

r=r+1


>> proses 10 : seluruh kondisi berdasar isi range yang diproses sudah selesai

endif


>> proses 11 : seluruh proses terhadap range yang diproses selesai, jadi 
>> loopnya bisa ke rngdiproses berikutnya

next rngdiproses


3. Proses setelah loop (setelah proses nomor 2) yang bunyinya :
'setelah selesai, lakukan merge dari cell awal merge yang ada sebanyak jumlah 
cell yang tercatat

'kemudian akhiri dengan memasang border dobel untuk sisi bawah (xledgebottom) 
dari seluruh area data yang ada
rngData.Borders(xlEdgeBottom).LineStyle = xlDouble


>> Proses 1 : merge item kolom ke-3 yang terakhir yang ada isinya
--> setelah proses loop, didapat kondisi bahwa pada nilai kolom ke-3 terakhir 
yang ada isinya, tidak di-merge karena tidak ada kegiatan merge yang dilakukan 
oleh loop sampai semua baris kosong setelahnya diperiksa.

--> untungnya, masih diketahui bahwa rngawalmerge ada isinya dan jumlah cell 
yang harus di-merge ada nilainya, yaitu di variabel r

--> maka dilakukan proses merge akhir disini, dengan dipastikan bahwa r>0 
(pasti ada yang harus di-merge)

IF r>0 THEN
    rngawalmerge.resize(r,1).merge

endif


>> Proses 2 : setelah merge terakhir, juga harus mem-border double.

--> proses mem-border double pada baris akhir data tidak tergantung nilai 
variabel r. Oleh sebab itu tidak diletakkan dalam blok IF r>0 THEN diatas 
(Bagian 3. Proses 1)

--> rngdiproses terakhir saat keluar dari blok loop adalah range pada baris 
terkahir data, maka dari rngdirposes ini harus ke kolom 1 (lompat 2 kolom ke 
kiri) lalu diperluas 1 baris dan sejumlah kolom data (misal 4) untuk proses 
pemberian border double yang harus dengan garis tebal.
rngdiproses.offset( 0 , -2 ).resize( 
1,4).borders(xledgebottom).linestyle=xldouble
rngdiproses.offset( 0 , -2 ).resize( 1,4).borders(xledgebottom).weight=xlthick


*** ---------------- ***


Sepertinya begitu bunyinya.

Kalau ada yang error pun, sepertinya sudah cukup mudah untuk diuatk-atik tanpa 
perlu melototin monitor (nanti ndak monitornya takut kalau dipelototin terus).


Wassalam,

Kid.









2013/5/13 Imam Sinurat <[email protected]>

 
>  
>
>Yth. Pak MrKid
>
>Terima kasih responnya.
>Step-step solusi arahan bpk sangat menarik, alur fikirnya mudah dicerna. 
>Saking fahamnya saya dgn uraian bpk, saya sempat operkonpidens kalo ini mudah 
>utk saya bereskan sendiri.
>Ternyata saya msh kesulitan men-translate 'bahasa manusia' ke 'bahasa mesin 
>VBA'.
>Belasan jam begadang melototin monitor, Makronya bisa dieksekusi, tapi 
>hasilnya msh semrawut. Akhirnya saya Nyerah :D
>Mohon bpk koreksi dmn letak kesalahannya (sekaligus kunci jwbnnya dah ya) 
>hehe.. Makasih sblmnya.
>
>Wassalam
>Imam Sinurat
>
>Option Explicit
>
>Sub MergedanBorder()
>
>Dim rngData As Range
>Dim rangenya_kolom3 As Range
>Dim rngDiProses As Range
>Dim rngAwalMerge As Range
>Dim lRec As Long, r As Long
>
>With Sheet1
>'Lokasi Utak-atiknya dipindah agar data aslinya tidak terganggu:: copast range 
>g5 ke range s5
>.Range("g5:j25").Copy Destination:=.Range("s5")
>
>'initialisasi data
>Set rngData = .Range("s8").CurrentRegion
>lRec = rngData.Rows.Count - 1
>
>Set rangenya_kolom3 = rngData.Resize(lRec, 1).Offset(1, 2)
>Set rngAwalMerge = rngData.Offset(1, 2).Resize(1, 1)
>End With
>
>
>'loop setiap range di kolom 3
>
For Each rngDiProses In rangenya_kolom3
>
>
>'didalam loop ada tahap cek isi range yang sedang diproses oleh loop (pada 
>contoh for each diatas adalah cek isi rngDiProses)
>'jika ada isinya, maka lakukan :
>
If rngDiProses.Value <> "" Then
>
>
>'1. merge cell dari cell awal diperluas sebanyak variabel jumlah cell
>
'rngAwalMerge.Resize(variabel_jumlah_cell).Merge
>r = rngDiProses.Rows.Count
>rngAwalMerge.Resize(r).Merge
>
>
>'2. beri border dobel dibawah range yang sedang diproses oleh loop (misal di 
>rngDiProses),
>'tetapi mulai kolom ke-1 (offset 2 kolom kekiri) yang diperluas 1 baris x 
>sekian kolom data
>
rngAwalMerge.Offset(0, -2).Resize(, 4).Borders(xlEdgeBottom).LineStyle = 
xlDouble
>
>
>'3. set cell awal merge baru (untuk blok merge berikutnya)
>
'Set rngAwalMerge = rngDiProses
>Set rngAwalMerge = rngDiProses
>
>
>'4. set ulang jumlah cell kembali ke 1 karena cell awal merge yang baru adalah 
>cell pertama yang dimerge untuk blok merge tersebut
>
>'jika tidak ada isinya alias kosong, maka lakukan :
>'1. penambahan jumlah cell yang harus di-merge dengan 1
>
Else
>rngAwalMerge.Resize(r + 1).Merge
>
>End If
>
>
>'sampai akhir loop, yaitu di baris Next
>
Next rngDiProses
>
>
>'setelah selesai, lakukan merge dari cell awal merge yang ada sebanyak jumlah 
>cell yang tercatat
>
>'kemudian akhiri dengan memasang border dobel untuk sisi bawah (xledgebottom) 
>dari seluruh area data yang ada
>
rngData.Borders(xlEdgeBottom).LineStyle = xlDouble
>
>End Sub
>
>------------------------------
>Pada Sab, 11 Mei 2013 11:09 Waktu Terang Hari Pasifik Mr. Kid menulis:
>
>
>>Sepertinya Pak Imam akhir-akhir ini sedang giat belajar VBA ya..
>
>gimana jika garis besar prosesnya saja dulu ya.......



Kirim email ke