Probleme "Else without If"

Bonjour à tous,

Je suis tout nouveau sur VBA et voici le code que j'ai tapé :

Sub Related1_Addition()

Cells(j, "F").Value = Cells(j, "F").Value + Cells(i, "G").Value

End Sub

Sub MHRelated1Hours()
Dim i As Integer
Dim j As Integer

For j = 1 To 9999
If Cells(j + 1, "G").Value > 0 And Cells(j, "G") Is Blank Then
For i = j + 1 To j + 300
If Cells(i, "G") > 0 Then
Call Related1_Addition
Else
Exit For
End If
Else
Next

End If

End Sub

Lorsque je teste, il me dit "Compile error - Else without if". J'ai cherché sur internet mais apparemment assez mal vu que je n'ai pas trouvé de solution viable... Quelqu'un pourrait-il m'aider s'il vous plait ?

Un grand merci pour le coup de pouce !
A bientot !

12 réponses

  1. Contributeur
    Bonjour,
    Tu dois indenté ton code, cs erreur seront plus facile à détecter.
    Sub MHRelated1Hours()
    Dim i As Integer
    Dim j As Integer
        For j = 1 To 9999
            If Cells(j + 1, "G").Value > 0 And Cells(j, "G") = "" Then
                For i = j + 1 To j + 300
                    If Cells(i, "G") > 0 Then
                        Cells(j, "F").Value = Cells(j, "F").Value + Cells(i, "G").Value
                        'Call Related1_Addition
                    Else
                        Exit For
                    End If
                Next i
            End If
        Next
    End Sub

    Les variables déclarées dans une procédure ne sont pas "visible" dans une autre procédure.
    Pour cela il faut les déclarer en haut du module et de préférence mettre des noms qui ne prète pas à confusion comme par exemple Ligne ou Colonne
    Dim Ligne as long
    Dim Colonne as integer

    De cette façon tu peu te servir de la deuxième procédure qui dans le cas présent n'est pas fort nécessaire.
    A+

    1. Modérateur
      Bonjour,

      Il ne te manquerai pas, par hasard, un Next? Je vois deux "For", mais un seul "Next" dans le code donné plus haut...

      Cordialement,
      Franck P
      1. Parfait merci beaucoup,

        Il me semblait bien que c'était quelque chose comme ca. Je n'ai plus d'erreur sur VBA, mais sur Excel maitenant...

        Lorsque je souhaite lancer la macro, il me dit : "run time error : 13. Type mismatch" en me surlignant la ligne
        Cells(j, "F").Value = Cells(j, "F").Value + Cells(i, "G").Value

        Cela signifie-t-il que la ligne n'est pas écrit correctement ?

        Merci de m'aider si quelqu'un sait.

        En tous cas ça fait vraiment plaisir d'avoir des réponses si rapides et de pouvoir avancer !
        1. Modérateur
          Bonjour,
          Salut tout le monde,
          Bonne année à vous 3...

          run time error : 13. Type mismatch provient peut être d'un mauvais type de données dans les cellules...
          Si Fj = 3 et Gi = "pomme de terre", la ligne : Cells(j, "F").Value = Cells(j, "F").Value + Cells(i, "G").Value revoit une erreur de type 13.

          Plus de renseignements, Cf aide de VBA :
          Type incompatible (erreur 13)

          Visual Basic peut convertir et forcer plusieurs valeurs pour effectuer des affectations de type de données qui étaient impossibles dans des versions antérieures. Cependant, cette erreur peut toujours se produire et peut avoir les causes et solutions suivantes :

          La variable ou la propriété n'est pas du type approprié. Par exemple, une variable nécessitant une valeur entière ne peut pas accepter de valeur de chaîne sauf si cette valeur peut être reconnue comme un entier.
          Essayez d'effectuer des affectations uniquement entre types de données compatibles. Par exemple, un Integer peut toujours être affecté à une variable de type Long, un type Single peut toujours être affecté à une variable de type Double, et n'importe quel type (à l'exception d'un type défini par l'utilisateur) peut être affecté à une variable de type Variant.

          Un objet a été passé à une procédure attendant une propriété ou une valeur simple.
          Passez la propriété simple appropriée ou appelez une méthode adaptée à l'objet.

          Un nom de module ou de projet a été utilisé à l'endroit où une expression était attendue, par exemple :
          Debug.Print MyModule

          Spécifiez une expression pouvant être affichée.

          Vous avez tenté de combiner une gestion d'erreurs Basic traditionnelle avec des valeurs de type Variant ayant le sous-type Error (10, vbError), par exemple :
          Error CVErr(n)

          Pour générer à nouveau une erreur, vous devez trouver la correspondance à une erreur Visual Basic intrinsèque ou définie par l'utilisateur, puis générer cette erreur.

          Une valeur CVErr ne peut pas être convertie en Date. Par exemple :
          MyVar = CDate(CVErr(9))

          Utilisez une instruction Select Case ou une structure similaire pour mapper le renvoi de CVErr à ce type de valeur.

          Au moment de l'exécution, cette erreur indique généralement qu'une variable de type Variant utilisée dans une expression a un sous-type incorrect, ou qu'une variable de type Variant contient un tableau apparaissant dans une instruction Print #.
          Pour imprimer des tableaux, créez une boucle affichant chaque élément individuellement.

          Pour plus d'informations, sélectionnez l'élément en question et appuyez sur F1 (sous Windows) ou AIDE (sur Macintosh).
      2. Bonjour Quenton,

        Apprendre à programmer c'est aussi apprendre à INDENTER le CODE !!
        Vous auriez indenter votre code, vous l'auriez vu tout de suite !
        Ajouter ou supprimer le texte en gras:

        Sub MHRelated1Hours()
            Dim i As Integer
            Dim j As Integer
            '
            For j = 1 To 9999
                If Cells(j + 1, "G").Value > 0 And Cells(j, "G") Is Blank Then
                    For i = j + 1 To j + 300
                        If Cells(i, "G") > 0 Then
                            Call Related1_Addition
                        Else
                            Exit For
                        End If
                    Next i a AJOUTER
                Else
                    Next a SUPPRIMER
                End If
            Next j a AJOUTER
        End Sub
        1. Contributeur
          Hello Heliotte,
          Bizarre, bizarre.. Vous avez..
          Normalement ça devrait aller, mais Excel à quelque fois des réactions... bizarre :-)
          essaye..
          Sub MHRelated1Hours()  
          Dim i As Integer  
          Dim j As Integer  
          Dim Buff  
              For j = 1 To 9999  
                  If Cells(j + 1, "G").Value > 0 And Cells(j, "G") = "" Then  
                      For i = j + 1 To j + 300  
                          If Cells(i, "G") > 0 Then  
                              Buff = Cells(j, "F").Value + Cells(i, "G").Value  
                              Cells(j, "F").Value = Buff  
                              'Call Related1_Addition  
                          Else  
                              Exit For  
                          End If  
                      Next i  
                  End If  
              Next  
          End Sub

          Tu dis..
          Et pourquoi 9999 ?

          Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
          NOTE : Je ne répond pas aux MP pour les questions techniques.
          1. Bonsoir Lermite, bonsoir à tous,

            Je suis vraiment désolé .. mais quand j'ai répondu à 14:16, il n'y avait aucune autre réponse .. c'est même cela qui m'a fait répondre !!
            Petit bug ou mauvaise manipulation .. à moins que les câbles eux aussi ne se les gèles :-)
          2. Contributeur
            Pas de souci Heliotte, tu n'est pas le premier à qui ça arrive... ont clic sur le scroll et op, ça passe une réponse.
            A+
            EDIT : comme moi d'ailleurs, je n'avais pas encore vu le message... Bonjour Pijaku
        2. Bonjour a tous,

          Merci pour vos réponses rapides. Il y avait effectivement une petite cellule contenant du texte qui s'était glissé...

          J'ai mis 9999 comme limite dans la boucle parce que je ne sais pas comment renseigner proprement "effectuer la boucle jusqu'à ce que la cellule soit vide". Si quelqu'un pouvait me donner l'astuce ce serait parfait !

          Sinon j'ai un autre probleme sur une autre macro qui vise a supprimer des doublons. En gros, la colonne "B" contient des codes trier par ordre croissant et je souhaite qu'il n'y ait plus qu'un exemplaire de chaque code (celui dont la valeur en colonne "F" est la plus importante).

          Voici ce que j'ai écrit :

          Sub Delete_Lignes()
          Dim i As Long
          Application.ScreenUpdating = False
          For i = 9999 To 3 Step -1
          If Cells(i, "B") = Cells(i + 1, "B") Then
          If Cells(i, "F").Value > Cells(i + 1, "F").Value Then
          Rows(i + 1).Delete
          Else
          Rows(i).Delete
          End If
          End If
          Next i
          End Sub

          Et lorsque je l'execute, il surligne la ligne Rows(i).Delete et me dit :
          Run time Error 1004
          Delete method of range class failed

          Si quelqu'un a une idée...

          Merci encore pour votre aide !
          A bientot
          1. Modérateur
            Bonjour,

            Pour remplacer 9999 par le numéro de la dernière ligne non vide de la colonne G :
            Dim DernLigne As Long  
            DernLigne = Columns(7).Find("*", , , , xlByColumns, xlPrevious).Row 
            'et ta boucle, au lieu de for i = 1 To 9999 devient :
            For i = 1 To DernLigne

            ou Columns(7) = 7ème colonne = colonne G

            Pour l'erreur Run time 1004... Bof, plein de choses sont possibles. Et là faut tester avec le fichier.

            A titre d'exemple : feuille protégée?
        3. Très bien, je vais tester ça, merci.

          Pour l'erreur 1004, je ne sais pas par ou chercher parce qu'auparavant, tout marchait jusqu'à ce que je change un peu la boucle et depuis, impossible de revenir a quelque chose de fonctionnel !

          Sinon, pour l'instant j'enregistre toutes mes macros dans un fichier Excel "a ouvrir pour macros" et j'ouvre donc a la fois ce fichier et celui sur lequel je souhaite travailler. Je trouve cette méthode un peu gitan, et voudrais savoir s'il existe une solution plus propre ?

          Merci encore pijaku !
          1. Contributeur
            Sinon, pour l'instant j'enregistre toutes mes macros dans un fichier Excel "a ouvrir pour macros" et j'ouvre donc a la fois ce fichier et celui sur lequel je souhaite travailler. Je trouve cette méthode un peu gitan, et voudrais savoir s'il existe une solution plus propre
            Si tes macros doivent servir pour d'autre appli ça pourrait éventuellement se comprendre mais il faudrait alors en faire des fonctions paramétrées.
            Donc ici.. Non, aucun intérêt.
            Pour le dernière ligne moi j'emploi
                DerLig = Cells(Rows.Count, 1).End(xlUp).Row

            Et pour supprimer les doublons..
            Sub Delete_Lignes()
               Sheets("Feuil1").Range("A1:" & Range("A1").SpecialCells(xlCellTypeLastCell).Address). _
                RemoveDuplicates Columns:=2, Header:=xlYes
            End Sub
            Pas oublier d'adapter le nom de la feuille.
            A+
            1. Les solutions pour appeler la derniere ligne marche parfaitement. Merci.

              Evidemment, il y a toujours des petits obstacles. Voici la prochaine énigme pour vous !

              J'ai voulu compiler toutes mes macros en une pour que ce soit plus simple a lancer. Voici ce que ça donne :

              Sub Total_Transformation()

              Call Preparation_from_CMP_to_DB

              Call MHRelated1Hours
              Call MHRelated2Hours

              Call Related1_Names
              Call Related2_Names

              Call Appl_filter
              Call Delete_Lignes

              Call Finalisation
              Call Police
              Call Position_texte

              End Sub

              Ca a peut etre un aspect un peu barbare mais bon... Individuellement, toutes ces macros fonctionnent. Mais quand je lance celle-ci, il me sort cette error compile : "ambiguous name detected ~".

              Une idée ... ?

              Merci encore !
              1. Contributeur
                C'est que tu à deux ou plus de macros qui ont le même nom.
                Notre : il y a aussi la touche F1 qui peu t'aidé.
                A+

                Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
                NOTE : Je ne répond pas aux MP pour les questions techniques.
                1. Oui désolé de vous faire perdre votre temps, c'est vrai que j'ai (encore)° fait une erreur d'inatention... Dur dur de s'y retrouver les premières fois qu'on utilise VBA. En tous cas merci de l'aide, ça aide vraiment beaucoup !

                  Si je puis me permettre d'abuser encore un peu... J'ai deux problèmes et après j'aurais vraiment tout terminé niquel (quoiqu'on est jamais trop a l'abri). Voici déjà le premier.

                  Je souhaite appliquer un filtre a toutes les colonnes remplies (de A à I) puis trier par ordre croissant selon la colonne B. En enregistrant une macro, voici le code qu'il me sort. Malheureusement, en testant ce code, il me dit direct : "Run time error 91. Object variable or With block variable not set" en surlignant la ligne en gras.

                  Je suis désepéré ! Que dois-je faire pour que cela fonctionne !?

                  Sub Appl_Filter()

                  Range("A2:I2").Select
                  Selection.AutoFilter


                  ActiveWorkbook.Worksheet("ExcelOutputOfCheckedItems").AutoFilter.Sort. _
                  SortFields.Clear


                  ActiveWorkbook.Worksheets("ExcelOutputOfCheckedItems").AutoFilter.Sort. _
                  SortFields.Add Key:=Range("B2"), SortOn:=xlSortOnValues, Order:= _
                  xlAscending, DataOption:=xlSortNormal
                  With ActiveWorkbook.Worksheets("ExcelOutputOfCheckedItems").AutoFilter.Sort
                  .Header = xlYes
                  .MatchCase = False
                  .Orientation = xlTopToBottom
                  .SortMethod = xlPinYin
                  .Apply
                  End With

                  End Sub
                  1. Contributeur
                    Re,
                    ActiveWorkbook.Worksheet("ExcelOutputOfCheckedItems").AutoFilter.Sort. _  
                    SortFields.Clear 

                    à remplacer par
                        On Error Resume Next 
                        Sheets("ExcelOutputOfCheckedItems").AutoFilter 
                       On Error Goto 0 
                    

                    Cette fonction sert pour supprimer le filtre précédant mais génère une erreur s'il n'y en a pas d'où la gestion de l'erreur.
                    A+
                    EDIT :
                    Ton Autofilter là ou y doit pas être m'a induit en erreur...
                        ActiveWorkbook.Worksheets("ExcelOutputOfCheckedItems").Sort.SortFields.Clear
                    

                    Et supprime Autofilter aussi dans la ligne suivante.

                    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
                    NOTE : Je ne répond pas aux MP pour les questions techniques.