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
    Next

Je 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
    Next

ou

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
    Next

OK, 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
Next

et 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 Sub

A+

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 Sub

Je 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

Rechercher des sujets similaires à "instruction boucle"