Double If - vba - Excel 2007

Fermé
brutus - Modifié par brutus le 31/10/2011 à 22:10
 brutus - 1 nov. 2011 à 18:55
Bonjour,

Je n'arrive pas a comprendre pourquoi ce code ne marche pas, c'est juste une condition If dans une autre pour afficher une lettre ou un "Error" dans la 3eme colonne.

Par exemple si entre deux "a" (dans la premiere colonne) les cellules sont vide alors il faut mettre "a" a droite des numeros (qui sont dans la deuxieme colonne) sinon des "Error"; ou si un "c" est suivi apres un groupe de numeros (qui sont tjrs dans la deuxieme colonne) par un "d" (dans la premiere colonne) mettre "Error" (car deux lettres differentes qui se suivent); un peu comme ci-dessous:

a
1 a
2 a
3 a
a

b
1 b
2 b
3 b
4 b
5 b

c
1 Error
2 Error
d

e
1 Error
2 Error
3 Error
c 4 Error
5 Error
e


Bref le code me met que des "Error" dans la 3eme colonne a droite des numeros:

Private Sub CommandButton1_Click()

Dim i As Integer
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim s As Integer
Dim l As Integer
Dim e As Integer

s = 0
l = 0
e = -2

For i = 1 To 5

l = 0
s = e + 4
Cells(s, 2).Select
Do While Not (IsEmpty(ActiveCell))
l = l + 1
Selection.Offset(1, 0).Select
Loop
e = s + l - 1
Cells(s, 2).Select
Do While (IsEmpty(ActiveCell))
p = p + 1
Selection.Offset(1, 0).Select
Loop

If Cells(s - 1, 1) <> Cells(e + 1, 1) Then
For a = s To e
Cells(a, 3).Value = "Error"
Next a
Else
If p <> l Then
For b = s To e
Cells(b, 3).Value = "Error"
Next b
Else
For c = s To e
Cells(c, 3).Value = Cells(e + 1, 1).Value
Next c
End If
End If

Next i

End Sub

Un grand merci a tout ceux a qui vba est plutot aise et qui veulent bien m'aider :)
Bonne soiree!
Paul
A voir également:

5 réponses

michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
1 nov. 2011 à 07:11
Bonjour,

Excuses moi, mais je n'ai rien compris à tes tentatives d'explications (inutile de les surlignées en gras agressif)
donc... d'autre part, l'usage d'une seule lettre comme variable, le manque de commentaires, rend ton code difficile à comprendre et à effectuer une maintenance, qualités premières d'un code
dans l'attente
0
Merci! Je vais modifier le texte des maintenant.
Crdt,
Paul
0
Bonjour michel_m, merci pour les conseils, tenez-moi au courant si les commentaires vous conviennent, et j'ai donne des noms a cote des lettres si cela peux aider:

Private Sub CommandButton1_Click()

'La variable qui me permet de reiterer l'operation, ici 100 fois
Dim i As Integer
'La variable qui me permet d'utiliser mes boucles et qui remplissent les cellules de la 3eme colonne (avec "Error" par exemple)
Dim a As Integer
'La variable qui definit la ligne sur laquelle commence la serie de nombres dans la 2eme colonne
Dim s As Integer
'La variable qui definit la longueur de la serie de nombre
Dim l As Integer
'La variable qui donne la derniere ligne sur laquelle termine la serie de nombres
Dim e As Integer
'La variable qui calcule le nombre de cellules vides entre

'e=-2 car entre deux series de nombres dans la 2eme colonne il y a +4 lignes de difference; et la premiere serie de nombre commence a la 2eme ligne
s = 0 'start
l = 0 'length
e = -2 'end
p = 0 'parasite

'Le nombre d'iterations est a changer en fonction du nombre de series de nombres
For i = 1 To 100

'on remet la longueur a 0
l = 0
'la ligne de debut "s" de la prochaine serie de nombres commence 4 lignes apres
s = e + 4
'je calcule la longueur de la nouvelle serie de nombres qui commence toujours dans la deuxieme colonne, et qui se termine lorsque les cellules ne sont pas remplies
Cells(s, 2).Select
Do While Not (IsEmpty(ActiveCell))
l = l + 1
Selection.Offset(1, 0).Select
Loop
'la ligne de fin "e" de la serie de nombres en cours est positionne sur la ligne s+l-1
e = s + l - 1
'je calcule le nombre de cellules vides entre les lettres qui "encadrent" la serie de nombres. Ces deux lettres sont toujours positionnees sur la ligne s-1 et e+1, mais tous deux sont sur la 1ere colonne. Ce nombre "p" doit normalement etre egal a "l", si ce n'est pas le cas il faudra ecrire des "Error"
Cells(s, 2).Select
Do While (IsEmpty(ActiveCell))
p = p + 1
Selection.Offset(1, 0).Select
Loop

