Hai Ahmad,

Kalau dilihat dari previewnya, sepertinya pengen ada tambahan syarat pokok
kolom D (kolom dikirinya yang kasus lalu, sesuaikan dengan keadaan nyatanya
bila ada kolom kosong diantaranya yang tak tampak) yang seperti kolom E.

Coba fokus pada blok IF dalam prosedur yang lalu :
*public *Sub kopi()       'tambahin explicit nya scope ah supaya mudah
membacanya
    Dim baris As *double*, x As *long*
    Dim wadah As String
    For x = *cells(rows.count,3).end(xlup).row* To 7 Step -1

      if Cells(x, 5).Value<>0 then                                  'poin 1
diperjelas keterangannya -> kolom E <> 0
             if Cells(x, 1).Value = 0
Then                                     'kondisi dalam poin 1 alias poin
1.>.  -> kolom A = 0
                    wadah = *Cells(x, 3).Value* & " " & *wadah*
                    baris = Cells(x, 5).Value
                    Cells(x, 3).Value = *vbnullstring*
                    Cells(x, 5).Value =
*vbnullstring*             endif
     elseif Cells(x, 1).Value <> 0 then                          'poin
2     -> kolom E=0 DAN kolom A <> 0
                  Cells(x, 3).Value = *Cells(x, 3).Value* & " " & *wadah*
                  wadah = *vbnullstring*
                  Cells(x, 5).Value = baris
     else
'poin 3     -> kolom E=0  DAN kolom A = 0
              wadah = *Cells(x, 3).Value* & " " & *wadah*
              Cells(x, 3).Value = *vbnullstring*
     endif
   Next x
End Sub


*Kondisi baru : (poin 1.5)*
     Kolom D memiliki karakteristik seperti kolom E

      if Cells(x, 5).Value<>0 then                                  'poin 1
diperjelas keterangannya -> kolom E <> 0
             if Cells(x, 1).Value = 0
Then                                     'kondisi dalam poin 1 alias poin
1.>.  -> kolom A = 0
                    wadah = *Cells(x, 3).Value* & " " & *wadah*
                    baris = Cells(x, 5).Value
                    Cells(x, 3).Value = *vbnullstring*
                    Cells(x, 5).Value =
*vbnullstring*             endif
      elseif Cells(x, 4).Value<>0 then                                  'poin
1.5 diperjelas keterangannya -> kolom D <> 0
             if Cells(x, 1).Value = 0
Then                                     'kondisi dalam poin 1 alias poin
1.>.  -> kolom A = 0
                    wadah = *Cells(x, 3).Value* & " " & *wadah*
                    baris = Cells(x, 4).Value
                    Cells(x, 3).Value = *vbnullstring*
                    Cells(x, 4).Value =
*vbnullstring*             endif

     elseif Cells(x, 1).Value <> 0 then                          'poin
2     -> kolom E=0 DAN kolom A <> 0
                  Cells(x, 3).Value = *Cells(x, 3).Value* & " " & *wadah*
                  wadah = *vbnullstring*
 *                 Cells(x, 5).Value = baris*
     else
'poin 3     -> kolom E=0  DAN kolom A = 0
              wadah = *Cells(x, 3).Value* & " " & *wadah*
              Cells(x, 3).Value = *vbnullstring*
     endif

*Sampai disini terjadi masalah berikut :*
*a.* nilai dalam variabel 'baris' tidak diketahui sumbernya, yaitu dari
nilai kolom E (akibat mengerjakan poin 1) atau dari kolom D (akibat
mengerjakan poin 1.5)

*b.* penulisan nilai yang disimpan dalam variabel bernama 'baris' adalah ke
kolom E saja (*lihat yang merah*)

Solusi untuk masalah untuk kasus :
a. disediakan sebuah variabel penyimpan nomor kolom sumber nilai yang
diambil. Jadi tugasnya menyimpan nilai 5 kalau mengambil nilai kolom E
karena mengerjakan poin 1, atau menyimpan nilai 4 kalau mengambil nilai
kolom D karena mengerjakan poin 1.5. Maka diblok poin 1 dan blok poin 1.5
nantinya akan diberi baris kode pengisian nilai 5 atau 4 tersebut.

