Selles artiklis toome andmed suletud töövihikust kasutajavormis loendikasti VBA abil.
Selle näite toorandmed on töövihiku „23SampleData.xls” vahemikus A2: B10, mis paigutatakse failiteele „D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \”.
Oleme loonud töölehele kaks käsunuppu kahe erineva kasutajavormi käitamiseks. Iga käsunupp on lingitud erinevate kasutajavormidega.
Loogiline seletus
Selles näites kasutatakse suletud töövihikust andmete toomiseks kahte erinevat viisi. Need on:-
-
Avage suletud töövihik ja hankige andmed
-
ADODB -ühenduse kasutamine
Avage suletud töövihik ja hankige andmed
Võimalik on määrata ListBoxi juhtelemendi atribuut RowSource, et saada andmeid teisest töövihikust, määrates atribuudile RowSource väärtuse järgmiselt.
„[Filename.xls] Sheet1?! $ B $ 1: $ B $ 15
ListBox Control kuvab väärtusi ainult siis, kui teine töövihik on avatud.
Nii et andmete toomiseks suletud töövihikust loome makro, mis avab teise töövihiku, ilma et kasutaja seda märkaks ja töövihikust andmeid tooks, et lisada loendikasti üksusi ja sulgeda töövihik.
Kui klõpsate nupul „Vali”, aktiveeritakse kasutajavorm „UserForm1”. Kasutajavormi initsialiseerimissündmust kasutatakse loendikasti üksuste lisamiseks. See sündmus avab esmalt suletud töövihiku ja seejärel määrab vahemiku väärtuse variandile „ListItems”. Pärast väärtuse määramist suletakse töövihik ja loendiboksi lisatakse üksused.
Loendiboksi kasutatakse nime valimiseks olemasolevatest loendiväärtustest. Vajutades nuppu “OK”, kuvatakse valitud nimi.
ADODB -ühenduse kasutamine
ActiveX andmeobjektid (ADO) on kõrgetasemeline ja hõlpsasti kasutatav liides OLE DB ühenduse jaoks. See on programmeerimisliides andmebaasi andmetele juurdepääsuks ja nendega manipuleerimiseks.
ADODB -ühenduse loomiseks peame projekti lisama ADO raamatukogu.
Viite lisamiseks valige menüüst Tööriistad> Viide.
Kui klõpsate töölehel nuppu „ADODB -ühendus”, aktiveeritakse kasutajavorm „UFADODB”. Selle kasutajavormi lähtestamise korral oleme suletud töövihikust andmete toomiseks kasutanud ADODB -ühendust. Oleme loonud kohandatud kasutaja määratud funktsiooni (UDF) „ReadDataFromWorkbook”, et luua ühendus ja tuua andmed suletud töövihikust massiivi.
Kasutajavormi lähtestamisel kasutasime loendikasti üksuste lisamiseks teist UDF -i „FillListBox”. Loendiboks kuvab andmed kahes veerus, ühes veerus on nimi ja teises veerus vanus.
Kui vajutate nuppu „OK“ pärast loendi loendis üksuse valimist, kuvatakse valitud üksuse kohta teave.
Palun järgige koodi allpool
Valik Selgesõnaline alamjooks () UserForm1.Show End Sub Sub ADODBrunning () UFADODB.Show End Sub 'Lisa allolev kood UFADODB kasutajavormis Valik Explicit Private Sub CommandButton1_Click () Dim name1 String Dim age1 As Integer Dim i As Integer' Määra valitud väärtus loendiboksis muutuja nimele1 ja vanusele1 i = 0 jaoks ListBox1.ListCount - 1 Kui ListBox1.Selected (i) Siis name1 = ListBox1.Value age1 = ListBox1.List (ListBox1.ListIndex, 1) Exit For End If Next ' Unload the userform Unload Me 'Kuvatakse väljund MsgBox "Olete valinud" & name1 & ". Tema vanus on" & age1 & "yrs." End Sub Private Private UserForm_Initialize () 'ListBox1 täitmine suletud töövihiku andmetega Dim tArray as Variant' Helistamisfunktsioon ReadDataFromWorkbook andmete saamiseks määratud vahemikust massiiviks 'Muutke teed vastavalt oma nõudele, "Sample_data" nimetatakse määratud vahemikuks tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ exceli näpunäide vana kood \ Shared Macro \ 23 \ 23SampleData.xls", "Sample_Data") "Helistamisfunktsioon FillListBox üksuste lisamiseks loendiboksi" Määra loendiboksi objekt ja maatriks parameetrina FillListBox Me .ListBox1, tArray 'Massiivi muutujate vabastamine ja nende elementide jaoks kasutatava mälu jaotamine. Erase tArray End Sub Private Private FillListBox (lb As MSForms.ListBox, RecordSetArray As Variant) 'Täitmise loendikast lb andmetega RecordSetArray Dim r nii pikk, c nii kaua koos lb .Clear' Väärtuse määramine loendikasti jaoks r = LBound (RecordSetArray , 2) UBoundile (RecordSetArray, 2) .AddItem For c = LBound (RecordSetArray, 1) UBoundile (RecordSetArray, 1). Loend (r, c) = RecordSetArray (c, r) Järgmine c Järgmine r 'Üksuse valimine vaikimisi loendikastis. ) Dim dbConnection ADODB.Connection, rs ADODB.Recordset Dim dbConnectionString kui string 'Ühendustringi deklareerimine ja draiver vajavad ühenduse loomiseks dbConnectionString = "DRIVER = {Microsoft Exceli draiver (*.xls)}; ReadOnly = 1; DBQ = "& SourceFile" Uue ADODB -ühenduse loomine Määrake dbConnection = Uus ADODB.Connection On Error GoTo InvalidInput 'Ava andmebaasiühendus dbConnection.Open dbConnectionString' Kirjete kogumi hankimine määratletud nimega vahemikust Set rs = dbConnection.Execute ("[" & SourceRange & "]") On Error GoTo 0 'Tagastab kahe dimensioonimassiiv kõigi kirjetega rs ReadDataFromWorkbook = rs.GetRows 'Sulgege kirje ja andmebaasi ühendus rs.Close dbConnection.Close Set rs = Nothing Set dbConnection = Nothing Exit Function' Code for error processing InvalidInput: MsgBox "Allikafail või allikavahemik on kehtetu! ", _ vbExclamation," Andmete hankimine suletud töövihikust "Lõppfunktsioon" Lisa allolev kood kasutajavormis1 Valik Selgesõnaline privaatne alamkäsk Button1_Click () Dim name1 stringina Dim i As Integer 'Määra valitud väärtus muutuja nimele 1 I = 0 jaoks ListBox1.ListCount - 1 Kui ListBox1.Selected (i) Siis name1 = ListBox1.Value Exit For End If Next 'Unload the userform Unload Me' Kuva valitud nimi MsgBox "Olete valinud" & name1 & "." End Sub Private Private UserForm_Initialize () Dim ListItems Variant, i As Integer Dim SourceWB As Workbook 'Ekraanivärskenduste väljalülitamine Application.ScreenUpdating = False With Me.ListBox1' Eemalda olemasolevad kirjed loendiboksist. Tühjenda SourceWB = Töövihikud.Open ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", _ False, True) 'Hankige soovitud väärtuste vahemik ListItems = SourceWB.Worksheets (1 ) .Range ("A2: A10"). Väärtus 'Sulgege allika töövihik muudatusi salvestamata SourceWB.Close False Set SourceWB = Nothing Application.ScreenUpdating = True' Teisenda väärtused vertikaalseks massiiviks ListItems = Application.WorksheetFunction.Transpose (ListItems) I = 1 jaoks UBound (ListItems) 'Täida loendiboks .AddItem ListItems (i) Järgmine i' Vaikimisi üksuste valimata seadistage esimese üksuse valimiseks 0 .ListIndex = -1 Lõpeta lõpuga
Kui teile see blogi meeldis, jagage seda oma sõpradega Facebookis. Lisaks saate meid jälgida Twitteris ja Facebookis.
Tahaksime sinust kuulda, andke meile teada, kuidas saaksime oma tööd paremaks muuta ja teie jaoks paremaks muuta. Kirjuta meile meilisaidile