Probleme "Else without If"

Quenton -  
lermite222 Messages postés 9042 Statut Contributeur -
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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    0
  3. Quenton
     
    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 !
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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).
      0
  4. Heliotte Messages postés 1561 Statut Membre 92
     
    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
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0
    1. Heliotte Messages postés 1561 Statut Membre 92
       
      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 :-)
      0
    2. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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
      0
  7. Quenton
     
    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
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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?
      0
  8. Quenton
     
    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 !
    0
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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+
    0
  10. Quenton
     
    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 !
    0
  11. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0
  12. Quenton
     
    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
    0
  13. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0