Looping Nama Textbox dan ComboBox

  1. 6 tahun lalu

    Siang semua,

    Kasus : Sheet1 mempunyai 102 kolom. Setiap UserForm memasukkan dan mengambil data dari kolom secara acak. Dengan cara looping akan terjadi error, karena object tidak ada dalam salah satu form.
    Contoh : UserForm1 mempunyai TextBox 30 dan ComboBox 6, data yang dimasukkan dari UserForm1 masuk ke kolom 1,2,3,4,7,12,30, (acak) ,97.
    Bagaimana mengatasi hal tersebut?

    RadenMasX

    ...setiap form akan memasukkan dan mengambil data dari kolom yang tidak beraturan...

    Maksudnya bagaimana? Untuk masalah kode VBA sebelumnya, itu dapat diatasi dengan trik menyimpan indeks kolom target pada setiap kontrol input... ;) Setiap kontrol pada UserForm memiliki properti TAG. Nah, triknya kita bisa menyimpan indeks kolom sel target pada properti TAG ini. Sedangkan proses looping setiap kontrol, gunakan fungsi FOR EACH. Contohnya:

    Private Sub CommandButton1_Click()
        Dim objControl As Control
        Dim sName As String
        Dim lLastRow, lCol As Long
        
        With ActiveSheet
            lLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
        End With
        
        sName = "TextBox|ComboBox"
        For Each objControl In Me.Controls
            If InStr(1, sName, TypeName(objControl)) > 0 Then
                If objControl.Tag <> vbNullString Then
                    If IsNumeric(objControl.Tag) Then
                        lCol = Val(objControl.Tag)
                        Cells(lLastRow, lCol) = objControl.Text
                    End If
                End If
            End If
        Next
    
    End Sub

    Pada UserForm, kontrol properti TAG dari kontrol TextBox1 diisi dengan kolom target, misalnya 1. Sehingga, tidak masalah susunannya acak, baris kode:

    Cells(lLastRow, lCol) = objControl.Text

    akan otomatis mengisi nilai dari kontrol ke kolom yang dituju sesuai variabel lCol yang merupakan konversi nilai dari properti TAG dari kontrol input... ;)

  2. Caton

    6 Okt 2017 Terverifikasi Indonesia + 20.101 Poin

    Mas @RadenMasX... Bagaimana jika dilampirkan saja filenya :) Soalnya, susah untuk membayangkan apa dan bagaimana maksud dari error pada saat looping karena object tidak ada dalam salah satu form... :D

  3. Form sedikit di kecilkan tapi intinya sama.

    tes.xlsm

  4. Caton

    6 Okt 2017 Terverifikasi Indonesia + 20.101 Poin
    Di sunting 6 tahun lalu oleh Caton

    Jika kode VBA pada sub CommandButton1_Click dieksekusi, jelas berpotensi masalah...

    barisakhir = Range("A1").End(xlDown).Row + 1
    For i = 2 To barisakhir
        Cells(barisakhir, i) = Controls("TextBox" & i).Value
    Next

    Pada baris kode di atas, ketika dieksekusi dengan Sheet1 sebagai ActiveSheet, maka nilai barisakhir = 23. Saat variabel i mencapai nilai 19, masalah kemudian timbul karena pada UserForm1 tidak ada control TextBox19.

  5. Tepat Sekali! itulah masalahnya. setiap form akan memasukkan dan mengambil data dari kolom yang tidak beraturan.
    Pertanyaanku, adakah cara lain selain menulis kode untuk setiap kolom satu-persatu atau menambahkan sheet baru yang terintegrasi dengan sheet1?

    Cells(barisakhir,1)=TextBox1.Value
    Cells(barisakhir,2)=TextBox2.Value
    .
    .
    .
    Cells(barisakhir,102)=TextBox12.Value

  6. Caton

    6 Okt 2017 Terverifikasi Jawaban Terpilih Indonesia + 20.101 Poin

    ...setiap form akan memasukkan dan mengambil data dari kolom yang tidak beraturan...

    Maksudnya bagaimana? Untuk masalah kode VBA sebelumnya, itu dapat diatasi dengan trik menyimpan indeks kolom target pada setiap kontrol input... ;) Setiap kontrol pada UserForm memiliki properti TAG. Nah, triknya kita bisa menyimpan indeks kolom sel target pada properti TAG ini. Sedangkan proses looping setiap kontrol, gunakan fungsi FOR EACH. Contohnya:

    Private Sub CommandButton1_Click()
        Dim objControl As Control
        Dim sName As String
        Dim lLastRow, lCol As Long
        
        With ActiveSheet
            lLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
        End With
        
        sName = "TextBox|ComboBox"
        For Each objControl In Me.Controls
            If InStr(1, sName, TypeName(objControl)) > 0 Then
                If objControl.Tag <> vbNullString Then
                    If IsNumeric(objControl.Tag) Then
                        lCol = Val(objControl.Tag)
                        Cells(lLastRow, lCol) = objControl.Text
                    End If
                End If
            End If
        Next
    
    End Sub

    Pada UserForm, kontrol properti TAG dari kontrol TextBox1 diisi dengan kolom target, misalnya 1. Sehingga, tidak masalah susunannya acak, baris kode:

    Cells(lLastRow, lCol) = objControl.Text

    akan otomatis mengisi nilai dari kontrol ke kolom yang dituju sesuai variabel lCol yang merupakan konversi nilai dari properti TAG dari kontrol input... ;)

  7. Caton

    7 Okt 2017 Terverifikasi Indonesia + 20.101 Poin
    Di sunting 6 tahun lalu oleh Caton

    Coba mas @RadenMasX pelajari dari file terlampir... Lihat properti TAG dari kontrol TextBox dan ComboBox pada UserForm1, masing-masing saya isi nomor indeks kolom target pada Sheet1. Tidak masalah urutannya acak, asal dipastikan tidak ada indeks yang sama agar tidak terjadi overwrite... :)

  8. mas @Caton,

    Inilah yang saya cari!
    Terima kasih banyak!

  9. Caton

    7 Okt 2017 Terverifikasi Indonesia + 20.101 Poin

    Sama-sama mas @RadenMasX ... semoga bermanfaat dan silahkan diskusikan kembali jika ada kendala dan masalah ;)

 

atau Mendaftar untuk ikut berdiskusi!