Προς το περιεχόμενο

Excel - Δύσκολη μάκρο για χειρισμό αρχείων... κάποιος;;;


Gryzor

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα παιδιά!

 

Στη δουλειά μου ανέκυψε η ανάγκη για μία ΠΟΛΥ χρονοβόρα εργασία και θα ήθελα να δω αν μπορεί να αυτοματοποιηθεί...

 

Συγκεκριμένα, έχω ένα αρχείο Excel με κάποιες εκατοντάδες κωδικούς (προϊόντων). Εγώ καλούμαι να ψάξω σε ένα φάκελο στο δίκτυο που έχει φωτογραφίες και να τραβήξω τα αρχεία εκείνα που αναφέρονται στο εξελόφυλλό μου.

 

Περιτό να πω πως, εκτός από πολύ χρονοβόρο πράγμα, θα μου κάνει και το μυαλό ζελέ...

 

Υποψιάζομαι πως αν ξέρει κάποιος, είναι ενδεχομένως πολύ εύκολο. Αλλά δεν ξέρω :) Μπορεί κανείς να βοηθήσει;

 

Ευχαριστώ - θα χρωστάω τεράστια ευγνωμωσύνη...

 

Στη χειρότερη, υπάρχει κάποιο πρόγραμμα που να σου επιτρέψει να ψάξεις για πολλαπλά αρχεία; Βρίσκω μόνο search&replace για πολλαπλά...

 

Θ

 

ΥΓ σε κάποιες περιπτώσεις οι φωτό έχουν filename που δεν συμφωνεί 100% με του αρχείου - μπορεί να έχει κάποιους χαρακτήρες επιπλέον. Άρα θα χρειαστεί και κάποιο wildcard...

YG2 μού'ρχεται να κλάψω!

Δημοσ.

Τπ εννοεις "να τραβήξω τα αρχεία εκείνα που αναφέρονται στο εξελόφυλλό μου" ?

Να ενσωματοσεις τις αντιστοιχες φωτο στο excel διπλα στους κωδικούς ?

Να καταγραψεις το ονομα του αρχειου στο excel σε κελι διπλα στους κωδικούς ?

Να διορθωσεις τα ονοματα των αρχείων ?

Να μεταφερεις τα "αχρηστα" αρχεία σε αλλο folder ?

Δημοσ.
Έχεις δίκιο - εννοώ να τις ρίξω π.χ. στο φάκελο που είναι το εξελόφυλλό μου...

 

Αν θες να κάνεις αυτό που νομίζω, μπορείς να κάνεις ένα DIR > IMAGES.TXT

και μετά να το κάνεις Import στο Excel.

Από εκεί και πέρα με VLOOKUP μπορείς να παίξεις και να κάνεις αυτός που θες.

Δημοσ.

Συγγνώμη - ίσως δεν ήμουν σαφής αρκετά:

 

-Έχω ένα excel sheet στο οποίο, στο πρώτο column του οποίου υπάρχουν κωδικοί

-Έχω κι ένα φάκελο (στο σκληρό ή στο δίκτυο) με φωτογραφίες.

-Μέρος του filename των φωτογραφιών είναι οι κώδικες που υπάρχουν στο αρχείο μου

-Θέλω να μπορώ να αντιγράφω τα αρχεία των οποίων το filename αντιστοιχεί στους κωδικούς της λίστας μου, σε ένα άλλο φάκελο.

 

Δηλαδή, δεν με ενδιαφέρει να βρω τα ονόματα των αρχείων, αλλά τα αρχεία αυτά καθεαυτά... Ο λόγος είναι ότι μπορεί να θέλω να βρω, πχ, 200 κωδικούς, αλλά ο φάκελος με τις φωτό να έχει 500 φωτογραφίες...

 

Ευχαριστώ και πάλι και καλημέρα :)

Δημοσ.
Συγγνώμη - ίσως δεν ήμουν σαφής αρκετά:

 

