Cara Mencari data di CmdButton berdasarkan ComboBox

  1. 10 bulan yang lalu

    Private Sub CommandButton4_Click()
    Dim findvalue As Range
    Set findvalue = Sheet1.Range("A1:L30").Find(what:=Me.ComboBox1.Value, LookIn:=xlFormulas, lookat:=xlWhole)
    Me.nis.Value = findvalue.Value
    Me.NmaSws.Value = findvalue.Offset(0, 1).Value
    Me.kd1.Value = findvalue.Offset(0, 2).Value
    Me.kd2.Value = findvalue.Offset(0, 3).Value
    Me.kd3.Value = findvalue.Offset(0, 4).Value
    Me.kd4.Value = findvalue.Offset(0, 5).Value
    Me.pt1.Value = findvalue.Offset(0, 6).Value
    Me.pt2.Value = findvalue.Offset(0, 7).Value
    Me.pt3.Value = findvalue.Offset(0, 8).Value
    Me.pt4.Value = findvalue.Offset(0, 8).Value
    Me.mid.Value = findvalue.Offset(0, 10).Value
    Me.uas.Value = findvalue.Offset(0, 11).Value
    End Sub

    Mau nanya saya bikin btn cari nilai siswa dengan kode pencarian nis berdasarkan Combobox1 dengan Set findvalue = Sheet1.Range("A1:L30").Find(what:=Me.ComboBox1.Value, LookIn:=xlFormulas, lookat:=xlWhole)
    dan programnya berjalan, namun ketika saya copy pakai Arrange All Windows ke file excel yang saya inginkan dan saya edit dengan menggantikan Sheet1 jadi sheet34 karna halaman pengerjaan di sheet34
    ComboBox1 tidak bisa memasukkan data nis untuk di search/ alias kosong tidak tervalidasi jadi harus memasukkan data secara manual/ketik untuk bisa disearch ( apakah karena jarak sheet1 dan sheet34 terlalu jauh sehingga excel terbatas untuk mengeksekusinya sekian trim's

  2. Caton

    24 Peb 2018 Terverifikasi Indonesia + 13.271 Poin

    Mas @mraikarzf ... Untuk pertanyaan:

    ... apakah karena jarak sheet1 dan sheet34 terlalu jauh sehingga excel terbatas untuk mengeksekusinya ...

    dalam VBA, tidak ada masalah jarak sebagaimana yang dimaksud, karena setiap Worksheet dalam VBA merupakan sebuah objek. Dalam VBA, sebuah objek dapat diraih apabila objek tersebut eksis dalam proses terkait (misalkan Application Object). Meskipun sebuah Worksheet berada pada Workbook yang berbeda, apabila masih dalam satu aplikasi yang sama, dengan VBA Worksheet Object biasanya masih bisa di akses.

    Mengenai hal yang ditanyakan, yang tidak saya pahami adalah bagaimana isi dari ComboBox1 ditambahkan (dipopulasikan), apakah melalui scripting atau secara manual. Karena kemungkinan yang bisa saja terjadi terhadap ComboBox1 saat Sheet1 disalin ke Workbook berbeda adalah:

    [1]. Jika daftar nilai pada ComboBox1 dipopulasikan secara manual dengan mengisi properti ListFillRange secara langsung, maka:

    — jika daftar nilai pada ComboBox1 dipopulasikan dari range pada Worksheet yang sama (yakni pada Sheet1, misalkan properti ListFillRange diisi dengan nilai/teks A2:A10), maka menyalin Sheet1 ke Workbook berbeda tidak akan membuat daftar nilai pada ComboBox1 hilang setelah Workbook asalnya ditutup (dalam hal ini, properti ListFillRange akan tetap terisi nilai/teks A2:A10).

    — jika daftar nilai pada ComboBox1 dipopulasikan dari range pada Worksheet yang berbeda (misalkan dari Sheet2, dimana properti ListFillRange diisi dengan nilai/teks Sheet2!A2:A10), maka menyalin Sheet1 ke Workbook berbeda akan membuat daftar nilai pada ComboBox1 hilang setelah Workbook acuannya ditutup. Dalam hal ini, setelah disalin, properti ListFillRange akan terisi nilai/teks kurang lebih seperti berikut:

    '[Workbook_Acuan.xlsm]Sheet2'!A2:A10

    namun properti ListFillRange nilai/teks berubah saat Workbook acuannya ditutup menjadi kurang lebih seperti berikut:

    'C:\Excel\[Workbook_Acuan.xlsm]Sheet2'!A2:A10

    [2]. Jika daftar nilai pada ComboBox1 dipopulasikan melalui kode VBA, maka hal ini tergantung kepada prosesnya, apakah kode VBA untuk mengisi nilai pada ComboBox1 sudah dieksekusi atau belum.

    Demikian yang dapat saya jelaskan. Mungkin mas @mraikarzf lampirkan saja file yang dimaksud agar dapat dipelajari masalahnya dan dapat dicarikan solusinya... ;)

  3. Sheet 34

  4. Caton

    27 Peb 2018 Terverifikasi Indonesia + 13.271 Poin

    Penjelasan awal mas @mraikarzf membuat saya (atau rekan-rekan lain yang membacanya) menduga ComboBox1 merupakan ActiveX Control yang diletakkan pada Worksheet Object. Perlu diketahui, sebuah ActiveX Control yang diletakkan pada sebuah Worksheet akan menjadi member dari Worksheet Object bersangkutan, demikian pula ketika ActiveX Control diletakkan pada UserForm Object. Meskipun kontrol yang digunakan sama (misalkan ComboBox), namun ada beberapa perbedaan properti dan event dari sebuah ActiveX Control yang diletakkan pada Worksheet Object dengan sebuah ActiveX Control yang diletakkan pada UserForm Object.

    Oleh karena kontrol ComboBox yang dimaksud adalah member dari UserForm Object (sesuai lampiran file di atas), maka proses populasi nilai dari kontrol ComboBox tersebut otomatis harus dilakukan melalui VBA Code. Sebagaimana yang saya jelaskan sebelumnya:

    [2]. Jika daftar nilai pada ComboBox1 dipopulasikan melalui kode VBA, maka hal ini tergantung kepada prosesnya, apakah kode VBA untuk mengisi nilai pada ComboBox1 sudah dieksekusi atau belum.

    Pada modul UserForm FormPai, properti RowSource dari kontrol ComboBox valid1 tidak terisi baik secara manual maupun secara otomatis melalui scripting. Pada Code Window, saya menduga mas @mraikarzf ingin mempopulasikan isi kontrol ComboBox tersebut melalui prosedur:

    Private Sub FormPai_Initialize()
    Dim lrow As Long
    lrow = Application.WorksheetFunction.CountA(Sheet34).Range("A1:L30") + 1
    Me.valid1.RowSource = "Sheet34!A2:A" & lrow
    End Sub

    Namun pada kenyataannya, prosedur di atas tidak tereksekusi disebabkan oleh karena:

    FormPai bukan merupakan objek berupa ActiveX Control. Sintaks nama prosedur seperti tersebut biasanya digunakan oleh VBA untuk membuat sebuah Event Procedure dari sebuah objek baik berupa ActiveX Control maupun Early Binding Object. Sintaksnya berupa Object_Event(Parameters). Sedangkan untuk UserForm dan Class Module, ada pengecualian. Oleh karena UserForm merupakan Host (Parent Object) bagi objek-objek lainnya dan Class Module merupakan sebuah modul khusus yang harus dibuat (Create) dahulu sebelum dapat digunakan, maka VBA membuat nama-nama Event Procedure berdasarkan kelas objeknya langsung. Sintak yang digunakan pada UserForm Event Procedures adalah UserForm_Event(Parameters) (misalkan UserForm_Terminate()) dan pada Class Module berupa Class_Event() (misalkan Class_Initialize()).

    — Event Initialize hanya digunakan pada objek seperti Class Module dan UserForm. Misalkan FormPai merupakan sebuah ActiveX Control), maka jika objek FormPai tersebut tidak memiliki event Initialize, otomatis prosedur tersebut tidak akan pernah dieksekusi. Pada dasarnya, saat menyusun script VBA-nya, kita dapat melihat dan memilih sebuah objek melalui DropDown List Object dan prosedur yang dimiliki oleh objek yang kita pilih melalui DropDown List Procedures pada Code Window VBE.

    Jika mas @mraikarzf ingin mengisi daftar nilai pada kontrol ComboBox valid1 pada saat UserForm FormPai diloading, maka prosedur yang tepat adalah:

    Private Sub UserForm_Initialize()
    ...
    End Sub

    Kemudian, untuk script berikut:

    lrow = Application.WorksheetFunction.CountA(Sheet34).Range("A1:L30") + 1

    akan menimbulkan kesalahan dan tidak akan menghasilkan jumlah baris yang tepat, oleh karena fungsi WorksheetFunction.CountA dirujuk ke sebuah Worksheet Object, bukan Range Object (lihat notasi CountA(Sheet34)). Dan jika hanya ingin mengambil baris pada kolom A Sheet34, maka notasi Range("A1:L30") merujuk ke area yang terlalu luas. Cukup dirujuk ke kolom yang sama saja (yakni kolom A), sehingga notasi tersebut harusnya menjadi Range("A1:A30"). Dengan demikian, perbaikannya akan menjadi:

    Private Sub UserForm_Initialize()
        Dim lRow As Long
        
        lRow = Application.WorksheetFunction.CountA(Sheet34.Range("A1:A30")) + 1
        Me.valid1.RowSource = "Sheet34!A2:A" & lRow - 1
    End Sub

    Demikian masalah yang saya temukan dan yang dapat saya jelaskan. Semoga sesuai... ;)

 

atau Mendaftar untuk ikut berdiskusi!