Combobox tidak boleh menampilkan data ( Dari List ) lagi setelah input

  1. 4 bulan yang lalu
    Di sunting 4 bulan yang lalu oleh Chris212

    Pagi ,.

    saya mencoba menambah scrip ini di Combobox Change saya :
    me.CODE_C.removeitem me.CODE_C.Listindex
    01.JPG
    kemudian muncul error
    2.JPG

    Scrip Kombobox saya
    03.JPG

    Tujuan saya :
    saat saya pilih Unit " Dozer " kemudan Pilih Code " FD 28 " dan di klik save ,.
    maka akan tersimpan di database

    saat saya memilih Unit " Dozer " ( untuk save lagi ) maka di list combobox
    Code tidak ada unit FD 28 ( hilang / tidak dapat dipilih ) karena sudah masuk didatabase
    bagaiman agar tidak terjadi error invalid lgi ?

    ( code unit yg sudah di input ke data base tidak boleh muncul di list combobox )
    File :
    NEW BAST FAST.xlsb

    Terima kasih

  2. Caton

    Jul 28 Terverifikasi Indonesia + 17.741 Poin

    Mas @Chris212 ...

    Pada baris

    Me.CODE_C.List = dic(Me.UNIT_C.Value).keys

    maka seluruh item sebelumnya yang sudah ada pada ComboBox CODE_C akan terhapus dan diganti dengan nilai baru. Dengan demikian, properti ListIndex juga akan otomatis direset menjadi -1 (tidak ada item yang dipilih = Nothing). Sehingga, baris

    Me.CODE_C.RemoveItem Me.CODE_C.ListIndex

    akan menghasilkan kesalahan (Error) karena memerintahkan kontrol ComboBox untuk menghapus item dengan indeks yang tidak valid. Baris tersebut pada dasarnya dieksekusi seperti berikut ini:

    Me.CODE_C.List = dic(Me.UNIT_C.Value).keys
    '---> Me.CODE_C.List berisi daftar nilai baru.
    
    Me.CODE_C.RemoveItem Me.CODE_C.ListIndex 
    '---> Karena baris sebelumya telah membuat CODE_C direset, maka nilai
    '---> ListIndex kembali menjadi -1. Indeks item pada ComboBox sama dengan array
    '---> yakni dimulai dari 0. Maka menghapus item -1 akan menghasilkan Error
    '---> karena sudah Out of Bound!

    Tujuan saya : saat saya pilih Unit " Dozer " kemudan Pilih Code " FD 28 " dan di klik save ,.
    maka akan tersimpan di database...

    Kalau dilihat dari script yang sudah ada, sebenarnya alur prosesnya sudah tepat. Hanya saja, daripada memanggil kembali prosedur UserForm_Initialize, lebih baik dibuat prosedur khusus untuk menginisialisasi nilai ComboBox misalkan InitComboBox.

    Pada prosedur tersebut, periksa apakah ada item data yang ada pada sheet LIST yang sudah tersimpan di sheet DATABASE. Dengan demikian, data yang akan ditampilkan di ComboBox benar-benar data yang belum tersimpan saja.

    Demikian.

  3. Di sunting 4 bulan yang lalu oleh Chris212

    Mas @Caton

    Seperti biasanya Penjelasan mas @Caton Mantapp :)
    Terima kasih

    ada pertanyaaan lagi mas mengenai saat add seharunya masuk table ,.
    05.JPG
    tapi ini tidak masuk ke dalam table

    scrip yg saya gunaka sebelumnya

    Set newRow = ActiveSheet.ListObjects("TblMob")


    terus mas @Caton melakukan perubahan menjadi
    04.JPG
    yg saya bingung script di nonkatifkan tapi saat saya aktifkan error " Type missmatch " & saya mencoba menggunaka kode awal ( Sebelumnya ) sama error " Type missmatch " juga

    kemudian saya melakukan perubahan .DataBodyRange menjadi .ListRow.Add ,
    (

    Set newRow = Sheet2.ListObjects("TblMob").ListRows.Add

    script ini berjalan

    jadi yg ingin saya tanyakan kenapa 2 script tsb tidak bisa berjalan ,bisakah berikan penjelasan mengenai error dari 2 scritp ini
    1.Set newRow = ActiveSheet.ListObjects("TblMob")
    2.Set newRow = Sheet2.ListObjects("TblMob").DataBodyRange

    maaf merepotkan lagi & terima kasih :)

  4. Di sunting 4 bulan yang lalu oleh Chris212

    Duplikat , komen tidak bisa dihapus
    eheheh

  5. Caton

    Jul 29 Terverifikasi Indonesia + 17.741 Poin

    Mas @Chris212 ...

    Script yang mas buat tersebut, berhasil saya coba,

    image_2021-07-29_102542.png

    Adapun mengapa baris script

    Set newRow = Sheet2.ListObjects("TblMob").DataBodyRange

    saya non aktifkan, karena sebelumnya baris tersebut error. Mengenai baris script berikut,

    Set newRow = ActiveSheet.ListObjects("TblMob")
    Set newRow = Sheet2.ListObjects("TblMob").DataBodyRange

    Variabel newRow merupakan objek dengan tipe ListRow. Sedangkan

    ActiveSheet.ListObjects("TblMob")

    akan menghasilkan objek berupa ListObject (tabel), dan

    Sheet2.ListObjects("TblMob").DataBodyRange

    akan menghasilkan objek berupa Range. Jadi, karena tipe variabel newRow berbeda dengan object yang dirujuk, hasilnya akan berupa error, biasanya Type Mismatch. Saya pribadi jarang menggunakan objek ListRow saat akan menambahkan data ke ListObject. Biasanya, objek ListRow saya gunakan saat mengambil data per baris pada objek ListObject. Dengan menambahkan langsung data ke baris terakhir setelah range tabel, karena biasanya Excel akan secara otomatis memasukkan baris baru ke dalam range tabel.

    Untuk baris berikut,

    lastrow = rng.Find(what:="*", after:=rng.Cells(1), _
    lookat:=xlPart, LookIn:=xlFormulas, searchorder:=xlByRows, _
    searchdirection:=xlPrevious, MatchCase:=False).Row

    Untuk mendapatkan baris terakhir pada sebuah range atau tabel, saya lebih suka menggunakan cara lama, misalkan :

    lastrow = Sheet2.Cells(Rows.Count, "A").End(xlUp).Row
    If lastrow <= 3 Then lastrow = 4

    Selain itu, saya sarankan untuk menghindari penggunaan objek ActiveSheet, karena bisa merujuk ke Worksheet yang salah. Contoh, jika pengguna sedang membuka sheet LIST, kemudian mengeksekusi form tersebut, maka objek ActiveSheet akan merujuk kepada sheet LIST, bukan sheet DATABASE. Kalau memang ingin menggunakan objek ActiveSheet, maka pastikan terlebih dahulu Worksheet yang aktif benar-benar sheet target, misalkan dengan menggunakan script,

    ...
    Sheet2.Select
    lRow = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row
    ...

    Yang terakhir, pindahkan baris :

    Call InitComboBox

    ke atas sebelum baris memunculkan pesan,

        ...
        Call InitComboBox
        
        Dim i As VbMsgBoxResult
            i = MsgBox("Apakah Ingin Input Data?", vbYesNo + vbQuestion, "SAVE")
        If i = vbNo Then Exit Sub
        
        Call warna
        ...

    karena jika pengguna menekan tombol No, maka nilai pada ComboBox tetap sudah diupate terlebih dahulu.

    Demikian.

  6. mas @Caton

    Terima kasih atas penjelasannya :)
    Penjelasanya terbaik mudah dipahami
    ehehehehe

    Saya pelajari lagi mas ,.
    ternyata Kenapa tidak bisa masuk table secara auto karena pengaturan di Excel nya belum saya rubah ke auto ( ehehehehe )

    siap mas , karena direkomkan pakai cara lama , saya rubah ke lama saja :)
    akan saya perhatikan lagi mas pengunaan activesheetnya

    Terima kasih Mas @Caton
    :) :) :)

 

atau Mendaftar untuk ikut berdiskusi!