LIST VIEW

  1. 4 minggu lalu
    Di sunting 4 minggu lalu oleh bejo

    Dear All Master yg saya hormati, saya minta tolong, bagaimana script menampilkan data riwayat pembayaran pada list view, sebelumnya riwayat pembayaran saya letakkan pada lembar kerja excel, tapi sepertinya membuat operasi file menjadi lambat karena selalu membaca perubahan pada database, terima kasih sebelumnya.

  2. Private Sub riwayat_Initialize()
    With riwayat
    .ColumnCount = 5
    .ColumnWidths = "15;15;15;15;15"
    .BoundColumn = 1
    End With
    Call Isiriwayat
    End Sub

    (form riwayat masih kosong), kalo saya pakai userform_initialize, muncul pesan

  3. Caton

    Nov 12 Terverifikasi Indonesia + 15.163 Poin

    @bejo ...

    ... bagaimana script menampilkan data riwayat pembayaran pada list view ...

    Dengan asumsi data akan ditampilkan ke kontrol ListBox, dan kontrol ListBox terkait diberi nama lstRiwayat, tambahkan script berikut. Pada bagian deklarasi modul UserForm1 :

    Option Explicit
    
    Private m_xArrayPerKelas
    Private m_xArrayNIS
    

    Kemudian, pada prosedur inisialisasi UserForm, tambahkan script:

    Private Sub UserForm_Initialize()
        '+-- Tambahkan baris ini:
        With lstRiwayat
            .ColumnCount = 3
            .ColumnWidths = "80;80;100"
            .BoundColumn = 1
        End With
    
        With Lbnama
            .ColumnCount = 5
            .ColumnWidths = "0;0;0;175;0"
            .BoundColumn = 1
        End With
        
        Call Isicbkelas
    End Sub

    Tambahkan script berikut pada prosedur Cbkelas_Change() :

    Private Sub Cbkelas_Change()
    Sheets("input").Range("AD2").Value = Cbkelas.Value
    Sheet6.Range("f1").Value = Cbkelas.Value
    Sheets("lihat perkelas").Range("c1").Value = Cbkelas.Value
    'Sheet2.Select
    Call Isilbnama
    
    '+-- Tambah baris ini
    m_xArrayPerKelas = Sheet8.Range("H6:AK" & Sheet8.Range("C" & Rows.Count).End(xlUp).Row).Value2
    m_xArrayNIS = Sheet8.Range("C6:C" & Sheet8.Range("C" & Rows.Count).End(xlUp).Row).Value2
    
    End Sub

    Terakhir, ubah script prosedur Lbnama_Change() menjadi :

    Private Sub Lbnama_change()
        Dim vIdx, vData
        Dim lX As Long
        
        If Lbnama.ListCount > 0 Then
            lstRiwayat.Clear
            If IsNumeric(Lbnama.Column(2)) Then
                vIdx = Application.Match(Lbnama.Column(2) * 1, m_xArrayNIS, 0)
                If IsNumeric(vIdx) Then
                    For lX = LBound(m_xArrayPerKelas, 2) To UBound(m_xArrayPerKelas, 2) Step 3
                        vData = m_xArrayPerKelas(vIdx, lX) 'Application.Index(m_xArrayPerKelas, vIdx, lX)
                        If Len(vData) And IsNumeric(vData) Then
                            With lstRiwayat
                                .AddItem Format(vData, "dd/mm/yyyy")
                                .List(.ListCount - 1, 1) = Format(m_xArrayPerKelas(vIdx, lX + 1), "#,##")
                                .List(.ListCount - 1, 2) = m_xArrayPerKelas(vIdx, lX + 2)
                            End With
                        Else
                            Exit For
                        End If
                    Next
                End If
            End If
        End If
    End Sub

    Demikian.

  4. Caton

    Nov 12 Terverifikasi Indonesia + 15.163 Poin
    Di sunting 4 minggu lalu oleh Caton

    Untuk masalah kedua:

    ... (form riwayat masih kosong), kalo saya pakai userform_initialize, muncul pesan ...

    Itu artinya sudah ada prosedur dengan nama yang sama atau dalam modul tersebut terdapat 2 atau lebih prosedur yang sama, dalam hal ini prosedur Userform_Initialize. Coba diperiksa kembali...

    Demikian.

  5. Terima kasih master, memang kalo belajar gx punya dasarnya, gx bakal nympe, bisanya copas, tp gx bisa mengembangkan sndiri. Sekali lg terima kasih bnyk, smg tuhan membalas smw kebaikan anda.

  6. Caton

    Nov 13 Terverifikasi Indonesia + 15.163 Poin

    @bejo ...

    Sama-sama mas @bejo... Tidak apa-apa awalnya copas dahulu, yang penting script atau formula dipelajari dan dipahami. InsyaAllah nanti bisa menyusun script atau formula sendiri...

  7. Di sunting 4 minggu lalu oleh bejo

    MASTER @CATON, saya coba otak-atik, kira-kira bener gk ya???, terus pada file excel tersebut, ada sheet bantu PERKELAS yg datanya saya ambil dari sheet REKAPAN yg menurut saya dpat memproses lebih cepat ketimbang melihat data langsung pada sheet REKAPAN, menurtut master perlukah sheet bantu PERKELAS, atau lebih cepat melihat data langsung pada sheet REKAPAN, terima kasih

  8. Caton

    Nov 14 Terverifikasi Indonesia + 15.163 Poin
    Di sunting 4 minggu lalu oleh Caton

    @bejo ...

    ... perlukah sheet bantu PERKELAS, atau lebih cepat melihat data langsung pada sheet REKAPAN ...

    Apakah sheet PERKELAS itu benar-benar diperlukan? Kalau sheet tersebut hanya digunakan untuk filter data saat form input ditampilkan, saya pribadi lebih baik menggunakan objek Array atau menggunakan objek Range untuk menyimpan data yang terfilter. Lagi pula, pada saat memilih kelas melalui kontrol Cbkelas pada form input, terjadi lag dikarena ada 4 proses yang dikerjakan, yakni mengubah nilai sel AD2 pada sheet PERKELAS, mengubah nilai sel F1 pada sheet REKAPAN, mengisi ListBox Lbnama, dan menginisialisasi Array data.

    Jika data pada sheet REKAPAN sudah dalam keadaan tersortir, mengapa tidak menggunakan sheet tersebut sebagai sumber data? Bukankah pada sheet tersebut sudah ada data NIS, NAMA, KELAS dan lain-lainnya? Misalkan saja untuk range A4:AP1063 sheet REKAPAN tersebut bisa disimpan ke dalam array untuk diproses. Sebagai informasi, proses menggunakan Array cenderung lebih cepat dibandingkan proses menggunakan objek Range langsung.

    Hal lainnya adalah mengenai formula yang digunakan pada sheet REKAPAN, yang terlalu banyak menggunakan Array Formula. Contoh untuk sel F4 yang cukup menggunakan fungsi SUMIFS, contohnya :

    =IF($F$1=$B4;SUMIFS(Database!$F$6:$F$5000;Database!$B$6:$B$5000;$B4;Database!$C$6:$C$5000;$C4);"")

    Penggunaan Array Formula yang terlalu banyak dapat membuat proses kalkulasi berjalan lambat. Sebaiknya formula-formula tersebut disederhanakan (jika memungkinkan) tanpa Array Formula...

    Kembali ke pertanyaan, menurut saya tergantung mas @bejo akan memanfaatkan sheet PERKELAS untuk apa. Kalau saran saya, sebaiknya gunakan sheet tersebut hanya untuk menampilkan/melihat data per kelas secara manual (tanpa VBA). Untuk menampilkan data sesuai kelasnya, bisa menggunakan Validation List sebagai Drop Down List dari kelas yang akan difilter.

    Demikian menurut pendapat saya...

  9. Caton

    Nov 14 Terverifikasi Indonesia + 15.163 Poin

    Kemudian untuk utak-atik script berikut :

    -image-

    menurut saya sih sah saja. Benar atau tidaknya... ? Bisa jadi benar kalau hasilnya sesuai.

    Sedikit saran mengenai script yang mas buat, khususnya penggunaan objek CELLS. Oleh karena objek tersebut digunakan tanpa host atau parent object, maka objek CELLS akan bergantung kepada sheet yang aktif saat script digunakan. Coba saja aktifkan sheet DATABASE dan jalankan form input lalu lihat hasilnya. Pastinya hasilnya akan kosong karena pada sheet DATABASE kolom yang digunakan hanya sampai pada kolom ke-7 (kolom G).

    Bila data yang akan kita ambil memang berada pada sheet tertentu, sebaiknya gunakan objek CELLS dengan parent object misalkan:

    TextBox2 = Format(Sheet1.Cells(vIdx + 5, 39), "#,##")

    Untuk contoh script lainnya yang dapat digunakan:

    Private Sub Cbkelas_Change()
        ...
        '+-- Simpan data ke array.
        m_xArrayPerKelas = Sheet8.Range("H6:AQ" & Sheet8.Range("C" & Rows.Count).End(xlUp).Row).Value2
        m_xArrayNIS = Sheet8.Range("C6:C" & Sheet8.Range("C" & Rows.Count).End(xlUp).Row).Value2
        ...
    End Sub
    
    Private Sub Lbnama_change()
        Dim vIdx, vData
        Dim lX As Long
        
        If Lbnama.ListCount > 0 Then
            lstRiwayat.Clear
            If IsNumeric(Lbnama.Column(2)) Then
                vIdx = Application.Match(Lbnama.Column(2) * 1, m_xArrayNIS, 0)
                If IsNumeric(vIdx) Then
                    For lX = LBound(m_xArrayPerKelas, 2) To UBound(m_xArrayPerKelas, 2) Step 3
                        If lX > 30 Then Exit For
                        vData = m_xArrayPerKelas(vIdx, lX)
                        If Len(vData) And IsNumeric(vData) Then
                            With lstRiwayat
                                .AddItem Format(vData, "dd/mm/yyyy")
                                .List(.ListCount - 1, 1) = Format(m_xArrayPerKelas(vIdx, lX + 1), "#,##")
                                .List(.ListCount - 1, 2) = m_xArrayPerKelas(vIdx, lX + 2)
                            End With
                        Else
                            TextBox2 = Format(m_xArrayPerKelas(vIdx, 32), "#,##")
                            TextBox3 = Format(m_xArrayPerKelas(vIdx, 31), "#,##")
                            TextBox5 = Format(m_xArrayPerKelas(vIdx, 33), "#,##")
                            TextBox4 = Format(m_xArrayPerKelas(vIdx, 34), "#,##")
                            TextBox6 = Format(m_xArrayPerKelas(vIdx, 36), "#,##")
                            Exit For
                        End If
                    Next
                End If
            End If
        End If
    End Sub

    Pada script di atas, saya gunakan Array yang ada dengan sedikit modifikasi.

    Demikian.

  10. terima kasih banyak Master @Caton, akan saya pelajari lagi filenya, dan mencoba lebih merampingkan rumus2 array yg berulang2 dan mungkin tidak perlu, maklum master, baru belajaran, jadi alur flowchartnya jg baru belajaran, sekali lagi terima kasih . Jazakallah khairan katsira

 

atau Mendaftar untuk ikut berdiskusi!