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
    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.
    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
        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. 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
            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. 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. 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?
              2. 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
              3. 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. 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. 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