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

VBA - κάνοντας τον κώδικα μικρότερο


militarist

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

Δημοσ. (επεξεργασμένο)

Μπορεί να είναι χαζό αθτό που θα ρωτήσω...

 

¨Με το παρακάτω VBA   λέω ότι ψάξε το έγραφο που περιέχει SAI TRACKER πχ στο όνομα και βάλτο το document (Vetting General) στο πεδίο (richTextInput_4).

 

Αλλά το κάνω αυτό πολλές φορές (15 διαφορετικά ονόματα).

 

Η ερώτηση μου είναι πώς εσςις θα το κάνατε ώστε ο κώδικας να είναι μικρότερος?

 

 

 Public file As String

Public filePath As String
Public strfile As String
 
 
Sub procedure()
 
filePath = "C:\Users\Desktop\attachments\"
strfile = Dir(filePath)
 
 
 
Do While strfile <> ""
  Debug.Print strfile
  
  If InStr(UCase(strfile), "SAI TRACKER") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_4", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "ADDITIONAL DOCUMENTATION") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_5", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "PPS APPLICATION") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_6", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "C2S2 CHECK") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_7", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "DPL CHECK") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_8", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "COMP-I CHECK") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_9", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "TRACE CHECK") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_10", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "RDC CHECK") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_11", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "T&R CHECK") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_12", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "EXTERNAL COMMUNICATION") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_13", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "INTERNAL COMMUNICATION") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_14", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "VETTING CheHECK") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_15", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "SAI UPDATE") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_16", filePath & strfile)
    
    ElseIf InStr(UCase(strfile), "APPROVAL - BRAND/CHANNEL") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_17", filePath & strfile)
    
    ElseIf InStr(UCase(strfile1), "Agreement") > 0 Then
    Call AttachFile("Vetting General", "richTextInput_19", filePath & strfile)
    
    
   End If
  strfile = Dir
  Loop
Επεξ/σία από militarist
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν γνωρίζω από VBA συγκεκριμένα αλλά ψάξε να δεις πως γίνεται στην γλώσσα σου ένα switch statement για να γλιτώσεις τα πολλά if/elseif

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ουσιαστικά δεν έχει διαφορά το switch με τα else, και δεν πρόκειται να βοηθήσει εδώ.

 

Αυτό που πρέπει να κάνεις είναι κάποιου είδους dictionary/map (δεν έχω ιδέα από VBA) που αντιστοιχίζει string σε string. Θα αντιστοιχίσεις 

"SAI TRACKER" => "richTextInput_4"
"ADDITIONAL DOCUMENTATION" => "richTextInput_5"

κλπ, τα οποία είναι τα μόνα τμήματα που αλλάζουν στον κώδικά σου. Στη συνέχεια με ένα απλό foreach των 2-3 γραμμών ή ό,τι ανάλογο έχει η VBA πάνω στο dictionary θα μπορέσεις να αντικαταστήσεις όλο αυτό που πόσταρες.

 

Γενικά η ιδέα σ' αυτές τις περιπτώσεις είναι πάντα η ίδια: βλέπεις ποιά είναι τα μέρη του κώδικα που μεταβάλλονται, τα βάζεις σε κάποιο κατάλληλο structure, και το υπόλοιπο που μένει σταθερό μπαίνει σε loop πάνω στο structure.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φτιάχνεις μια κλάση  που θα έχει δύο μεταβλητές  , 2 μεθόδους που θα σετάρουν αυτές τις μεταβλητές και 2 μεθόδους που θα επιστρέφουν τις μεταβλητές .

 

πχ 

 

Dim myclass as new DataClass

myclass.setValueA("SAI TRACKER")

myclass.setValueB("richTextInput_4")

 

κάνεις το ίδιο για όλες τις τιμές ..

 

Μετά Δημιουργείς ένα collection και βάζεις όλα τα αντικείμενα και μετα μια for each και καλώντας τις μεθόδους που επιστρέφουν αυτές τις τιμές κάνεις την δουλειά σου .

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...