b. karena proses penulisan menggunakan posisi nomor row dan nomor column
seperti *Cells(x, 5).Value* yang berarti di cells row ke-x di column 5,
berarti angka 5 pada baris tersebut bisa diganti dengan variabel penyimpan
nilai sumber kolom (5 atau 4) yang menjadi solusi poin a diatas tadi.

Proses penerapan solusi :
1. butuh sebuah variabel baru penyimpan nilai 5 atau 4
> butuh deklarasi variabel baru yang datatype untuk numerik bilangan bulat
saja, bisa byte, integer, atau long
> misal dipilih datatype Long supaya native dengan bit applikasi office
yang digunakan yang 32 bit
> nama variabelnya misal diberi nama lKolomSumber
> bunyi deklarasinya :

*       dim lKolomSumber as long*
2. setiap blok poin diberi baris kode untuk set nilai 5 atau 4 sesuai
kondisi ke variabel baru tersebut
> blok poin 1 dulu  -> berdasar kolom E <> 0
    * poin 1 menggunakan kolom E alias kolom nomor 5 sebagai kondisi
    * berarti nilai variabel lKolomSumber diblok ini harus diisi dengan
nilai 5
    * prosesnya ditulis tepat setelah mengambil nilai dari kolom E
    * berarti, setelah kode berbunyi :
                   baris = Cells(x, 5).Value
      diberi proses pengisian nilai 5 ke variabel lKolomSumber dengan bunyi
berikut :
                   lKolomSumber=5

> blok poin 1.5 -> berdasar kolom D <> 0
    * poin 1 menggunakan kolom D alias kolom nomor 4 sebagai kondisi
    * berarti nilai variabel lKolomSumber diblok ini harus diisi dengan
nilai 4
    * prosesnya ditulis tepat setelah mengambil nilai dari kolom D
    * berarti, setelah kode berbunyi :
                   baris = Cells(x, 4).Value
      diberi proses pengisian nilai 4 ke variabel lKolomSumber dengan bunyi
berikut :
                   lKolomSumber=4

3. Penulisan isi variabel bernama 'baris' ke suatu cells dilakukan sesuai
kolom sumbernya
> kode penulisan nilai yang sudah ada dalam prosedur berbunyi :
                    *Cells(x, 5).Value = baris*
> pada kode di atas, kolom sumbernya ditunjukkan dengan angka *5*
> berarti bagian angka *5* itulah yang harus diganti dengan variabel
penyimpan nomor kolom sumbernya (nama variabelnya lKolomSumber kan ya)
> berarti bunyi kodenya akan menjadi :
                    *Cells(x, **lKolomSumber).Value = baris*

Jadi prosedur yang sudah dikembangkan akan menjadi :

*public *Sub kopi()       'tambahin explicit nya scope ah supaya mudah
membacanya

    Dim baris As *double*, x As *long*
    Dim wadah As String
    *dim lKolomSumber as long*
    'private cop as object    'dumb private object
    For x = *cells(rows.count,3).end(xlup).row* To 7 Step -1

      if Cells(x, 5).Value<>0 then                                  ''poin
1 diperjelas keterangannya -> kolom E <> 0
             if Cells(x, 1).Value = 0
Then                                     'kondisi dalam poin 1 alias poin
1.>.  -> kolom A = 0
                    wadah = *Cells(x, 3).Value* & " " & *wadah*
                    baris = Cells(x, 5).Value
                    *lKolomSumber =5*
                    Cells(x, 3).Value = *vbnullstring*
                    Cells(x, 5).Value =
*vbnullstring*             endif

      elseif Cells(x, 4).Value<>0 then                                  "poin
1.5 diperjelas keterangannya -> kolom D <> 0
             if Cells(x, 1).Value = 0
Then                                     'kondisi dalam poin 1 alias poin
1.>.  -> kolom A = 0
                    wadah = *Cells(x, 3).Value* & " " & *wadah*
                    baris = Cells(x, 4).Value
                    *lKolomSumber =4*
                    Cells(x, 3).Value = *vbnullstring*
                    Cells(x, 4).Value =
*vbnullstring*             endif

     elseif Cells(x, 1).Value <> 0 then                          ''poin
