Täytä ListBox -ohjausobjekti arvoilla suljetusta työkirjasta käyttämällä Microsoft Excelin VBA: ta

Anonim

Tässä artikkelissa haemme tietoja suljetusta työkirjasta käyttäjämuodon luetteloruutuun VBA: ta käyttäen.

Tämän esimerkin raakatiedot ovat alueella A2: B10 "23SampleData.xls" -työkirjassa, joka on sijoitettu tiedostopolulle "D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \".

Olemme luoneet kaksi komentopainiketta päälaskentataulukkoon kahden eri käyttäjämuodon suorittamiseksi. Jokainen komentopainike on linkitetty eri käyttäjämuotoihin.

Looginen selitys

Tässä esimerkissä tietoja haetaan suljetusta työkirjasta kahdella eri tavalla. Nämä ovat:-

  1. Avaa suljettu työkirja ja hanki tiedot

  2. ADODB -yhteyden käyttäminen

Avaa suljettu työkirja ja hanki tiedot

On mahdollista asettaa ListBox -ohjausobjektin RowSource -ominaisuus hakemaan tietoja toisesta työkirjasta määrittämällä arvo RowSource -ominaisuudelle seuraavasti:

’[Tiedostonimi.xls] Taulukko1?! $ B $ 1: $ B $ 15

ListBox Control näyttää arvot vain, jos toinen työkirja on auki.

Joten hakeaksesi tiedot suljetusta työkirjasta, luomme makron, joka avaa toisen työkirjan ilman, että käyttäjä huomaa sitä ja hakee tietoja työkirjasta lisätäksesi kohteita luetteloruutuun ja sulkemalla työkirjan.

"Valitse" -painikkeen napsauttaminen aktivoi käyttäjämuodon "UserForm1". Käyttäjämuodon alustustapahtumaa käytetään kohteiden lisäämiseen luetteloruutuun. Tämä tapahtuma avaa ensin suljetun työkirjan ja määrittää sitten alueen arvon "ListItems" -muunnelmalle. Arvon määrittämisen jälkeen työkirja suljetaan ja kohteet lisätään luetteloruutuun.

Luetteloruutua käytetään nimen valitsemiseen olemassa olevista luetteloarvoista. “OK” -painikkeen painaminen näyttää valitun nimen.

ADODB -yhteyden käyttäminen

ActiveX Data Objects (ADO) on korkeatasoinen, helppokäyttöinen käyttöliittymä OLE DB -yhteyttä varten. Se on ohjelmointirajapinta tietokannan tietojen käyttämiseen ja käsittelyyn.

ADODB -yhteyden luomiseksi meidän on lisättävä projektiin ADO -kirjasto.

Lisää viite valitsemalla Työkalut -valikosta> Viite.

Laskentataulukon ”ADODB -yhteys” -painikkeen napsauttaminen aktivoi ”UFADODB” -käyttäjälomakkeen. Tämän käyttäjämuodon alustustilaisuudessa olemme hakeneet tietoja suljetusta työkirjasta ADODB -yhteyden avulla. Olemme luoneet mukautetun käyttäjän määrittämän toiminnon (UDF) ”ReadDataFromWorkbook” yhteyden muodostamiseksi ja tietojen hakemiseksi suljetusta työkirjasta taulukkoon.

Olemme käyttäneet toista UDF “FillListBox” -kohtaa kohteiden lisäämiseen luetteloruutuun käyttäjämuodon alustuksen aikana. Luetteloruutu näyttää tiedot kahdessa sarakkeessa, yksi sarake sisältää nimen ja toinen sarake sisältää iän.

Painamalla “OK” -painiketta sen jälkeen, kun olet valinnut kohteen luetteloruudusta, näyttöön tulee valitun kohteen tietosanoma.

