Probleme "Else without If"

Fermé
Quenton - 21 janv. 2013 à 12:11
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 24 janv. 2013 à 11:51
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

lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
21 janv. 2013 à 12:49
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 21/01/2013 à 12:46
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
22 janv. 2013 à 09:07
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
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
21 janv. 2013 à 14:16
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 21/01/2013 à 16:10
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
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 21/01/2013 à 17:45
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 21/01/2013 à 18:24
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 23/01/2013 à 10:06
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
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
23 janv. 2013 à 11:29
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
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 24/01/2013 à 08:39
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
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 24/01/2013 à 12:03
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