Forum

Forum (https://www.ms-office.gr/forum/)
-   Excel - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/)
-   -   [VBA] Πολλαπλό άνοιγμα αρχείων και εισαγωγή δεδομένων (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/1725-pollaplo-anoigma-arxeion-kai-eisagogi-dedomenon.html)

Flashgordon61 14-03-12 20:26

Πολλαπλό άνοιγμα αρχείων και εισαγωγή δεδομένων
 
1 Συνημμένο(α)
Το επισυναπτόμενο αρχείο περιέχει τον παρακάτω κώδικα
Κώδικας:

Sub InsertMultiData()
Dim FileArray As Variant
Dim i As Integer
Application.ScreenUpdating = False
FileArray = Application.GetOpenFilename(MultiSelect:=True)
If Not IsArray(FileArray) Then
    MsgBox "Δεν ειλέξατε αρχείο." _
        & vbLf & "Ξαναπροσπαθείστε!!!!!!!", vbInformation
    Exit Sub
End If
If IsArray(FileArray) Then
For i = LBound(FileArray) To UBound(FileArray)
Workbooks.Open FileArray(i)
Range("A8:Q8").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
ThisWorkbook.Activate
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.ScreenUpdating = False
    Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
Next i
Else:
MsgBox "Επιτυχής εισαγωγή δεδομένων"
End If
End Sub

Με τον παραπάνω κώδικα ανοίγουν κάποια αρχεία προέλευσης δεδομένων , επιλέγεται μια περιοχή, αντιγράφεται και επικολλάται στο αρχείο προορισμού.
Τα ζητούμενα 2
1ον)Πως πρέπει να δομηθεί ο κώδικας ούτως ώστε το αρχείο προέλευσης των δεδομένων που ανοίγει (Workbooks.Open FileArray(i)), μετά την διαδικασία αντιγραφής και επικόλλησης να σώζεται και να κλείνει.
2ον)Επειδή η αρχή της περιοχής των δεδομένων που αντιγράφονται από τα αρχεία προέλευσης δεν είναι πάντα η περιοχή A8:Q8 ζητείται τροποποίηση του κώδικα ούτως ώστε η αρχή αυτή να προσδιορίζεται ως η περιοχή μετά τις επικεφαλίδες (Δηλ. από το επόμενο κελί μετά το κελί που έχει τιμή (Πωλητής) της στήλης Α έως τη στήλη Q).


Περιμένοντας τη βοήθειά σας, σας ευχαριστώ εκ των προτέρων.

Γιώργος

gr8styl 15-03-12 13:42

Παράθεση:

Αρχική Δημοσίευση από Flashgordon61 (Μήνυμα 10010)
Τα ζητούμενα 2
1ον)Πως πρέπει να δομηθεί ο κώδικας ούτως ώστε το αρχείο προέλευσης των δεδομένων που ανοίγει (Workbooks.Open FileArray(i)), μετά την διαδικασία αντιγραφής και επικόλλησης να σώζεται και να κλείνει.
2ον)Επειδή η αρχή της περιοχής των δεδομένων που αντιγράφονται από τα αρχεία προέλευσης δεν είναι πάντα η περιοχή A8:Q8 ζητείται τροποποίηση του κώδικα ούτως ώστε η αρχή αυτή να προσδιορίζεται ως η περιοχή μετά τις επικεφαλίδες (Δηλ. από το επόμενο κελί μετά το κελί που έχει τιμή (Πωλητής) της στήλης Α έως τη στήλη Q).

Γιώργο για το πρώτο ερώτημα χωρίς να ασχοληθούμε με την βελτιστοποίηση του κώδικα:

α) Πρόσθεσε στην Sub InsertMultiData() την δήλωση
Dim wbk As Workbook

β) Αντικατάστησε την Workbooks.Open FileArray(i) με την
Set wbk = Application.Workbooks.Open(FileArray(i))

γ) Πριν την Next i πρόσθεσε τις παρακάτω δύο γραμμές
Application.CutCopyMode = False
wbk.Close

Πες μας αν έγινε.

Για το δεύτερο ερώτημα, τα πράγματα είναι πιο σύνθετα το αφήνω λοιπόν στους ειδικούς :wink:
Θανάσης

Flashgordon61 15-03-12 17:52

