A voir également:
- Double If - vba - Excel 2007
- Double ecran - Guide
- Whatsapp double sim - Guide
- Liste déroulante excel - Guide
- Save as pdf office 2007 - Télécharger - Bureautique
- Word et excel gratuit - Guide
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
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
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
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
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
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
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
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
1 nov. 2011 à 16:11
apparemment, CCM ne veut pas que l'on modifie un message :-(
mets un next avant end sub
mets un next avant end sub
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.
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.
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
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)
https://www.cjoint.com/?3KbrsLZRT8N
et ca correspond à ce post (je crois)
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
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
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
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)
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)
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 :)
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 :)
1 nov. 2011 à 13:58
Crdt,
Paul