| Visual Basic for Applications (VBA) Ερωτήσεις / Απαντήσεις σε σχέση με τη χρήση της VBA. |
![]() |
| | Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
|
#1
| ||||
| ||||
|
Καλημέρα... Ο παρακάτω κώδικας κάνει τη δουλειά που θέλω. Όμως ο έλεγχος και η γνώμη φίλων-μελών του Forum είναι -στη παρούσα περίπτωση- α ν α γ κ α ί α. Στόχος της ρουτίνας είναι να εισάγει στήλες με δεδομένα από φύλλο Excel σε πέντε (5) διαφορετικούς πίνακες. (παράδειγμα 1η, 5η, 6η, 7η στήλη στον πίνακα tblKatigites1...κ.ο.κ). Κάθε εναλλακτική λύση ευπρόσδεκτη. Κώδικας: private sub ALFA()
Dim thepath1$
thepath1="C:/arxeiakat/test.xls"
With OpenDatabase(thepath1, False, True, "Excel 8.0;HDR=Yes;")
Set rs = .OpenRecordset("QryOla$") ' QryExcel είναι το φύλλο Excel (πηγή data)
If rs.RecordCount Then
rs.MoveFirst
InsertKat1 thepath1, rs
rs.MoveFirst
InsertKat2 thepath1, rs
κλπ
End If
End With
end sub
Κώδικας: Private Sub InsertKat1(thePath As String, rs As Object)
Dim rcd As Object
Set rcd = CurrentDb.OpenRecordset("tblKatigites1", 2)
Do While Not rs.EOF
With rcd
If IsNull(rs.Fields(2)) Then Exit Do
.AddNew
!ΑΜ = rs.Fields(6)
!Γεννηση = rs.Fields(11)
και άλλα πεδία
!Διδακτορικο = rs.Fields(24)
.Update
End With
rs.MoveNext
Loop
rcd.Close
Set rcd = Nothing
End Sub
Υστερολόγιο : Να τονίζω οτι οι στήλες Excel δεν είναι συνεχόμενες. Η ρουτίνα που σας παρουσιάζω μεταφέρει υλικό μόνο σε ένα πίνακα... Τελευταία επεξεργασία από το χρήστη Meteora : 15-10-10 στις 17:30. Αιτία: Αναμόρφωση κώδικα... |
|
#2
| ||||
| ||||
|
Καλησπέρα σε όλη τη παρέα! Φίλε Νίκο, δοκίμασε αν θέλεις και την παρακάτω διαδικασία: Κώδικας: Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub Test()
Dim strSQL As String
Dim lngStart As Long
Dim lngRecs As Long
On Error GoTo ErrHandler
DoCmd.SetWarnings False
strSQL = "Insert Into Table1 (DataField2, DataField4) " _
& "Select Column1, Column4 From " _
& "[Excel 8.0;HDR=Yes;Database=C:\Test.xls].[DataSheet$];"
lngStart = GetTickCount
CurrentProject.Connection.Execute strSQL, lngRecs
MsgBox lngRecs & " records added in Table1 in " _
& (GetTickCount - lngStart) & " milliseconds!", vbInformation
ExitProc:
DoCmd.SetWarnings True
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation
Resume ExitProc
End Sub
Στη θέση του ονόματος του φύλλου DataSheet$ μπορεί να μπεί το όνομα μιας περιοχής κελιών του βιβλίου εργασίας χωρίς όμως το τελικό $. Αυτό απαιτείται μόνο σε αναφορές ονομάτων φύλλων εργασίας. Αν λοιπόν την προικίσεις με τα κατάλληλα ορίσματα, μπορεί εύκολα να μετατραπεί σε μια διαδικασία γενικής χρήσης. Φαντάζομαι πως αυτή η μέθοδος θα είναι αρκετά πιο γρήγορη από τη χρήση βρόχων ειδικά με μεγάλους όγκους δεδομένων. Η ύπαρξη της GetTickCount στο παραπάνω παράδειγμα είναι για τη χρονική ενημέρωσή μας και μόνο. Στο σύστημα τουλάχιστον που βρίσκομαι, χρειάστηκε περίπου 0,6 δευτερόλεπτο για την προσάρτηση 50000 εγγραφών. Δοκίμασέ τη και τα ξαναλέμε. Ελπίζω να σ' αρέσει! ![]() Φιλικά, Γιάννης. Υ.Γ. Είδες όμως με τι μαστοροχωρίτικο τρόπο απέφυγα το "...να σου αρέσει";
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ![]() ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
|
#3
| ||||
| ||||
|
Γιάννη μου σε ευχαριστώ θερμά ! Δεν μπορώ να πιστέψω οτι ο κώδικας που βλέπω μπορεί να κάνει την μεταφορά excel προς Access... α π ί σ τ ε υ τ ο. Γιάννη με τη πρώτη γραμμή τι γίνεται ; ...πάω για δοκιμή. Θα επανέλθω... Έχεις τη φιλία μου / Νίκος |
|
#4
|
|
Καλησπέρα Νίκο και Γιάννη! Νίκο, όσον αφορά την πρώτη γραμμή που ανέφερες, βρες στον κώδικα: το HDR=Yes και αντικατέστησε το με το HDR=Νο Τα λέμε Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών σε VB.Net, Access, Excel, Outlook, Word Τελευταία επεξεργασία από το χρήστη Tasos : 08-10-10 στις 19:10. |
|
#5
| ||||
| ||||
|
Τάσο καλησπέρα... Ο Γιάννης όπως πάντα SuperNova ! Θα επανέλθει σε ...εύλογο χρονικό διάστημα. Ο κώδικας "κλωτσάει" ζητά ορισμό μιας επιπλέον παραμέτρου... Ψάχνω... Κώδικας: strSQL = "Insert Into tblipodoxi (Eidos, AFM) " _
& "Select Column2, Column4 From " _
& "[Excel 8.0;HDR=Yes;Database=C:\Users\Νίκος\Desktop\EFORIA.xls].[QryExcel$];"
Τάσο ευχαριστώ. Τελευταία επεξεργασία από το χρήστη Meteora : 08-10-10 στις 19:39. |
|
#6
|
|
Καλησπέρα! Μου έρχονται στο μυαλό 2 περιπτώσεις: Με χρήση του HDR=yes: Δεν υπάρχουν τα ονόματα των στηλών του Excel στο strSQL. Με χρήση του HDR=Νο: Θα πρέπει αντί για τα ονόματα των στηλών του Excel να δώσεις: F1, F2; F4 κτλ. (το γράμμα F και τον αριθμό της στήλης). Επίσης, οι μορφοποιήσεις στου πίνακες Access και Excel πρέπει να ταιριάζουν. Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών σε VB.Net, Access, Excel, Outlook, Word |
|
#7
| ||||
| ||||
|
Τάσο μου, το θέμα έκλεισε ! ( 15 msec για μεταφορα περίπου 1000 εγγραφών). Ευχαριστώ φίλε μου. Νίκος Δ. Υστερολόγιο : Γιάννη μου ο χρόνος ...μεγάλος με φαίνεται !!!
|
|
#8
| |
| Παράθεση:
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών σε VB.Net, Access, Excel, Outlook, Word |
|
#9
| ||||
| ||||
|
Τελικά φίλοι μου, στον κόσμο των υπολογιστών, ακόμη και για έναν SuperNova , τα 15 msec είναι πολλά! ![]() Μετά από μερικές δοκιμές (αντίθετα με ό,τι αρχικά φαντάστηκα), διαπίστωσα πως η παραπάνω μέθοδος είναι πιο αργή από τη χρήση βρόχων με αντικείμενα Recordset και πως η διαφορά τους σε απόδοση είναι ανάλογη του όγκου δεδομένων. Από τις τρεις μεθόδους που θα βρείτε στο συνημμένο αρχείο (TestTransferMethods.mdb), η πιο γρήγορη φαίνεται να είναι η TransferSpreadsheet του αντικειμένου DoCmd όμως μειονεκτεί σε σχέση με τις άλλες στην ελευθερία διαχείρισης των εμπλεκόμενων στηλών και πεδίων. Για να μπορέσετε να τρέξετε τη διαδικασία TestSpeed της λειτουργικής μονάδας Module1 του αρχείου TestTransferMethods.mdb, ακολουθήστε τα εξής βήματα:
Μην ξεχνάτε να καθαρίζετε τα δεδομένα από τον πίνακα Table1 της βάσης γιατί γεμίζει γρήγορα! ![]() Καλή σας μέρα! Γιάννης
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ![]() ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
|
#10
|
|
Καλησπέρα κι από μένα! Η γνώμη μου είναι ότι σε διαδικασίες γραφής/ανάγνωσης δεδομένων της Excel, κανένας οδηγός και καμία μέθοδος δεν μπορεί να είναι γρηγορότερη από την ίδια την Excel (Range Object), ειδικά αν πρόκειται για πολλές χιλιάδες εγγραφών. Μ αυτό το σκεπτικό, θα πρότεινα τον παρακάτω κώδικα που μπορεί να δουλέψει μέσα από το *.mdb αρχείο του Γιάννη μας (SuperNova ).Ο χρόνος εκτέλεσης του σε Windows Xp και με Office 2003 περιορίζεται στο 45 - 50% περίπου του χρόνου που χρειάζεται με την TransferSpreadsheet. Επίσης, μας επιτρέπει να ορίσουμε όποιο φύλλο και όποια περιοχή του φύλλου θελήσουμε να εισαχθεί σε πίνακα της Access: Κώδικας: Option Compare Database
Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long
Sub ImportFromExcel()
Dim MyArray, _
lngStart As Long, _
y As Long, _
strTestFile As String
lngStart = GetTickCount
strTestFile = CurrentProject.Path & "\Test.xls"
MyArray = GetXLArray(strTestFile, "DataSheet", "A2:D30000") ' or "myRange"
With CurrentDb.OpenRecordset("Table1", dbOpenDynaset)
For y = LBound(MyArray, 1) To UBound(MyArray, 1)
.AddNew
.Fields(1) = MyArray(y, 1)
.Fields(2) = MyArray(y, 2)
.Fields(3) = MyArray(y, 3)
.Fields(4) = MyArray(y, 4)
.Update
Next
.Close
End With
Debug.Print vbTab & " records added in " _
& GetTickCount - lngStart & " milliseconds!"
End Sub
Function GetXLArray(XLFile As String, SheetName As String, XLRange As String) As Variant
Dim xl As Object, wb As Object
Set xl = CreateObject("Excel.Application")
Set wb = xl.Workbooks.Open(XLFile, , -1)
With wb
GetXLArray = .Sheets(SheetName).Range(XLRange).Value
.Saved = True
End With
xl.Quit
'Set xl = Nothing
End Function
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών σε VB.Net, Access, Excel, Outlook, Word Τελευταία επεξεργασία από το χρήστη Tasos : 11-10-10 στις 12:07. |
![]() |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| Εργαλεία Θεμάτων | |
| Τρόποι εμφάνισης | |
| |
| ||||
| Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
| Oνομασία στήλης υπολογιστικού φύλλου σε τύπο | Tasos | Άλλες συναρτήσεις | 0 | 24-10-11 09:31 |
| [ Πίνακες ] Σύρσιμο μιας στήλης με το ποντίκι σε πίνακα | artchrist73 | Access - Ερωτήσεις / Απαντήσεις | 10 | 25-04-11 17:35 |
| [VBA] Έλεγχος ονόματος ενός φύλλου σε 850 αρχεία Excel! | Charis | Excel - Ερωτήσεις / Απαντήσεις | 2 | 18-08-10 18:53 |
| help πεδιο σε πινακα | sfedona85 | Access - Ερωτήσεις / Απαντήσεις | 5 | 24-02-09 07:44 |
| Μεταφορά δεδομένων απο πεδίο σε πεδίο | Meteora | Access - Ερωτήσεις / Απαντήσεις | 5 | 30-01-09 19:03 |
Η ώρα είναι 12:13.





!!!

, τα 15 msec είναι πολλά! 

Αλλαγή σε γραμμικό τρόπο