Θανάση σ' εχαριστώ.:thanks:
Επειδή εκτελώντας τον κώδικα μου προτείνεται αν θέλω να σώσω η όχι τα αρχεία προέλευσης προσθέτοντας ανάμεσα στο Application.CutCopyMode = False & το wbk.Close το wbk.Save η το Application.DisplayAlerts = False ο κώδικας μετά δουλεύει απόλυτα.

Και πάλι σ' ευχαριστώ

Γιώργος

kapetang 15-03-12 18:30

Καλησπέρα

Γιώργο, αντικατέστησε τις γραμμές κώδικα :

1. Τη γραμμή: Dim i As Integer με την: Dim i As Integer, J as Long

2. την: Range("A8:Q8").Select με τις γραμμές:

j = WorksheetFunction.Match("Πωλητής", Range("A:A")) + 1

Range(Cells(j, 1), Cells(j, 17)).Select.

Φιλικά/Γιώργος

Tasos 15-03-12 18:41

1 Συνημμένο(α)
Καλησπέρα!

Θα πρέπει να αποφεύγουμε τα Copy-Paste (αν μας ενδιαφέρουν μόνο τα δεδομένα μιας περιοχής)
καθώς και τα Select και Activate μέσα στον κώδικα. Υπάρχουν άλλες μεθόδοι που είναι πιο αποδοτικές.

Το συνημμένο παράδειγμα εισάγει δεδομένα από το πρώτο φύλλο ενός ή περισσότερων βιβλίων εργασίας.

Παράλληλα αν θελήσει ο χρήστης, μπορεί κάνοντας κλικ σε Checkbox που υπάρχει στο φύλλο
Total Data να ενεργοποιήσει την καταγραφή της διαδρομής των αρχείων στο φύλλο Log
και να αποκλείσει έτσι την εισαγωγή τους για δεύτερη φορά.

Φιλικά

Τάσος

gr8styl 15-03-12 18:58

Παράθεση:

Αρχική Δημοσίευση από Tasos (Μήνυμα 10025)
...
Θα πρέπει να αποφεύγουμε τα Copy-Paste (αν μας ενδιαφέρουν μόνο τα δεδομένα μιας περιοχής)
καθώς και τα Select και Activate μέσα στον κώδικα. Υπάρχουν άλλες μεθόδοι που είναι
...

Το ήξερα ότι θα πυροβολήσεις πάλι για αυτό και εγώ εσκεμμένα δεν πρότεινα τίποτα από όλα αυτά και το άφησα στους ειδικούς :icon_hihi:
Η πρότασή μου είχε Dim, Set, Application και Close. ούτε Select ούτε τίποτα άλλο κακό !!!

Τα λέμε
Θ. :yahoo:

Flashgordon61 15-03-12 20:31

Σας ευχαριστώ όλους:thanks::thanks::thanks:
Ειδικά τον Διαχειριστή του Forum μας τον Τάσο που πέρα από την λύση του προβλήματος μας δίνει και τον σωστό τρόπο σκέψης για την σύνταξη του κώδικα, και όχι μόνο.
Πολύ διδακτικό !!!!!!!!!!!!
Και πάλι σας ευχαριστώ

Γιώργος

pant 13-06-12 13:17

καλησπερα σε όλους


Θα ήθελα την βοηθεια σας οσον αφορά το πρόγραμμα του αγαπητου Τάσο " xlImportWorksheets ". Γίνετε να μην ειναι απαραιτητα η επικεφαλιδα Πωλητής - Ημερομηνία - Πελάτης -Data 1- κ.λ.π. Δηλ σε ολα τα αλλα αρχεια δεν μπορεί να ειναι αλλη επικεφαλίδα με αλλα ονόματα ????


Ευχαριστώ Γρηγόρης

Tasos 16-06-12 12:22

Καλησπέρα σε όλους!

Αγαπητέ Γρηγόρη,
η λύση και η λογική του συγκεκριμένου αρχείου βασίζεται στο ζητούμενο του θέματος όπου περιέχεται.

Αν θέλεις δημιούργησε ένα νέο θέμα στο φόρουμ και περίγραψε μας το ζητούμενο σου.

Φιλικά

Τάσος


Η ώρα είναι 06:18.

Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2