2     -> kolom E=0 DAN kolom A <> 0
                  Cells(x, 3).Value = *Cells(x, 3).Value* & " " & *wadah*
                  wadah = *vbnullstring*
 *                 Cells(x, **lKolomSumber ).Value = baris*
     else
''poin 3     -> kolom E=0  DAN kolom A = 0
              wadah = *Cells(x, 3).Value* & " " & *wadah*
              Cells(x, 3).Value = *vbnullstring*
     endif

   Next x

End Sub



;)

Wassalam,
Kid







2015-05-26 18:28 GMT+10:00 Ahmad Syaifullah Lubis [email protected]
[belajar-excel] <[email protected]>:

>
>
> Mr Kid, Mr Tobby, Mr Nang Agus dan BeExceller,
>
> Saya pakai macronya Mr Kid, tetapi tidak pas dengan Hasil Yang Diharapkan.
> terlampir file yang menjadi percobaan; buat saya sulit banget untuk
> memahaminya.
> Mohon dilihat sheet "Hasil Macro Yang Salah" dengan "Hasil Sheet Yang
> Diharapkan".
> terima kasih,
> ASL.
>
> ------------------------------
> To: [email protected]
> From: [email protected]
> Date: Tue, 26 May 2015 04:17:46 +1000
> Subject: Re: [belajar-excel] Menyatukan 2 atau 3 baris menjadi 1 baris data
>
>
>
> tampaknya mas Nang Agus kelupaan satu kondisi.
>
> Sub kopi()
> Dim baris As Long, tinggi As Integer, x As Integer
> Dim wadah As String
> tinggi = Range("c1000000").End(xlUp).Row
> For x = tinggi To 7 Step -1
> If Cells(x, 1).Value = 0 Then
> wadah = Cells(x, 3).Value & wadah
> Cells(x, 3).Value = ""
> If Cells(x, 5).Value <> 0 Then
> baris = Cells(x, 5).Value
> Cells(x, 5).Value = ""
> End If
> Else
> wadah = Cells(x, 3).Value & wadah
> Cells(x, 3).Value = wadah
> wadah = ""
>    if Cells(x, 5).Value<>0 then
> Cells(x, 5).Value = baris
>    endif
> End If
>
> Next x
> End Sub
>
> Script diatas sekaligus menyusun sebuah data teks (lihat variabel bernama
> wadah) dari beberapa baris data. Tampaknya ini dimaksudkan untuk menyusun
> record data yang baik, sehingga tabel hasil bisa mengikuti kaidah tabel
> database yang baik pula.
>
> Catatan :
> 1. variabel baris tampaknya untuk menyimpan suatu nilai numerik. Pada
> script di atas, tipe data di set menampung bilangan bulat saja dengan
> maksimum sekitar 2 x 10^10 lebih dikit.
> > andai data yang disimpan memiliki kemungkinan berjumlah digit lebih dari
> 9, sebaiknya tipe data variabel baris diubah menjadi double
>
> 2. variabel tinggi untuk menyimpan nomor baris Excel terakhir yang akan
> diproses. Tipe data yang digunakan adalah integer yang dibatasi sampai
> 32000 sekiun.
> > Andai kemungkinannya baris Excel yang digunakan oleh data mencapai lebih
> dari 32000 sekiun, maka sebaiknya tipe datanya diubah menjadi Long
>
> 3. variabel x yang digunakan dalam loop dengan for next juga seperti
> variabel tinggi.
>
> 4. untuk mendapatkan baris excel terakhir data bisa juga dengan bunyi kode
> berikut : (lihat baris kode set nilai tinggi)
>       tinggi =  cells(rows.count,3).end(xlup).row      '3 adalah kolom c
>          'Range("c1000000").End(xlUp).Row
>
> 5. berhubung loop dengan for next, maka baris berbunyi for blabla akan
> dieksekusi 1 kali saja.
> > berarti, baris :
>            For x =* tinggi *To 7 Step -1
> bisa diganti dengan :
>            For x =  *cells(rows.count,3).end(xlup).row* To 7 Step -1
> dan menjadi hemat proses eksekusi karena baris 'tinggi=blabla' bisa
> dihapus, dan bagian deklarasi 'tinggi as blabla' juga bisa dihapus
>
> 6. penggabungan data bertipe teks (string) yang ada dalam script di atas
> tidak menyertakan delimiter antar teks yang digabung
> > contoh baris :
>        wadah = *Cells(x, 3).Value* & *wadah*
> andai *Cells(x, 3).Value*  bernilai '*Kid*'  dan *wadah*  bernilai '*juga*'
> hasilnya akan menjadi '*Kidjuga*'
> > bisa jadi akan tampak lebih baik bila diberi delimiter. Misalnya
> delimiter-nya berupa sebuah karakter spasi. Maka barisnya menjadi :
>        wadah = *Cells(x, 3).Value* & " " & *wadah*
> yang bisa menghasilkan teks hasil penggabungan berbunyi '*Kid* *juga*'
>
> 7. nomor 6 juga berlaku untuk baris kode berbunyi :
>            wadah = Cells(x, 3).Value & wadah
>
> 8. variabel bernama wadah dan rujukan ke kolom C dengan Cells(x, 3)
> bertugas untuk menyusun sebuah teks dari beberapa baris teks
>
> 9. katanya, set string kosong akan lebih cepat diproses dan mudah tampak
> dalam editing script jika menghindari penggunaan "" dan lebih memilih
> menggunakan vbnullstring
> > contoh :
>          Cells(x, 3).Value = ""
> katanya bisa lebih cepat diproses dan mudah tampak saat editing ketika
> menggunakan vbnullstring :
>          Cells(x, 3).Value = vbnullstring
> > hal ini berlaku untuk beberapa baris yang lain, termasuk set nilai
> string kosong pada variabel bernama wadah
>
> 10. cells yang diset nilai dengan "" atau vbnullstring akan menjadi blank
> cells. jadi proses ini setara dengan penggunaan methods clearcontents milik
> si cells atau range
>
> 11. penghematan jumlah proses bisa dilakukan dengan meringkaskan si proses
> itu sendiri
> > contoh pada beberapa baris berikut : (dengan proses penggabungan teks
> yang sudah diperbaiki mengikuti nomor 7
>          wadah = *Cells(x, 3).Value & " " & wadah*
>          Cells(x, 3).Value = wadah
>          wadah = ""
> "wadah (yang baru) diisi dengan nilai dari Cells(x, 3).Value yang digabung
> dengan spasi dan isi wadah (yang lama)
> lalu Cells(x, 3) diubah isinya dengan nilai yang disimpan dalam wadah
> (yang sudah baru)
> kemudian isi wadah (yang sudah baru tersebut) dibuang isinya."
>
> > proses seperti di atas bisa diringkas dengan :
>          Cells(x, 3).Value = *Cells(x, 3).Value & " " & wadah*
>          wadah=vbnullstring
> " Cells(x, 3) [yang baru] diisi dengan Cells(x, 3) [yang lama] digabung
> dengan spasi dan isi wadah
> lalu isi wadah dibuang."
>
> > setidaknya hemat 1 proses
>
> 12. prosedur di atas menggunakan rujukan ke object yang ada di sheet aktif
> (pasti di workbook yang sedang aktif)
>
>
> Kalau dikumpulkan semuanya, kira-kira prosedurnya menjadi :
> Sub kopi()
>     Dim baris As *double*, x As *long*
>     Dim wadah As String
>     For x = *cells(rows.count,3).end(xlup).row* To 7 Step -1
>         If Cells(x, 1).Value = 0 Then
>             wadah = *Cells(x, 3).Value* & " " & *wadah*
>             Cells(x, 3).Value = *vbnullstring*
>             If Cells(x, 5).Value <> 0 Then
>                   baris = Cells(x, 5).Value
>                   Cells(x, 5).Value = *vbnullstring*
>             End If
>         Else
>            Cells(x, 3).Value = *Cells(x, 3).Value* & " " & *wadah*
>            wadah = *vbnullstring*
>            if Cells(x, 5).Value<>0 then
>                 Cells(x, 5).Value = baris
>           endif
>        End If
>    Next x
> End Sub
>
>
> Sampai disini, kalau dilihat-lihat berulang-ulang mengikuti si proses
> loop, kondisi proses yang akan dicapai kira-kira bunyinya :
> > mengikuti script di atas :
>    a. kalau isi kolom A = 0, dilakukan :
>             susun teks gabungan dan simpan di sebuah variabel
>             pembersihan teks dari cell di kolom C
>             a.1. kalau kolom E tidak 0, dilakukan :
>                         penyimpanan nilai kolom E ke suatu variabel
>                         pembersihan nilai dari cell di kolom E
>    b. kalau isi kolom A <> 0   (bagian Else), dilakukan :
>             tulis ke cell di kolom C gabungan nilai yang ada di kolom C
> dengan teks hasil gabungan yang disimpan dalam variabel
>             buang gabungan teks dari variabel
>             b.1. kalau kolom E bukan 0 alias ada isinya, dilakukan :
>                          tulis ke cell di kolom E suatu nilai yang
> disimpan dalam variabel nilai
>
> > jadi berdasar jabaran tentang kondisi dalam script tersebut di atas,
> sebenarnya ada kondisi pokok sebagai berikut :
>     1. ketika kolom E bukan 0 alias ada isinya (lihat b.1.) diperlukan
> memeriksa kolom A (lihat poin a dan b)
>           > pada kolom E bukan 0 ini, proses dilakukan pada saat kolom A =
> 0, yaitu melakukan :
>                  - penggabungan teks kolom C dan menyimpannya ke suatu
> variabel
>                  - menyimpan nilai kolom E ke suatu variabel nilai
>                  - membuang isi kolom C dan kolom E
>          * kalau kolom A tidak 0, tidak diperlukan proses apapun karena
> memang sudah demikian adanya
>     2. ketika kolom E = 0 dan kolom A <> 0
>          > pada kondisi ini, dilakukan proses :
>               - menulis ke kolom C, yaitu suatu nilai hasil penggabungan
> isi kolom C dengan isi variabel gabungan teks yang ada
>               - membuang isi variabel gabungan teks
>               - menulis ke kolom E, yaitu suatu nilai yang disimpan oleh
> suatu variabel nilai
>     3. ketika kolom E = 0 dan kolom A = 0
>          > pada kondisi ini, dilakukan proses :
>               - menggabungkan teks nilai kolom C dengan hasil penggabungan
> yang ada ke suatu variabel gabungan teks
>               - membuang isi kolom C
>
> > sepertinya susunan kondisinya bisa berbentuk :
>       if Cells(x, 5).Value<>0 then                                  'poin
> 1
>              if Cells(x, 1).Value = 0
> Then                                     'kondisi dalam poin 1 alias poin
> 1.>.
>                     wadah = *Cells(x, 3).Value* & " " & *wadah*
>                     baris = Cells(x, 5).Value
>                     Cells(x, 3).Value = *vbnullstring*
>                     Cells(x, 5).Value =
> *vbnullstring*             endif
>      elseif Cells(x, 1).Value <> 0 then                          'poin 2
>                   Cells(x, 3).Value = *Cells(x, 3).Value* & " " & *wadah*
>                   wadah = *vbnullstring*
>                   Cells(x, 5).Value = baris
>
> else
> 'poin 3
>               wadah = *Cells(x, 3).Value* & " " & *wadah*
>               Cells(x, 3).Value = *vbnullstring*
>      endif
>
> Jadi, susunan prosedurnya akan menjadi :
> *public *Sub kopi()       'tambahin explicit nya scope ah supaya mudah
> membacanya
>     Dim baris As *double*, x As *long*
>     Dim wadah As String
>     For x = *cells(rows.count,3).end(xlup).row* To 7 Step -1
>
>         if Cells(x, 5).Value<>0 then
> 'poin 1
>              if Cells(x, 1).Value = 0
> Then                                     'kondisi dalam poin 1 alias poin
> 1.>.
>                     wadah = *Cells(x, 3).Value* & " " & *wadah*
>                     baris = Cells(x, 5).Value
>                     Cells(x, 3).Value = *vbnullstring*
>                     Cells(x, 5).Value =
> *vbnullstring*             endif
>         elseif Cells(x, 1).Value <> 0 then                          'poin 2
>                   Cells(x, 3).Value = *Cells(x, 3).Value* & " " & *wadah*
>                   wadah = *vbnullstring*
>                   Cells(x, 5).Value = baris
>
> else
> 'poin 3
>               wadah = *Cells(x, 3).Value* & " " & *wadah*
>               Cells(x, 3).Value = *vbnullstring*
>         endif
>    Next x
> End Sub
>
>
> Tentang :
>
> gimana kalau macronya berjalan untuk semua sheet yang ada
>
> > merujuk ke nomor 12 di atas sana, berarti dibutuhkan prosedur lainnya
> yang bertugas melakukan loop ke setiap sheet lalu mengaktifkan sheet
> tersebut. Kalau sheetnya sudah aktif, panggil prosedur di atas.
> dim sht as worksheet
> for each sht in thisworkbook.worksheets
>     sht.activate
>     kopi
> next sht
>
> Biasanya kalau sudah begini, akan ada pertanyaan : bagaimana kalau ada
> banyak workbook...
> > rasanya sudah pada bisa.
> > buat prosedur lainnya yang bertugas buka workbook (kalau belum dibuka)
> loop di setiap workbook, lalu panggil prosedur yang loop setiap sheet tadi
> dan ditutup dengan save workbook yang di loop dan tutup workbook yang di
> loop
> > sebaiknya cari-carilah di postingan lawas tentang membuka workbook lain,
> tentang loop setiap workbook, dan sebagainya.
>
> Wassalam,
> Kid
>
>
>
> 2015-05-25 18:42 GMT+10:00 Ahmad Syaifullah Lubis [email protected]
> [belajar-excel] <[email protected]>:
>
>
>
> Dear Mr Nang Agus,
> ternyata data kolom E nya menjadi salah, tidak sinkron dengan aslinya.
> terima kasih,
> ASL
>
> ------------------------------
> To: [email protected]
> From: [email protected]
> Date: Mon, 25 May 2015 13:07:02 +0700
> Subject: Re: [belajar-excel] Menyatukan 2 atau 3 baris menjadi 1 baris data
>
>
>
> Mohon maaf ada yang ketinggalan untuk kolom E, mungkin cekripnya begini:
>
> Option Explicit
> Sub kopi()
> Dim baris As Long, tinggi As Integer, x As Integer
> Dim wadah As String
> tinggi = Range("c1000000").End(xlUp).Row
> For x = tinggi To 7 Step -1
> If Cells(x, 1).Value = 0 Then
> wadah = Cells(x, 3).Value & wadah
> Cells(x, 3).Value = ""
> If Cells(x, 5).Value <> 0 Then
> baris = Cells(x, 5).Value
> Cells(x, 5).Value = ""
> End If
> Else
> wadah = Cells(x, 3).Value & wadah
> Cells(x, 3).Value = wadah
> wadah = ""
> Cells(x, 5).Value = baris
> End If
>
> Next x
>
> End Sub
>
> 2015-05-25 12:52 GMT+07:00 Nang Agus <[email protected]>:
>
> Mungkinkah macro begini?
> Option Explicit
> Sub kopi()
> Dim baris As Integer, tinggi As Integer, x As Integer
> Dim wadah As String
> tinggi = Range("c1000000").End(xlUp).Row
> For x = tinggi To 7 Step -1
> If Cells(x, 1).Value = 0 Then
> wadah = Cells(x, 3).Value & wadah
> Cells(x, 3).Value = ""
> Else
> wadah = Cells(x, 3).Value & wadah
> Cells(x, 3).Value = wadah
> wadah = ""
> End If
> Next x
>
> 2015-05-25 10:11 GMT+07:00 Ahmad Syaifullah Lubis [email protected]
> [belajar-excel] <[email protected]>:
>
>
>
> Dear BeExceller,
>
> Saya mendapatkan data yang cukup membuat saya kewalahan, di mana data2nya
> biasanya hanya 1 baris, tetapi terkadang ada 2 atau 3 baris, sehingga saya
> kerepotan dalam menyatukannya menjadi 1 baris.
> Mohon diberikan macro yang bisa mengatasi masalah saya tsb.
>
> terima kasih,
>
> ASL
>
>
>
>
>
>
>
>    
>

Kirim email ke