-Έχω ένα excel sheet στο οποίο, στο πρώτο column του οποίου υπάρχουν κωδικοί

-Έχω κι ένα φάκελο (στο σκληρό ή στο δίκτυο) με φωτογραφίες.

-Μέρος του filename των φωτογραφιών είναι οι κώδικες που υπάρχουν στο αρχείο μου

-Θέλω να μπορώ να αντιγράφω τα αρχεία των οποίων το filename αντιστοιχεί στους κωδικούς της λίστας μου, σε ένα άλλο φάκελο.

 

Δηλαδή, δεν με ενδιαφέρει να βρω τα ονόματα των αρχείων, αλλά τα αρχεία αυτά καθεαυτά... Ο λόγος είναι ότι μπορεί να θέλω να βρω, πχ, 200 κωδικούς, αλλά ο φάκελος με τις φωτό να έχει 500 φωτογραφίες...

 

Ευχαριστώ και πάλι και καλημέρα :)

 

Ίσως να έχω καταλάβει λάθος, αλλά...

 

Έστω το EXCEL:

Code

0001

0002

0003

 

Έστω ο φάκελος:

IMG0000.jpg

IMG0001.jpg

IMG0002.jpg

IMG0003.jpg

IMG0004.jpg

 

Αν θες να βρεις και να αντιγράψεις τα bold τότε σου ξανα-προτείνω το παραπάνω.

 

Θα βρεις την αντιστοίχηση και πάνω στο ίδιο ή σε άλλο βιβλίο του excel θα φτιάξεις ένα batch file.

 

Copy Α1 c:\images

 

Το αποθηκεύεις σας TXT, rename σε .ΒΑΤ και το τρέχεις.

 

Αντίστοιχη περίπτωση είχα που ήθελα να κάνω import κάτι εικόνες σε SQL και είχα τους κωδικούς σε XLS.

 

Με ελάχιστο κόπο έφτιαξα το παρακάτω:

TEXTCOPY.exe /SSQLSERVER\DB /Usa /Padmin /DTESTDB /TTable887 /C Photo /FC:\Images\img150007.jpg /I /W"WHERE ID=150007"

Δημοσ.

Διάβολε, ίσως έχω χάσει κάτι!

 

Όντως θέλω να βρω τα bold και να τα αντιγράψω (έστω στο φάκελο του excel), αλλά ΑΑΑΑΑΑ τώρα κατάλαβα που είδα την επεξήγησή σου...!!! Ήλπιζα να γινόταν με ένα vbs μια που νομίζω ότι έχει έτοιμα file ops functions, αλλά κι αυτό δουλεύει... Wow, δεν το είχα σκεφτεί από αυτή την άποψη!

 

Σ'ευχαριστώ -- θα το δοκιμάσω!!!!!!

Δημοσ.

Αν οι κωδικοι ειναι

code1

code2

code3

code4

code44

 

και οι φωτο ειναι

 

code1.jpg

code2kaikati.bmp

code3333.tif

code4.trexagyreye

code44.bmp

code451.bmp

 

θα δουλεψει

 

επειδή το code4 και το code44 επικαλυπτονται το code44 θα προκαλεσει επαναντιγραφη αλλα αυτο δεν εχει σημασία

 

Αν οι κωδικο ειναι στη στηλη Α , τοτε στις διπλανες στηλες (αν ειναι κενες) θα συμπληρωθουν τα πραγματικα ονοματα των αρχείων που αντιγραφτηκαν για καθε κωδικο (προς περαιτερω χρηση)

 

Γραψε και τρεξε τη μακροεντολη

 

Public Sub getfiles()

Dim filename As String

Sheets("Sheet1").Select 'Αντί για Sheet1 βάλε το πραγματικό Sheet

Range("A1").Select 'Αντί για A1 βάλε το πραγματικό πρωτο cell

ChDrive "C" 'Αντί για C βάλε το γραμμα του δισκου που ειναι αποθηκευμένες οι φωτογραφιες

