Boucle avec fichier Excel à ouvrir
Bonjour,
Je vous met un exemple ci-joint. En premier la méthode barbare ou je doit tout rentrer pour chaque fichier. En deuxième le code que j'ai essayer de faire avec une boucle for.
Dans mon programme j'ai 12 fichier à ouvrir et je dois aller récupérer une valeur dedans. Je voulais savoir si ce serait possible d'utiliser une boucle au lieu de réécrire le programme 12 fois. J'ai essayer avec une boucle For Counter = 0 To 12 Step 1. Cependant quand derrière le nom du fichier je met (Counter), il me dit que ça ne peut pas être une variable. J'ai mis que 3 fois le programme car il se répète comme ça jusqu'à 12.
Sub MAJ_OTD()
Application.ScreenUpdating = False
Dim wk_fichier1 As Workbook
Dim ws_fichier1feuil1 As Worksheet
Dim wk_fichier2 As Workbook
Dim ws_fichier2feuil1 As Worksheet
Set wk_fichier1 = ActiveWorkbook
Set ws_fichier1feuil1 = wk_fichier1.Worksheets(1)
Set wk_fichier2 = Application.Workbooks.Open(wk_fichier1.Path & "\OTD\OTD_01.xlsx")
Set ws_fichier2feuil1 = wk_fichier2.Worksheets(1)
With ws_fichier2feuil1
.Range("A1").End(xlDown).Select
ActiveCell.Offset(-1, 0).Select
ActiveCell.Offset(0, 4).Select
ActiveCell.Copy
End With
With ws_fichier1feuil1.Range("C3")
.PasteSpecial Paste:=xlPasteValues
.Value = CDbl(Split(.Value, "%")(0)) / 100
.NumberFormat = "0.00%"
End With
wk_fichier2.Close (True)
Dim wk_fichier3 As Workbook
Dim ws_fichier3feuil1 As Worksheet
Set wk_fichier1 = ActiveWorkbook
Set ws_fichier1feuil1 = wk_fichier1.Worksheets(1)
Set wk_fichier3 = Application.Workbooks.Open(wk_fichier1.Path & "\OTD\OTD_02.xlsx")
Set ws_fichier3feuil1 = wk_fichier3.Worksheets(1)
With ws_fichier3feuil1
.Range("A1").End(xlDown).Select
ActiveCell.Offset(-1, 0).Select
ActiveCell.Offset(0, 4).Select
ActiveCell.Copy
End With
With ws_fichier1feuil1.Range("D3")
.PasteSpecial Paste:=xlPasteValues
.Value = CDbl(Split(.Value, "%")(0)) / 100
.NumberFormat = "0.00%"
End With
wk_fichier3.Close (True)
End SubSub Maj_OT()
Dim wk_fichier1 As Workbook
Dim ws_fichier1feuil1 As Worksheet
Set wk_fichier1 = ActiveWorkbook
Set ws_fichier1feuil1 = wk_fichier1.Worksheets(1)
For Counter = 0 To 12 Step 1
Dim wk_fichier(Counter) As Workbook
Dim ws_feuill(Counter) As Worksheet
Set wk_fichier(Counter) = Application.Workbooks.Open(wk_fichier1.Path & "\OTD\OTD_0(Counter).xlsx")
Set ws_feuill(Counter) = wk_fichier(Counter).Worksheets(1)
With ws_feuil1(Counter)
.Range("A1").End(xlDown).Select
ActiveCell.Offset(-1, 0).Select
ActiveCell.Offset(0, 4).Select
ActiveCell.Copy
End With
With ws_fichier1feuil1.Range("D(Counter+2)")
.PasteSpecial Paste:=xlPasteValues
.Value = CDbl(Split(.Value, "%")(0)) / 100
.NumberFormat = "0.00%"
End With
wk.fichier(Counter).Close (True)
Counter = Counter + 1
Next
End SubBonjour
Cependant quand derrière le nom du fichier je met (Counter)
Logique "Counter" est une fonction excel. remplacez Counter par quelque chose d'autre. Par exemple "num"
1. Dans votre boucle, remplacez
For Counter = 0 To 12 Step 1par
For num = 0 To 12Rem :
- attention sur le 0 ne va pas passer, je pense. Vous devriez commencer à 1.
- veillez à déclarer votre variable "num" --> Dim num as byte
2. Plus bas, vous faites un copier coller valeurs. Vous pourriez supprimer les Select.Cela simplifierait le code
Merci pour votre réponse.
J'ai fait les modifications que vous m'avez dites. Mon problème maintenant est pour le chemin d'accès, il me dit que le fichier est introuvable car il ne remplace pas la valeur num par sa valeur mais il le prend tel qu'il est écrit. Je ne sais pas comment écrire cette ligne pour que ça le prenne en compte
Set wk_fichier = Application.Workbooks.Open(wk_fichier1.Path & "\OTD\OTD_0(num).xlsx")Quel est le nom de votre fichier à ouvrir ?
ceci --> "OTD_0" et le numéro ?
Exemple : OTD_01, OTD_02 ?
Mettez votre ligne comme ceci
Set wk_fichier(num) = Application.Workbooks.Open(wk_fichier1.Path & "\OTD\OTD_0" & num & ".xlsx")Faites un test.
Edit :
Après j'ai un peu regardé votre code, il me semble qu'il pourrait être simplifié comme ceci
J'ai supprimé les Select et le Copy Paste (à voir si cela sera ok)
Sub Maj_OT()
Dim wk_fichier1 As Workbook
Dim ws_fichier1feuil1 As Worksheet
Dim num As Byte
Set wk_fichier1 = ThisWorkbook
Set ws_fichier1feuil1 = wk_fichier1.Worksheets(1)
For num = 1 To 12 Step 1
Dim wk_fichier As Workbook
Dim ws_feuill As Worksheet
Set wk_fichier(num) = Application.Workbooks.Open(wk_fichier1.Path & "\OTD\OTD_0" & num & ".xlsx")
Dim ligne As Integer
With wk_fichier(num).Worksheets(1)
ligne = .Range("A" & .Rows.Count).End(xlUp).Row - 1 'on repère l'avant dernière ligne
End With
With ws_fichier1feuil1.Range("D" & num + 2)
.Value = wk_fichier(num).Worksheets(1).Range("D" & ligne).Value
.Value = CDbl(Split(.Value, "%")(0)) / 100
.NumberFormat = "0.00%"
End With
wk_fichier(num).Close (True)
Next num
End SubL'instruction Range("D" & num +2 ) est à vérifier car je pense que si num commence à 1 l'instruction doit devenir Range("D" & num + 1)
Si ok -->
Cordialement
Merci pour votre aide. J'ai fait un mélange des deux programmes et j'arrive à avoir ce que je veux