Instruction if dans une boucle For
Bonjour à tous, encore un bug que je n'arrive pas à comprendre, j'ai la nécessité d'imbriquer une condition if then else dans une boucle for afin de contrôler l'état de plusieurs cellules sur plusieurs lignes.
je pense ne pas m'être trompé sur la partie algo (y a peut être une solution plus élégante surement d'ailleurs) mais l’interpréteur vba me remonte une erreur.
Workbooks(wb_OQT).Worksheets("Formats").Activate
For i = 1 To Nb_Format
If Range(Cells(20 + i, 8)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B14").Value
Else
If Range(Cells(20 + i, 9)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B16").Value
Else
If Range(Cells(20 + i, 10)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B15").Value
End If
NextJe fais donc une recherche sur 3 colonnes avec mon if then else, puis dans la boucle for, j'analyse les différentes lignes de mon fichier source.
ensuite quand je lance mon code, il me dit qu'il ne peut y avoir de Next sans For. Je comprends du coup que c'est clairement une erreur de syntaxe, mais je vois pas laquelle.
Merci d'avance
Bonjour,
Comme ceci
Workbooks(wb_OQT).Worksheets("Formats").Activate
For i = 1 To Nb_Format
If Range(Cells(20 + i, 8)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B14").Value
ElseIf Range(Cells(20 + i, 9)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B16").Value
ElseIf Range(Cells(20 + i, 10)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B15").Value
End If
Nextou
Workbooks(wb_OQT).Worksheets("Formats").Activate
For i = 1 To Nb_Format
If Range(Cells(20 + i, 8)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B14").Value
Else
If Range(Cells(20 + i, 9)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B16").Value
Else
If Range(Cells(20 + i, 10)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B15").Value
End If
End If
End If
NextOK, donc il ne faut pas mettre un if après un else mais directement un elseif.. c'est ça ?
Re,
Oui, c'est comme cela, ou alors mettre autant de END If que de If
Ok, je comprends la logique.
du coup j'ai fait la correction,, la boucle ne me gènère plus d'erreur, par contre, j'ai un soucis sur le range, il me note une erreur de type 1004, La méthode range de l'objet _global a échoué. Je me dis que ce doit être la liaison a
Workbooks(wb_OQT).Worksheets("Formats")qui ne doit pas marcher, je remplace le range par un
' Workbooks(wb_OQT).Worksheets("Formats").Activate
For i = 1 To Nb_Format
If Workbooks(wb_OQT).Worksheets("Formats").Range(Cells(20 + i, 8)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B14").Value
ElseIf Workbooks(wb_OQT).Worksheets("Formats").Range(Cells(20 + i, 9)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B16").Value
ElseIf Workbooks(wb_OQT).Worksheets("Formats").Range(Cells(20 + i, 10)).Value = "X" Then
Workbooks(wb_Persos).Worksheets("AAA").Range(Cells(15, 3 + i)).Value = Workbooks(wb_Persos).Worksheets("BBB").Cells("B15").Value
End If
Nextet là erreur de type 1004 encore, erreur définie par l'application ou par l'objet.
bref, je manque cruellement de pratique sur la synthaxe en VB..
Bonjour l'homme qui valait 3 milliards
Une erreur 1004 vient en général du fait que l'objet n'existe pas
Où sont définis vos variables : wb_OQT, wb_Persos ?
Est-ce que les feuilles "Formats", "AAA", "BBB" existent bien dans le classeur indiqué ?
Avez-vous vérifié si vous n'aviez pas d'espace après le nom de l'onglet ?
Bref un fichier joint est toujours conseillé
A+
Bonjour BrunoM45,
Je viens de finir l'anonymisation de mon fichier, (wb_persos) par contre, je ne peux pas mettre à disposition le wb_OQT, beaucoup trop sensible comme données niveau entreprise.
Par contre j'ai bien vérifier, les feuilles ont bien les bons noms sans espaces à la fin.
Re,
Souvent un fichier même vide peut suffire, mais bon
Si votre classeur Wb_OQT contient bien la feuille "Formats" sans espace au début ou à la fin, je ne vois pas
Petite remarque en passant, il serait mieux de passer par des variables objet que des variables de type string
Voici le code optimisé comme je le vois
Sub Fill_Format_From_OQT_Cliquer()
'Déclaration des variables
Dim Wb As Workbook, Wb_OQT As Workbook, Wb_Persos As Workbook
Dim b As Integer, i As Integer
Dim Column As Long
Dim Nb_Format As Integer
'initialisation des variables
b = 0: Column = 0: Nb_Format = 0
'Etablissement de la liaison
MsgBox ("Attention, il ne faut ouvrir qu'un seul OQT/OST")
For Each Wb In Workbooks
If InStr(1, Wb.Name, "OQT") > 0 Or InStr(1, Wb.Name, "OST") > 0 Then
b = b + 1
Set Wb_OQT = Wb
End If
Next
'
If b > 1 Then
MsgBox "il ne peut y avoir qu'un seul OQT*/OST d'ouvert, fermer le fichier non nécessaire", vbOKCancel, "ERREUR DE FICHIERS"
GoTo Sortie
End If
MsgBox Wb_OQT.Name, vbInformation, "Fichier OQT/OST utilisé : "
'On récupère le nom du fichier de vérification Persos
Set Wb_Persos = ThisWorkbook
'On affiche la feuille de données "transitoire" pour y récupérer les données voulues
Wb_OQT.Sheets("EXE tools data").Visible = True
'**************************DEBUGAGE - RECUP DU NOMBRE DE FORMATS DANS L'OQT*********************************
Nb_Format = Wb_OQT.Sheets("EXE tools data").Range("B2").Value
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Range("E7").Value = Nb_Format
'*****************************************COPIE DES DONNEES*************************************************
'type de contenant
' Workbooks(wb_OQT).Worksheets("Formats").Activate
For i = 1 To Nb_Format
If Wb_OQT.Sheets("Formats").Range(Cells(20 + i, 8)).Value = "X" Then
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Range(Cells(15, 3 + i)).Value = Wb_Persos.Sheets("DATA-GLOBAL").Cells("B14").Value
ElseIf Wb_OQT.Sheets("Formats").Range(Cells(20 + i, 9)).Value = "X" Then
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Range(Cells(15, 3 + i)).Value = Wb_Persos.Sheets("DATA-GLOBAL").Cells("B16").Value
ElseIf Wb_OQT.Sheets("Formats").Range(Cells(20 + i, 10)).Value = "X" Then
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Range(Cells(15, 3 + i)).Value = Wb_Persos.Sheets("DATA-GLOBAL").Cells("B15").Value
End If
Next
Sortie:
' Libérer les variables objet
Set Wb = Nothing: Set Wb_OQT = Nothing: Set Wb_Persos = Nothing
End SubA+
Je viens de reprendre mon code avec la notion d'objet pour les workbook, en effet le code est mieux ainsi, j'ai aussi corrigé (tout du moins essayé) certaines erreurs pour le gérer.
Maintenant, je butte sur la copie des données dans la partie 'type de contenant, ma question est, faut il activer à chaque fois la page sur laquelle on souhaite récupérer les informations ou cela n'est pas nécessaire ?
Sub Fill_Format_From_OQT_Cliquer()
'Déclaration des variables
Dim Wb As Workbook, Wb_OQT As Workbook, Wb_Persos As Workbook
Dim b As Integer, i As Integer
Dim Column As Long
Dim Nb_Format As Integer
'initialisation des variables
b = 0: Column = 0: Nb_Format = 0
Set Wb_Persos = ThisWorkbook
'-------------------------------------Etablissement de la liaison et contrôle présence 1 OQT
MsgBox ("Attention, il ne faut ouvrir qu'un seul OQT/OST")
For Each Wb In Workbooks
If InStr(1, Wb.Name, "OQT") > 0 Or InStr(1, Wb.Name, "OST") > 0 Then
b = b + 1
Set Wb_OQT = Wb
End If
Next
If b > 1 Then
MsgBox "il ne peut y avoir qu'un seul OQT*/OST d'ouvert, fermer le fichier non nécessaire", vbOKCancel, "ERREUR DE FICHIERS"
GoTo Sortie
Else
MsgBox Wb_OQT.Name, vbInformation, "Fichier OQT/OST utilisé : "
End If
Fill_data:
'---------------------------On affiche la feuille de données "transitoire" pour y récupérer les données voulues
'Wb_OQT.Sheets("EXE tools data").Visible = True
'**************************DEBUGAGE - RECUP DU NOMBRE DE FORMATS DANS L'OQT*********************************
Nb_Format = Wb_OQT.Sheets("EXE tools data").Range("B2").Value
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Range("E7").Value = Nb_Format
'*****************************************COPIE DES DONNEES*************************************************
'Reference plan bouteille (colonne dans OQT inconnue)
'Workbooks(wb_OQT).Worksheets("Formats").Activate
' Range(Cells(4, 12), Cells(4 + Nb_Format, 15)).Select
' Selection.Copy
'Windows(wb_Persos).Worksheets("FEUILLE DE DONNES BTLS&PACK").Activate
' Range("D18").Select
' Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
'type de contenant
' Workbooks(wb_OQT).Worksheets("Formats").Activate
For i = 1 To Nb_Format
Wb_OQT.Worksheets("Formats").Activate
If Wb_OQT.Sheets("Formats").Range(Cells(20 + i, 8)).Value = "X" Then
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Activate
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Range(Cells(15, 3 + i)).Value = Wb_Persos.Sheets("DATA-GLOBAL").Cells("B14").Value
Else
Wb_OQT.Worksheets("Formats").Activate
If Wb_OQT.Sheets("Formats").Range(Cells(20 + i, 9)).Value = "X" Then
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Activate
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Range(Cells(15, 3 + i)).Value = Wb_Persos.Sheets("DATA-GLOBAL").Cells("B16").Value
Else
Wb_OQT.Worksheets("Formats").Activate
If Wb_OQT.Sheets("Formats").Range(Cells(20 + i, 10)).Value = "X" Then
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Activate
Wb_Persos.Sheets("FEUILLE DE DONNES BTLS&PACK").Range(Cells(15, 3 + i)).Value = Wb_Persos.Sheets("DATA-GLOBAL").Cells("B15").Value
End If
End If
End If
Next
Sortie:
' Libérer les variables objet
Set Wb = Nothing: Set Wb_OQT = Nothing: Set Wb_Persos = Nothing
End SubJe peux plus éditer, mais je nuance mes corrections, j'ai surtout voulu corriger mes erreurs de copie de code.
Bonjour,
Maintenant, je butte sur la copie des données dans la partie 'type de contenant, ma question est, faut il activer à chaque fois la page sur laquelle on souhaite récupérer les informations ou cela n'est pas nécessaire ?
Lorsqu'on travaille comme on doit le faire avec les objets, ce n'est absolument pas nécessaire
A+
D'accord, merci pour l'info, ça simplifie grandement l'écriture les objets quand même.. c'est cool.
Je continue, merci