ChDir "c:\test\photos" 'Αντί για c:\test\photo βάλε το path που ειναι αποθηκευμένες οι φωτογραφιες

While ActiveCell.Value <> ""

cellval = ActiveCell.Value

Filename = Dir(cellval + "*.*")

n = 0

Do

n = n + 1

ActiveCell.Offset(0, 1).Select

If ActiveCell.Value = "" Then ActiveCell.Value = Filename

If Filename <> "" Then

FileCopy Filename, ActiveWorkbook.Path + "\" + Filename

Filename = Dir

End If

Loop Until Filename = ""

ActiveCell.Offset(1, -n).Select

Wend

End Sub

 

(εχε backup το αρχειο σου μην με ....βριζεις

Δημοσ.

@citizen: διαβάζοντας τον κώδικά σου ανακαλύπτω πόσο έχω σκουριάσει... κάποιο καιρό πριν πιθανότατα να καταφερνα κάτι και μόνος μου, αλλά άααααααααχ μας έφαγε η δουλειά... :(

 

Σε χιλιοευχαριστώ (και σένα), θα το δοκιμάσω - εννοείται!!!

 

---------- Προσθήκη στις 15:31 ---------- Προηγούμενο μήνυμα στις 13:37 ----------

 

@Citizen: ναιιιιιιιιιιι δούλεψε! Και, πάνω στην ώρα, γιατί κάτι που έγραψα σε C δεν παίζει με τίποτα... :D Αλλά, μία ερωτησούλα: του θέτεις

Filename = Dir(cellval + "*.*")

 

τί γίνεται αν οι φωτογραφίες μου έχουν filenames όπως categorynamecodenumberblahblah.jpg? Κοινώς, αν κάτι προηγείται του κώδικα;

 

Ευχαριστώ και πάλι :)

Δημοσ.
@citizen: διαβάζοντας τον κώδικά σου ανακαλύπτω πόσο έχω σκουριάσει... κάποιο καιρό πριν πιθανότατα να καταφερνα κάτι και μόνος μου, αλλά άααααααααχ μας έφαγε η δουλειά... :(

 

Σε χιλιοευχαριστώ (και σένα), θα το δοκιμάσω - εννοείται!!!

 

---------- Προσθήκη στις 15:31 ---------- Προηγούμενο μήνυμα στις 13:37 ----------

 

@Citizen: ναιιιιιιιιιιι δούλεψε! Και, πάνω στην ώρα, γιατί κάτι που έγραψα σε C δεν παίζει με τίποτα... :D Αλλά, μία ερωτησούλα: του θέτεις

Filename = Dir(cellval + "*.*")

 

τί γίνεται αν οι φωτογραφίες μου έχουν filenames όπως categorynamecodenumberblahblah.jpg? Κοινώς, αν κάτι προηγείται του κώδικα;

 

Ευχαριστώ και πάλι :)

 

Χαρα μου που βοηθησα...

αρκει να γραψουμε Filename = Dir("*"+cellval + "*.*")

 

βεβαια αν οι κωδικοι σου ειναι αριθμοι ή μοιαζουν θα εχεις αρκετες ταυτοποιησεις δηλ.

στο code 12345 θα αντιγραφει και το asta12345.jpg kai to brasta12345678.tif

 

Για αυτο (αν και δεν το ζητησες) εβαλα να συμπληρωνονται τα αρχεια στα διπλανα κελια ωστε να τσεκαρεις το αποτελεσμα.

Σημ. προφανως αν το διπλανο κελι δεν εχει εγγραφή παει να πει οτι δεν υπαρχει αντιστοιχο αρχείο.

 

 

ΥΓ Αν το διπλανα κελια εχουν εγγραφες , τοτε δεν ενημερωνονται (το εκανα για να μην καταστραφουν data. Αν δεν υπαρχουν data στα διπλανα κελια τοτε μπορεις να αφαιρεσεις τον ελεγχο και να γραφωντε παντα .

Η εντολη ελεγχου ειναι η γραμμη If ActiveCell.Value = "" Then ActiveCell.Value = Filename

Καντη απλα ΑctiveCell.Value = Filename

 

Φιλικα

Δημοσ.

Σήμερα ξημέρωσε μία από τις καταραμένες ημέρες....

 

Κατ'αρχάς, το Filename = Dir("*"+cellval + "*.*") το δοκίμασα χθες και δεν έπαιξε για κάποιο λόγο - φαίνεται προφανές, αλλά σταμάταγε (δεν θυμάμαι με τί λόγο).

 

Έβαλα μπρος να ξανατρέξω το χθεσινό και (εκεί πάει το "καταραμένη")... δεν! Δες το συνημμένο - μου πετάει Run-time error '13': type mismatch ... wtf?? O ίδιος κώδικας που έτρεξα και χθες - copy/paste το έκανα το άτιμο!!!

 

[edit] Παρατήρησα ότι κολλάει όταν φτάνει σε κελί το οποίο έχει ώς κωδικό σκέτο αριθμό, χωρίς γράμμα (υπάρχουν και τέτοιοι). Αλλά γιατί;....

post-15135-129063066956_thumb.jpg

Δημοσ.

Προφανως τα κελια δεν εχουν δηλωθει σαν text και αποδιδει αριθμο integer στη cellval. Προσθεσε στην αρχη του κωδιακα τη γραμμη

dim cellval as string και πες μου αν δουλευει (αυτα παθαινεις οτν βαριεσαι να δηλωσεις τις μεταβλητες)

 

To ξαναδοκιμασα σε μενα και δουλευει

Δημοσ.

Και... ναι... δουλεύει. Είμαι κατασυγκινημένος! Ένα πέρασμα κάνω και τρέχει, φαίνεται να δουλεύει, θα το τσεκάρω και πιο ενδελεχώς!!! Το μόνο πρόβλημα που έχω είναι ότι τερματίζει εαν βρει κενό κελί. Καταλαβαίνω ότι είναι λόγω του ελέγχου για το τέλος της λίστας, αλλά υπάρχει τρόπος να του ορίσω το πραγματικό range και απλά να αγνοεί τα κενά;

 

Φιλολογική ερώτηση, έτσι κι αλλιώς μπορώ να τσεκάρω για κενά αυτόματα ή (πιο απλό) να αλλάζω τα κενά με κάτι άλλο...

 

Σε προσκυνώ :)

Θ

Δημοσ.
Και... ναι... δουλεύει. Είμαι κατασυγκινημένος! Ένα πέρασμα κάνω και τρέχει, φαίνεται να δουλεύει, θα το τσεκάρω και πιο ενδελεχώς!!! Το μόνο πρόβλημα που έχω είναι ότι τερματίζει εαν βρει κενό κελί. Καταλαβαίνω ότι είναι λόγω του ελέγχου για το τέλος της λίστας, αλλά υπάρχει τρόπος να του ορίσω το πραγματικό range και απλά να αγνοεί τα κενά;

 

Φιλολογική ερώτηση, έτσι κι αλλιώς μπορώ να τσεκάρω για κενά αυτόματα ή (πιο απλό) να αλλάζω τα κενά με κάτι άλλο...

 

Σε προσκυνώ :)

Θ

 

Φυσικα ...

 

κοψε την While ActiveCell.Value <> "" και στη θεση της βαλε

for k=1 to 600 (τον αριθμο που ξερεις)

 

 

σβησε και την Wend και στη θεση της βαλε

next k

 

Επειδη ομως με κενο cellval η dir θα παρει τη μορφη dir **.*

βάλε αμεσως μετα την cellval = ActiveCell.Value

μια γραμμη ελεγχου

 

if cellval="" then cellval="keno_kelli_asxetos_kwdikos"

επειση τετοιο αρχειο φανταζομαι δεν θα υπαρχει θα το προσπερναει ....

Αρχειοθετημένο

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

  • Δημιουργία νέου...