'Une condition IF dans une autre.
'Si la premiere lettre qui encadre la serie de nombres et differente de la seconde (ces lettres etant dans la premiere colonne, une ligne juste avant le 1er nombre et une ligne juste apres le dernier) alors...
If Cells(s - 1, 1) <> Cells(e + 1, 1) Then
'...il faut ecrire des "Error" a droite de chaque nombre de cette serie (cad dans la 3eme colonne)
For a = s To e
Cells(a, 3).Value = "Error"
Next a
'sinon, si le nombre de cellules vides entre les deux lettres dans la 1ere colonne est differente de la longueur de la serie de nombres alors...
Else
If p <> l Then
'...il faut ecrire des "Error" a droite de chaque nombre de cette serie (cad dans la 3eme colonne)
For a = s To e
Cells(b, 3).Value = "Error"
Next a
'sinon, il faut ecrire a droite de chaque nombre de cette serie (cad dans la 3eme colonne) la lettre qui encadre la serie (qui est donc la meme au debut et a la fin)
Else
For a = s To e
Cells(a, 3).Value = Cells(e + 1, 1).Value
Next a
'fin des deux conditions IF
End If
End If

'passer a la prochaine serie de nombres
Next i
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
1 nov. 2011 à 16:00
Si j'ai compris ta demande (pas facile) :o)

Option Explicit
Const Nbre As Byte = 250           'nbre de séries maximum
Const Col As Byte = 2                     'colonne des séries

Sub annoter()
Dim Cptr As Byte, Debut As Integer, Fin As Integer

'initialisations
Debut = 1
Application.ScreenUpdating = False                                        'fige défilement écran
Cells(Debut, Col + 1).Resize(32000, 1).ClearContents        'nettoyage

For Cptr = 1 To Nbre
     Debut = Columns(Col).Find("*", Cells(Debut, 2), xlValues).Row               'ligne début série
     Fin = Columns(Col).Find("", Cells(Debut, 2), xlValues).Row - 1                  'ligne fin série
     
     'annotation colonne+1 si m^me lettre ==> affectation lettre série sinon "error"
     Range(Cells(Debut + 1, Col + 1), Cells(Fin - 1, Col + 1)) = IIf(Cells(Debut, Col) = Cells(Fin, Col), Cells(Debut, Col), "error")
     Debut = Fin
    
     If Debut >= Columns(Col).Find("*", , , , , xlPrevious).Row Then Exit For   ' test de fin des séries

End Sub
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
1 nov. 2011 à 16:11
apparemment, CCM ne veut pas que l'on modifie un message :-(

mets un next avant end sub
0
d'accord je vais l'essayer de suite, merci beaucoup! Et oui j'ai essaye d'etre le plus precis dans mes commentaires :) je me disais du coup que ca n'allait pas etre facile a comprendre.
0
Merci beaucoup encore! J'ai bien mis un "next" avant "end sub". En copie-coller le code ne met que des "error" devant les nombres, meme si la serie de nombre est encadree par deux meme lettres (qui sont dans la premiere colonne) et que les cellules sont bien vides entre. Presque le meme resultat que le mien :)

Si ca peut aider comme exemple:

A1=a
B2=1
B3=2
B4=3
A5=a

A7=b
B8=1
B9=2
B10=3
B11=4
B12=5
A13=c

A15=c
B16=1
B17=2
A17=k
B18=3
A18=c

On devrait avoir un "a" en C2,C3,C4 pour la premiere serie
"error" en C8 -> C12 pour la deuxieme serie (parce que b et c sont differents)
"error" en C16 -> C18 pour la troisieme serie (parce qu'il y a un "k" entre le 1er et 2eme "c")

Avec mon code j'ai "error" en C2,C3,C4 avec le votre j'ai "error" C3
Jspr que ca precise un peu mieux les choses :) Pt etre que j'ai oublie de faire qqch?

Sinon en copiant-collant mon code, pouvez-vous voir, si vous voulez bien, pourquoi cela ne marche pas. Je cherche si possible a comprendre mes erreurs et a pouvoir les corriger, si c'est "corrigeable" :) En tout cas j'apprends de nouveaux objets/proprietes avec votre code.
0

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

Posez votre question
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
1 nov. 2011 à 17:21
je me suis basé sur le 1° post pour faire la maquette

https://www.cjoint.com/?3KbrsLZRT8N

et ca correspond à ce post (je crois)
0
oui pour le premier post CCM ne prenait pas en compte les espaces, pour pouvoir faire des "colonnes" :S

j'ai utilise votre site internet:
http://cjoint.com/?3KbrZVTw7ko

le code devrait faire apparaitre ce qu'il y a dans la 3eme colonne du fichier.

Mon code devrait marcher, a priori pas de probleme de synthexe ou de variable, mais je n'arrive pas a trouver l'erreur. Je vais utiliser le votre, c plus ideal il me semble. Mais ce serait que je comprenne mon erreur.

Bien cordialement,
Paul
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
Modifié par michel_m le 1/11/2011 à 18:10
Pourquoi -1 ? tu es ainsi au dessus du début de série
If Cells(s - 1, 1) <> Cells(e + 1, 1) Then

tu prends le code que tu veux, mais tu as beaucoup de maladresse de débutant dans ton code très compliqué(ne prends pas ça mal)
0
Je ne prends pas mal du tout, je commence ma formation en vba depuis 1 semaine seulement :) Merci de votre temps et patience surtout!

Justement je veux prendre la cellule (la ou se trouve la lettre) qui est une ligne au-dessus (s-1) du premier nombre de la serie (qui lui se trouve a la ligne s) et qui est dans la colonne 1. s=premiere ligne ou commence la serie de nombres (pas les lettres) et e=derniere ligne ou s'arrete la serie de nombres.

Avez-vous pu ouvrir mon lien par hasard? Dites-moi s'il ne marche pas pour vous :)
0