Seuraa koodia alla

 Option Explicit Sub running () UserForm1.Show End Sub Sub ADODBrunning () UFADODB. arvo luetteloruudussa muuttujan nimeen1 ja ikä1: i = 0 ListBox1.ListCount - 1 Jos ListBox1.Selected (i) Sitten nimi1 = ListBox1.Value age1 = ListBox1.List (ListBox1.ListIndex, 1) Lopeta Lopeta, jos seuraava ' Unload the userform Unload Me 'Näytetään tulos MsgBox "Olet valinnut" & name1 & ". Hänen ikänsä on" & age1 & "yrs." Lopeta Sub Yksityinen alikäyttäjä UserForm_Initialize () 'Täytä ListBox1 tiedoilla suljetusta työkirjasta Dim tArray as Variant' Soittotoiminto ReadDataFromWorkbook tietojen saamiseksi määritetystä alueesta taulukkoon 'Muuta polkua vaatimuksesi mukaan, "Sample_data" on nimetty määritellyllä alueella tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", "Sample_Data") 'Soittotoiminto FillListBox kohteiden lisäämiseksi luetteloruutuun' Määritä luetteloruudun objekti ja taulukko parametriksi FillListBox Me .ListBox1, tArray 'Vapauta matriisimuuttujat ja kohdista niiden elementeille käytetty muisti. Poista tArray End Sub Private Sub FillListBox (lb MSForms.ListBox, RecordSetArray As Variant) 'Täyttöluetteloruutu lb, jossa on tietoja RecordSetArray Dim r Niin pitkä, c Niin kauan ja lb .Clear' Arvojen määrittäminen luetteloruutuun , 2) UBoundiin (RecordSetArray, 2) .AddItem For c = LBound (RecordSetArray, 1) UBoundiin (RecordSetArray, 1). Lista (r, c) = RecordSetArray (c, r) Seuraava c Seuraava r 'Ei kohteen valitseminen Luettelo -ruudussa oletuksena. ) Dim dbConnection ADODB.Connection, rs ADODB.Recordset Dim dbConnectionString as String 'Yhteysmerkkijonon ilmoittaminen ja ohjain edellyttävät yhteyden muodostamista dbConnectionString = "DRIVER = {Microsoft Excel -ohjain (*.xls)}; ReadOnly = 1; DBQ = "& SourceFile 'Uuden ADODB -yhteyden luominen Aseta dbConnection = Uusi ADODB.Connection On Error GoTo InvalidInput 'Avaa tietokantayhteys dbConnection.Open dbConnectionString' Tietuejoukon hakeminen määritetystä nimetystä alueesta Set rs = dbConnection.Execute ("[" & SourceRange & "]") On Error GoTo 0 'Palauttaa kaksi ulottuvuusmatriisi, jossa kaikki tietueet ovat rs ReadDataFromWorkbook = rs.GetRows 'Sulje tietue- ja tietokantayhteys rs.Close dbConnection.Close Set rs = Nothing Set dbConnection = Nothing Exit Function' Code for error käsittely InvalidInput: MsgBox "Lähdetiedosto tai lähdealue on virheellinen " ListBox1.ListCount - 1 Jos ListBox1.Selected (i) Sitten name1 = ListBox1.Value Lopeta Lopeta Jos Seuraava 'Poista käyttäjämuoto Unload Me' Näytä valittu nimi MsgBox "Olet valinnut" & name1 & "." End Sub Private Sub UserForm_Initialize () Dim ListItems as Variant, i As Integer Dim SourceWB As Workbook 'Näytön päivitysten poistaminen käytöstä Application.ScreenUpdating = False With Me.ListBox1' Poista olemassa olevat merkinnät luetteloruudusta. Clear SourceWB = Työkirjat.Open ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", _ False, True) "Hae haluamasi arvoalue ListItems = SourceWB.Worksheets (1 ) .Range ("A2: A10"). Arvo 'Sulje lähdekirjan tallentamatta muutoksia SourceWB.Close False Set SourceWB = Nothing Application.ScreenUpdating = True' Muunna arvot pystysuoraksi taulukkoksi ListItems = Application.WorksheetFunction.Transpose (ListItems) Jos i = 1 UBoundiin (ListItems) 'Täytä luetteloruutu .AddItem ListItems (i) Seuraava i' Jos et valitse oletuksena mitään kohteita, aseta 0 ja valitse ensimmäinen kohde .ListIndex = -1 End With End Sub 

Jos pidit tästä blogista, jaa se ystävillesi Facebookissa. Voit myös seurata meitä Twitterissä ja Facebookissa.

Haluaisimme kuulla sinusta, kerro meille, kuinka voimme parantaa työtämme ja parantaa sitä sinulle. Kirjoita meille sähköpostitse