Bu yazımızda, VBA kullanarak kullanıcı formundaki kapalı çalışma kitabından Liste kutusuna veri getireceğiz.
Bu örnek için ham veriler, “D:\Excelforum\ExcelForum office\excel ipucu eski kod\Paylaşılan Makro\23\” dosya yoluna yerleştirilen “23SampleData.xls” çalışma kitabında A2:B10 aralığındadır.
Ana çalışma sayfasında iki farklı kullanıcı formunu çalıştırmak için iki adet komut butonu oluşturduk. Her komut düğmesi farklı kullanıcı formlarına bağlıdır.
Mantıksal açıklama
Bu örnekte, kapalı çalışma kitabından veri almak için iki farklı yol kullanılmıştır. Bunlar:-
-
Kapalı çalışma kitabını açın ve verileri alın
-
ADODB Bağlantısını Kullanma
Kapalı çalışma kitabını açın ve verileri alın
Bir ListBox denetiminin RowSource özelliğini, RowSource özelliğine aşağıdaki gibi değer atayarak diğer çalışma kitabından veri alacak şekilde ayarlamak mümkündür:
'[Dosyaadı.xls] Sayfa1?!$B$1:$B$15
ListBox Control, yalnızca diğer çalışma kitabı açıksa değerleri görüntüler.
Bu nedenle, kapalı çalışma kitabından veri almak için, diğer çalışma kitabını kullanıcı fark etmeden açmak için bir makro oluşturacağız ve Liste Kutusuna öğe eklemek ve çalışma kitabını kapatmak için çalışma kitabından veri alacağız.
“Seç” düğmesine tıklamak, “UserForm1” kullanıcı formunu etkinleştirecektir. Kullanıcı formunun Initialize olayı, liste kutusuna öğe eklemek için kullanılır. Bu olay önce kapatılan çalışma kitabını açar ve ardından aralıktaki değeri “ListItems” varyantına atar. Değer atandıktan sonra çalışma kitabı kapatılır ve öğeler liste kutusuna eklenir.
Liste kutusu, mevcut liste değerlerinden isim seçmek için kullanılır. “OK” düğmesine basıldığında seçilen isim görüntülenecektir.
ADODB Bağlantısını Kullanma
ActiveX Data Objects (ADO), OLE DB bağlantısı için üst düzey, kullanımı kolay bir arabirimdir. Bir veritabanındaki verilere erişmek ve bunları işlemek için bir programlama arabirimidir.
ADODB bağlantısı oluşturmak için projeye ADO kütüphanesini eklememiz gerekecek.
Referans eklemek için Araçlar menüsü > Referans'tan seçin.
Çalışma sayfasındaki “ADODB Bağlantısı” butonuna tıklamak “UFADODB” kullanıcı formunu aktif hale getirecektir. Bu kullanıcı formunun initialize olayında, kapalı çalışma kitabından veri almak için ADODB bağlantısını kullandık. Bağlantıyı kurmak ve verileri kapalı çalışma kitabından diziye getirmek için özel bir Kullanıcı Tanımlı İşlev (UDF) “ReadDataFromWorkbook” oluşturduk.
Kullanıcı formunun başlatılması sırasında Liste kutusuna öğeler eklemek için başka bir UDF “FillListBox” kullandık. Liste Kutusu verileri iki sütun halinde görüntüler, bir sütun adı, ikinci sütun ise yaşı içerir.
Liste kutusundaki öğeyi seçtikten sonra “OK” düğmesine basıldığında, seçilen öğe hakkında bilgi mesajı görüntülenecektir.
Lütfen kod için aşağıdan takip edin
Seçenek Explicit Sub Running() UserForm1.Show End Sub Sub ADODBrunning() UFADODB.Show End Sub 'UFADODB kullanıcı formunda aşağıdaki kodu ekleyin Option Explicit Private Sub CommandButton1_Click() Dim name1 As String Dim age1 As Integer Dim i As Integer 'Seçiliyi ata liste kutusundaki değer name1 ve age1 değişkenine i = 0 için ListBox1.ListCount - 1 If ListBox1.Selected(i) O zaman name1 = ListBox1.Value age1 = ListBox1.List(ListBox1.ListIndex, 1) Exit For End If Next ' Kullanıcı formunu kaldır Unload Me 'MsgBox "" & name1 & " seçeneğini seçtiniz. Onun yaşı " & age1 & " yrs." End Sub Private Sub UserForm_Initialize() 'ListBox1'i kapalı bir çalışma kitabından verilerle doldurma Dim tArray As Variant 'Belirtilen aralıktan diziye veri almak için ReadDataFromWorkbook işlevi çağırma 'Gereksiniminize göre yolu değiştirin, "Sample_data", tanımlı aralık tArray = ReadDataFromWorkbook olarak adlandırılır ("D:\Excelforum\ExcelForum office\excel ipucu eski kod\Paylaşılan Makro\23\23SampleData.xls", "Sample_Data") 'FillListBox'ı Liste Kutusuna öğe eklemek için çağırma işlevi 'FillListBox Me parametresi olarak Liste kutusu nesnesini ve tarrayini ata .ListBox1, tArray 'Dizi değişkenlerini serbest bırakma ve öğeleri için kullanılan belleği serbest bırakma. Erase tArray End Sub Private Sub FillListBox(lb As MSForms.ListBox, RecordSetArray As Variant) 'List kutusu lb'yi RecordSetArray'den gelen verilerle Doldurma Dim r As Long, c As Long With lb .Clear 'Listbox'a değer atama For r = LBound(RecordSetArray , 2) UBound(RecordSetArray, 2) .AddItem For c = LBound(RecordSetArray, 1) To UBound(RecordSetArray, 1) .List(r, c) = RecordSetArray(c, r) Sonraki c Sonraki r 'Hiçbir öğe seçme Varsayılan olarak Liste kutusunda .ListIndex = -1 End With Sub Private Function ReadDataFromWorkbook(SourceFile As String, _ SourceRange As String) As Variant ' Microsoft ActiveX Data Objects kitaplığına bir başvuru gerektirir ' (menü Araçları > VBE'deki Referanslar ) Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String 'Bağlantı kurmak için bir bağlantı dizesi ve sürücü gerekliliğini bildirme dbConnectionString = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ =" & SourceFile 'Yeni bir ADODB bağlantısı oluşturma Set dbConnection = Yeni ADODB.Connection Hatasında GoTo InvalidInput 'Veritabanı bağlantısını aç dbConnection.Open dbConnectionString 'Tanımlanmış adlandırılmış aralıktan kayıt kümesi alınıyor Set rs = dbConnection.Execute("[" & SourceRange & "]") Hatada GoTo 0 'İki döndürür rs ReadDataFromWorkbook içindeki tüm kayıtları içeren boyutlu dizi = rs.GetRows 'Kayıt kümesini ve veritabanı bağlantısını kapatın rs.Close dbConnection.Close Set rs = Nothing Set dbConnection = Nothing Exit Function 'Hata işleme kodu InvalidInput: MsgBox "Kaynak dosya veya kaynak aralığı geçersiz!", _ vbExclamation, "Kapalı çalışma kitabından veri al" End Function 'UserForm1'e aşağıdaki kodu ekle Seçenek Explicit Private Sub CommandButton1_Click() Dim name1 As String Dim i As Integer 'Seçili değeri name1 değişkenine atayın For i = 0 ListBox1.ListCount'a - 1 ListBox1.Selected(i) ise, o zaman name1 = ListBox1.Value Exit For End If Next 'Kullanıcı formunu kaldır Beni Kaldır' Seçili ismi göster MsgBox "" & name1 & " seçtiniz." End Sub Private Sub UserForm_Initialize() Dim ListItems As Variant, i Integer Dim SourceWB As Workbook 'Ekran güncellemeleri kapatılıyor Application.ScreenUpdating = False With Me.ListBox1 'Mevcut girdileri liste kutusundan kaldır .Clear 'Kaynak çalışma kitabını ReadOnly Set olarak aç SourceWB = Workbooks.Open("D:\Excelforum\ExcelForum office\excel ipucu eski kod\Paylaşılan Makro\23\23SampleData.xls", _ False, True) 'İstediğiniz değer aralığını alın ListItems = SourceWB.Worksheets(1 .Range("A2:A10").Value 'Değişiklikleri kaydetmeden kaynak çalışma kitabını kapatın SourceWB.Close False Set SourceWB = Nothing Application.ScreenUpdating = True 'Değerleri dikey bir diziye dönüştür ListItems = Application.WorksheetFunction.Transpose(ListItems) For i = 1 To UBound(ListItems) 'Listbox'ı doldurun .AddItem ListItems(i) Sonraki i 'Varsayılan olarak hiçbir öğe seçilmiyor, ilk öğeyi seçmek için 0'a ayarlayın .ListIndex = -1 End With End Sub
Bu blogu beğendiyseniz, Facebook'ta arkadaşlarınızla paylaşın. Ayrıca bizi Twitter ve Facebook'ta da takip edebilirsiniz.
Sizden haber almayı çok isteriz, işimizi nasıl geliştirebileceğimizi ve sizin için nasıl daha iyi hale getirebileceğimizi bize bildirin. E-posta sitesinde bize yazın