saya koreksi ya Mr Kids :col.Add rng.Value & "|" & rng.Offset(, 1).Value & "|" & rng.Offset(, 2).Value, rng.Value & "|" & rng.Offset(, 1).Value menjadi :col.Add rng.Value & "|" & rng.Offset(, 1).Value & "|" & rng.Offset(, 2).Value, rng.Offset(, 1).Value dimana key menggunakan kolom yang berisi A,B,C,D,E ( kolom ke-2 atau relatif satu kolom kekanan )sehingga lengkapnya : Public Function JoinPakeKoleksi(rngUpdateKolomPertama As Range, rngDataLamaKolomPertama As Range) As Variant Dim col As Collection 'selalu base 1 Dim rng As Range Dim lRecs As Long Dim sItem() As String 'vb6 menggunakan default base 0 Dim vRes As Variant On Error Resume Next Set col = New Collection 'mulai dari updater For Each rng In rngUpdateKolomPertama If LenB(rng.Value) <> 0 Then col.Add Item:=rng.Value & "|" & rng.Offset(, 1).Value & "|" & rng.Offset(, 2).Value, _ Key:=rng.Offset(, 1).Value End If Next rng 'ikuti dengan data lama For Each rng In rngDataLamaKolomPertama If LenB(rng.Value) <> 0 Then col.Add Item:=rng.Value & "|" & rng.Offset(, 1).Value & "|" & rng.Offset(, 2).Value, _ Key:=rng.Offset(, 1).Value End If Next rng lRecs = col.Count ReDim vRes(1 To lRecs, 1 To 3) As Variant For lRecs = 1 To col.Count MsgBox col(lRecs) sItem = Split(col(lRecs), "|") vRes(lRecs, 1) = sItem(0) vRes(lRecs, 2) = sItem(1) vRes(lRecs, 3) = sItem(2) Next lRecs JoinPakeKoleksi = vRes End Function
To: belajar-excel@yahoogroups.com From: mr.nm...@gmail.com Date: Thu, 29 Sep 2011 14:44:37 +0700 Subject: Re: [belajar-excel] Update Tabel dari sheet lain... Coba juga menggunakan object collection untuk join table Public Function JoinPakeKoleksi(rngUpdateKolomPertama As Range, rngDataLamaKolomPertama As Range) As Variant Dim col As Collection 'selalu base 1 Dim rng As Range Dim lRecs As Long Dim sItem() As String 'vb6 menggunakan default base 0 Dim vRes As Variant On Error Resume Next Set col = New Collection 'mulai dari updater For Each rng In rngUpdateKolomPertama If LenB(rng.Value) <> 0 Then col.Add rng.Value & "|" & rng.Offset(, 1).Value & "|" & rng.Offset(, 2).Value, _ rng.Value & "|" & rng.Offset(, 1).Value End If Next rng 'ikuti dengan data lama For Each rng In rngDataLamaKolomPertama If LenB(rng.Value) <> 0 Then col.Add rng.Value & "|" & rng.Offset(, 1).Value & "|" & rng.Offset(, 2).Value, _ rng.Value & "|" & rng.Offset(, 1).Value End If Next rng lRecs = col.Count ReDim vRes(1 To lRecs, 1 To 3) As Variant For lRecs = 1 To col.Count sItem = Split(col(lRecs), "|") vRes(lRecs, 1) = sItem(0) vRes(lRecs, 2) = sItem(1) vRes(lRecs, 3) = sItem(2) Next lRecs JoinPakeKoleksi = vRes End Function 'Mungkin perlu dicoba untuk record update yang banyak dan record data yang juga banyak. Ingin di-sort ? buat fungsi sorting yang inputnya berupa array, agar hasil fungsi di atas bisa menjadi input parameter untuk fungsi sorting tersebut. Regards. Kid. 2011/9/29 jkssxls Sudarsono <jkss...@hotmail.com> saya modif fungsi join menjadi join_m Private Function JOIN_m(L01 As Range, L02 As Range) '=== siti Vi : Fungsi JOIN : menggabung dua List ' modified by Haps: 29 sep 2011 ' tiap list berisi 3 kolom, Uniq pada Kolom 1 (ID) '================================================= Dim ArS As String, ArUp(), Tmp Dim i As Long, j As Long, p As Long, u As Long Dim kolomkey As Integer kolomkey = 2 ' menyusun 3 array ex tabel data ArS = "|" ReDim Preserve ArUp(1 To 3, 1 To L01.Rows.Count) For i = 1 To L01.Rows.Count 'isi string dari kolom H1 ( berisi A,B,C,D ) ArS = ArS & L01(i, kolomkey) & "|" ArUp(1, i) = L01(i, 1) ArUp(2, i) = L01(i, 2) ArUp(3, i) = L01(i, 3) Next i ' array tabel diperbesar dengan data di L02 (update) ' j = UBound(ArUp) ' ambil banyaknya data di dimensi ke-2 : A B C D j = UBound(ArUp, 2) For i = 1 To L02.Rows.Count ' jika ID di L02 belum ada di L01.. maka.. If InStr(1, ArS, "|" & L02(i, kolomkey) & "|") = 0 Then ' jika data di L02 tak ada di ArS ArS = ArS & L02(i, kolomkey) & "|" j = j + 1: ReDim Preserve ArUp(1 To 3, 1 To j) ArUp(1, j) = L02(i, 1) ArUp(2, j) = L02(i, 2) ArUp(3, j) = L02(i, 3) Else ' jika ID di list L02 sudah ada di L01 (kembar) ' Nilainya H2-nya diambilkan dari L02 (data pengUpdate) For p = 1 To j If L02(i, kolomkey) = ArUp(kolomkey, p) Then ' ganti data pada ArUp dgn data di L02 hanya index ke-3 ArUp(3, p) = L02(i, 3) Exit For End If Next p End If Next i ' bubble sort, mengurutkan hasil Array (sort by ID) For i = LBound(ArUp) To UBound(ArUp) - 1 For u = LBound(ArUp) To UBound(ArUp) - 1 If ArUp(kolomkey, u) > ArUp(kolomkey, u + 1) Then Tmp = ArUp(1, u): ArUp(1, u) = ArUp(1, u + 1): ArUp(1, u + 1) = Tmp Tmp = ArUp(2, u): ArUp(2, u) = ArUp(2, u + 1): ArUp(2, u + 1) = Tmp Tmp = ArUp(3, u): ArUp(3, u) = ArUp(3, u + 1): ArUp(3, u + 1) = Tmp End If Next u Next i ' variable Join di-isi array ArUp (2 dimensi (3 kol * n row) JOIN_m = ArUp End Function To: belajar-excel@yahoogroups.com From: jkss...@hotmail.com Date: Thu, 29 Sep 2011 05:13:38 +0000 Subject: RE: [belajar-excel] Update Tabel dari sheet lain... data utama ID H1 H2 1 A 100 2 B 125 3 C 10 4 D 5 data updater ID H1 H2 1 C 200 2 B 0 5 E 15 data hasil update : ID H1 H2 1 A 200 2 B 0 3 C 10 4 D 5 5 E 15 seharusnya : ID H1 H2 1 A 100 2 B 0 3 C 200 4 D 5 5 E 15 hal ini karena yg menjadi pembanding adalah index ke -1 ( kolom Id ) , sebaiknya index -2 ( kolom H1 ). Maaf sedikit mengoreksi .. tak apa -apa , kan.... To: belajar-excel@yahoogroups.com From: jkss...@hotmail.com Date: Thu, 29 Sep 2011 04:42:28 +0000 Subject: RE: [belajar-excel] Update Tabel dari sheet lain... Mbak Haps , saya sudah coba , ada sedikit yang saya koreksi pada fungsi join : j = UBound(ArUp) akan selalu menghasilkan 3 di koreksi menjadi j = UBound(ArUp, 2) akan menghasilkan banyaknya data di range "data" ( worksheet "data" ) Tetapi saya berterima kasih atas fungsi Updatable dan join hasil modif nya To: belajar-excel@yahoogroups.com From: hapsari.stlizb...@gmail.com Date: Thu, 29 Sep 2011 04:30:15 +0700 Subject: Re: [belajar-excel] Update Tabel dari sheet lain... Fungsi JOIN telah dimodifikasi (lihat module), agar dapat menampung tabel 2 dimensi) 3 kolomKemudian Fungsi tsb dimanfaatkan untuk mengUpdate tabel data dengan prosedur Sub. Sudah dicoba sepertinya berhasil, hanya saja listing vba-code nya jadi kepanjangan... Sub UpdateTable() ' Haps // 28 sept 2011 '--------------------- Dim DatRng As Range, NewRng As Range, ArNew, r As Long ' init: Tabel Data (tanpa headernya) Set DatRng = Sheets("Data").Cells(1).CurrentRegion.Offset(1, 0) Set DatRng = DatRng.Resize(DatRng.Rows.Count - 1, DatRng.Columns.Count) ' init: Tabel pengUpdate (tanpa header) Set NewRng = Sheets("Update").Cells(1).CurrentRegion.Offset(1, 0) Set NewRng = NewRng.Resize(NewRng.Rows.Count - 1, NewRng.Columns.Count) ' -- membuat Array (3 kolom * n Baris) dibantu fungsi JOIN ArNew = JOIN(DatRng, NewRng) ' -- hapus isi tabel data DatRng.ClearContents ' -- tabel data (yg baru dikosongkan) diupdate dgn data dari Array For r = 1 To UBound(ArNew, 2) DatRng(r, 1) = ArNew(1, r) DatRng(r, 2) = ArNew(2, r) DatRng(r, 3) = ArNew(3, r) Next r DatRng.Parent.Activate MsgBox "Selesai", vbInformation, ThisWorkbook.Name End Sub cmiiww 2011/9/28 Haps <hapsari.stlizb...@gmail.com> dulu, sudah lupa bulan / tahunnya, mba siti pernah membuat UDF Join dua list jika di JOIN, berarti dua lis akan digabung, tetapi data kembar hanya dimunculkan 1 kali jika perlu hasil JOIN bisa diurutkan (sorted) sementara belum sempat membuat /memodifikasi makro menjadi khusus untuk keperluan "sambil JOIN (kolom 1) juga sambil SUMIF (kolom 2)" saya yakin mas zainul ulum bisa memodifikasi makro tsb agar dapat mengerjakan keperluan yg diajukan tsb, mungkin berupa prosedur Sub bukan FUnction lebih cuocokk.... ini sudah seijin mbak siti contoh UDF JOINT dilampirkan di sini '---text / VBA codeing UDF Join Function JOIN(List1 As Range, List2 As Range, Optional N As Long = 0, _ Optional Urutkan As Boolean = False) '----- End Function 2011/9/28 zainul ulum <<yahoo>> <zainul_u...@yahoo.com> Be-exceler, Misalnya saya mempunyai table di [sheet 1] dan [Sheet 2]. Table di [sheet 1] akan diupdate berdasarkan record dari [Sheet 2]. Bagaimanakah codenya (macro) agar record di [sheet 1] bisa terupdate berdasarkan perubahan di [Sheet 2]? Terimakasih, -zainul-