Σε αυτό το άρθρο, θα ανακτήσουμε δεδομένα από κλειστό βιβλίο εργασίας στο πλαίσιο λίστας σε μορφή χρήστη χρησιμοποιώντας VBA.
Τα ακατέργαστα δεδομένα για αυτό το παράδειγμα βρίσκονται στην περιοχή A2: B10 στο βιβλίο εργασίας "23SampleData.xls", το οποίο τοποθετείται στη διαδρομή αρχείου "D: \ Excelforum \ ExcelForum office \ excel παλιός κώδικας \ Shared Macro \ 23 \".
Δημιουργήσαμε δύο κουμπιά εντολών στο κύριο φύλλο εργασίας για την εκτέλεση δύο διαφορετικών μορφών χρήστη. Κάθε κουμπί εντολών συνδέεται με διαφορετικές μορφές χρήστη.
Λογική εξήγηση
Σε αυτό το παράδειγμα, δύο διαφορετικοί τρόποι χρησιμοποιούνται για την ανάκτηση δεδομένων από το κλειστό βιβλίο εργασίας. Αυτά είναι:-
-
Ανοίξτε το κλειστό βιβλίο εργασίας και λάβετε τα δεδομένα
-
Χρησιμοποιώντας τη σύνδεση ADODB
Ανοίξτε το κλειστό βιβλίο εργασίας και λάβετε τα δεδομένα
Είναι δυνατό να ορίσετε την ιδιότητα RowSource ενός στοιχείου ελέγχου ListBox για λήψη δεδομένων από άλλο βιβλίο εργασίας, εκχωρώντας αξία στην ιδιότητα RowSource ως εξής:
‘[Filename.xls] Sheet1?! $ B $ 1: $ B $ 15
Το ListBox Control θα εμφανίζει τιμές μόνο εάν το άλλο βιβλίο εργασίας είναι ανοιχτό.
Έτσι, για να λάβουμε τα δεδομένα από το κλειστό βιβλίο εργασίας, θα δημιουργήσουμε μια μακροεντολή για να ανοίξουμε το άλλο βιβλίο εργασίας χωρίς να το προσέξει ο χρήστης και να λάβουμε δεδομένα από το βιβλίο εργασίας για να προσθέσουμε στοιχεία στο πλαίσιο λίστας και να κλείσουμε το βιβλίο εργασίας.
Κάνοντας κλικ στο κουμπί "Επιλογή" θα ενεργοποιηθεί η μορφή χρήστη "UserForm1". Το συμβάν εκκίνησης της μορφής χρήστη χρησιμοποιείται για την προσθήκη στοιχείων στο πλαίσιο λίστας. Αυτό το συμβάν ανοίγει πρώτα το κλειστό βιβλίο εργασίας και στη συνέχεια εκχωρεί την τιμή στο εύρος στην παραλλαγή "ListItems". Μετά την εκχώρηση της τιμής, το βιβλίο εργασίας κλείνει και τα στοιχεία προστίθενται στο πλαίσιο λίστας.
Το πλαίσιο λίστας χρησιμοποιείται για την επιλογή ονόματος από τις υπάρχουσες τιμές λίστας. Πατώντας το κουμπί "OK" θα εμφανιστεί το επιλεγμένο όνομα.
Χρησιμοποιώντας τη σύνδεση ADODB
Τα ActiveX Data Objects (ADO) είναι μια υψηλού επιπέδου, εύχρηστη διεπαφή για σύνδεση OLE DB. Είναι μια διεπαφή προγραμματισμού για πρόσβαση και χειρισμό δεδομένων σε μια βάση δεδομένων.
Για να δημιουργήσουμε σύνδεση ADODB, θα χρειαστεί να προσθέσουμε τη βιβλιοθήκη ADO στο έργο.
Για να προσθέσετε αναφορά, επιλέξτε από το μενού Εργαλεία> Αναφορά.
Κάνοντας κλικ στο κουμπί "Σύνδεση ADODB" στο φύλλο εργασίας, θα ενεργοποιηθεί η μορφή χρήστη "UFADODB". Στο συμβάν προετοιμασίας αυτής της μορφής χρήστη, χρησιμοποιήσαμε τη σύνδεση ADODB για την ανάκτηση δεδομένων από το κλειστό βιβλίο εργασίας. Δημιουργήσαμε μια προσαρμοσμένη συνάρτηση καθορισμένη από το χρήστη (UDF) "ReadDataFromWorkbook" για να δημιουργήσουμε τη σύνδεση και να πάρουμε τα δεδομένα από το κλειστό βιβλίο εργασίας στον πίνακα.
Χρησιμοποιήσαμε ένα άλλο UDF "FillListBox" για να προσθέσουμε στοιχεία στο πλαίσιο Λίστα κατά την προετοιμασία της φόρμας χρήστη. Το πλαίσιο λίστας θα εμφανίζει δεδομένα σε δύο στήλες, μία στήλη περιέχει το όνομα και η δεύτερη στήλη περιέχει την ηλικία.
Πατώντας το κουμπί "OK" μετά την επιλογή του στοιχείου στο πλαίσιο Λίστα, θα εμφανιστεί το ενημερωτικό μήνυμα σχετικά με το επιλεγμένο στοιχείο.
Ακολουθήστε παρακάτω για τον κωδικό
Option Explicit Sub running () UserForm1.Show End Sub Sub ADODBrunning () UFADODB.Show End Sub 'Προσθέστε τον παρακάτω κώδικα στο UFADODB userform Option Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim age1 As Integer Dim i As Integer' Εκχωρήστε τον επιλεγμένο τιμή στο πλαίσιο λίστας για μεταβλητή όνομα1 και ηλικία1 Για i = 0 προς ListBox1.ListCount - 1 Εάν ListBox1.Επιλέχθηκε (i) Στη συνέχεια name1 = ListBox1.Value age1 = ListBox1.List (ListBox1.ListIndex, 1) Exit For End If Next " Εκφόρτωση της μορφής χρήστη Unload Me 'Εμφάνιση εξόδου MsgBox "Έχετε επιλέξει" & name1 & ". Η ηλικία του είναι" & age1 & "yrs". End Sub Private Sub UserForm_Initialize () 'Filling ListBox1 με δεδομένα από ένα κλειστό βιβλίο εργασίας Dim tArray As Variant' Λειτουργία κλήσης ReadDataFromWorkbook για λήψη δεδομένων από καθορισμένο εύρος σε πίνακα 'Αλλαγή διαδρομής σύμφωνα με τις απαιτήσεις σας, "Sample_data" ονομάζεται καθορισμένο εύρος tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ excel παλιός κώδικας \ Shared Macro \ 23 \ 23SampleData.xls", "Sample_Data") 'Λειτουργία κλήσης FillListBox για προσθήκη στοιχείων στο πλαίσιο λίστας' Αντιστοίχιση αντικειμένου λίστας και αναπαραγωγή ως παράμετρος FillListBox Me .ListBox1, tArray 'Απελευθέρωση μεταβλητών πίνακα και καταμερισμός της μνήμης που χρησιμοποιείται για τα στοιχεία τους. Διαγραφή tArray End Sub Private Sub FillListBox (lb As MSForms.ListBox, RecordSetArray As Variant) 'Filling List box box lb with data from RecordSetArray Dim r As Long, c As Long With lb .Clear' Assigning value to listbox For r = LBound (RecordSetArray , 2) Προς UBound (RecordSetArray, 2) .AddItem Για c = LBound (RecordSetArray, 1) To UBound (RecordSetArray, 1). List (r, c) = RecordSetArray (c, r) Next c Next r 'Select no item στο πλαίσιο λίστας από προεπιλογή .ListIndex = -1 Τέλος με End Sub Private Function ReadDataFromWorkbook (SourceFile As String, _ SourceRange As String) Ως παραλλαγή «απαιτείται αναφορά στη βιβλιοθήκη αντικειμένων δεδομένων του Microsoft ActiveX» (μενού Εργαλεία> Αναφορές στο VBE ) Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String 'Δήλωση μιας συμβολοσειράς σύνδεσης και του προγράμματος οδήγησης που απαιτούνται για τη δημιουργία σύνδεσης dbConnectionString = "DRIVER = {Microsoft Excel Driver (*.xls)}; ReadOnly = 1; DBQ = "& SourceFile" Δημιουργία νέας σύνδεσης ADODB Σετ dbConnection = Νέο ADODB.Connection On Error GoTo InvalidInput 'Άνοιγμα της σύνδεσης βάσης δεδομένων dbConnection.Open dbConnectionString' Λήψη του setset εγγραφής από το καθορισμένο εύρος που έχει οριστεί rs = dbConnection.Execute ("[" & SourceRange & "]") On Error GoTo 0 'Επιστρέφει δύο διαστασιακός πίνακας με όλες τις εγγραφές στο rs ReadDataFromWorkbook = rs.GetRows 'Κλείστε τη σύνδεση εγγραφής και βάσης δεδομένων rs.Close dbConnection.Close Set rs = Nothing Set dbConnection = Τίποτα δεν εξέρχεται από τον κωδικό λειτουργίας για σφάλμα InvalidInput: MsgBox "Το αρχείο προέλευσης ή το εύρος πηγής είναι άκυρο! ", _ vbExclamation," Λήψη δεδομένων από κλειστό βιβλίο εργασίας "Λειτουργία λήξης" Προσθέστε τον παρακάτω κώδικα στο UserForm1 Option Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim i As Integer 'Εκχωρήστε την επιλεγμένη τιμή στο όνομα της μεταβλητής1 Για i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected (i) then name1 = ListBox1.Value Exit For End If Next 'Unload the userform Unload Me' Εμφάνιση του επιλεγμένου ονόματος MsgBox "You have selected" & name1 & "." End Sub Private Sub UserForm_Initialize () Dim ListItems As Variant, i As Integer Dim SourceWB As Workbook 'Απενεργοποίηση ενημερώσεων οθόνης Application.ScreenUpdating = False With Me.ListBox1' Αφαίρεση υπαρχουσών καταχωρήσεων από το listbox. Clear 'Άνοιγμα του βιβλίου εργασίας πηγής ως ReadOnly Set SourceWB = Workbooks.Open ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", _ False, True) 'Λάβετε το εύρος των τιμών που θέλετε ListItems = SourceWB.Worksheets (1 ) .Range ("A2: A10"). Τιμή "Κλείσιμο του βιβλίου εργασίας πηγής χωρίς αποθήκευση αλλαγών Για i = 1 To UBound (ListItems) 'Συμπλήρωση λίστας .Προσθήκη λίσταςItems (i) Επόμενο i' Επιλέγοντας κανένα στοιχείο από προεπιλογή, ορίστε στο 0 για να επιλέξετε το πρώτο στοιχείο .ListIndex = -1 Τέλος με τέλος υπο
Αν σας άρεσε αυτό το blog, μοιραστείτε το με τους φίλους σας στο Facebook. Επίσης, μπορείτε να μας ακολουθήσετε στο Twitter και το Facebook.
Θα θέλαμε πολύ να σας ακούσουμε, ενημερώστε μας πώς μπορούμε να βελτιώσουμε το έργο μας και να το κάνουμε καλύτερο για εσάς. Γράψτε μας στον ιστότοπο email