Comptage ds colonnes et changement de valeurs

S

Steph

Guest
Bonjour,

voici mon petit problème :

J'ai une série de colonnes sur ma feuille excel contenant des doublets de caractères a, g, c, t ou des 0. (voir ficheir joint) Exemple dans la première colonne

ag
gg
ag
gg
ga
ga
0
aa
gg
etc...


J'aimerais créer une macro permettant de compter chaque caractère dans colonne (ex:23 'a' et 19 'g' dans la colonne A) et de remplacer la valeur la plus présente (ici, a) par 1 et la seconde (ici, g) par 2 et virer les 0.

Voici un fichier exemple, avec en feuille 1 le tableau initial et en feuille 2 le tableau auquel j'aimerais arriver.

Merci pour votre aide

Steph [file name=atgc.zip size=2694]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/atgc.zip[/file]
 

Pièces jointes

  • atgc.zip
    2.6 KB · Affichages: 16

sylv900

XLDnaute Occasionnel
je n'ai pas le temps de tout de programmer mais voici des élément :
_fait une boucle for de 1 à nbligne (nbligne=ActiveSheet.UsedRange.Rows.Count) permettant de lire chaque cellule.
_dans cette boucle utilise des boucle if then pour identifier les termes (a, g, c, t ou 0)
_pour chaque termes incrémente (ex : if Mid(range('A' & i), 1, 1)=a then x=x+1 endif)
_enfin affiche dans des msgbox les résultats de tes incrémentations (ici 'x') pour vérifier le comptage)
_pour remplacer tes lettres par des valeurs reprend une boucle de 1 à ligne


je sais c'est rapide mais si tu as des questions tu est le bienvenu...
 
S

Steph

Guest
Merci pour tes conseils.
Voici un bout de code que j'ai développé suivant ton algo mais qui fonctionne pas génial. Si quelqu'un a une idée...

Merci
Steph :) [file name=atgc_20050412112414.zip size=11096]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/atgc_20050412112414.zip[/file]
 

Pièces jointes

  • atgc_20050412112414.zip
    10.8 KB · Affichages: 21

sylv900

XLDnaute Occasionnel
remplace tout le début de ton code par ça :
Sub essai()

Dim a, t, g, c, x As Integer
Dim col As Byte
Dim val As String
nbligne = ActiveSheet.UsedRange.Rows.Count

Columns('A:A').Select
For x = 1 To nbligne
a = t = g = c = 0
'incrémentation des variables
val = Range('A' & x)
If val = 'aa' Then
a = a + 2
ElseIf val = 'tt' Then
t = t + 2
ElseIf val = 'gg' Then
g = g + 2
ElseIf val = 'cc' Then
c = c + 2
ElseIf val = 'at' Or val = 'ta' Then
a = a + 1 And t = t + 1
ElseIf val = 'ag' Or val = 'ga' Then
a = a + 1 And g = g + 1
ElseIf val = 'ac' Or val = 'ca' Then
a = a + 1 And c = c + 1
ElseIf val = 'tg' Or val = 'gt' Then
t = t + 1 And g = g + 1
ElseIf val = 'tc' Or val = 'ct' Then
t = t + 1 And c = c + 1
ElseIf val = 'gc' Or val = 'cg' Then
g = g + 1 And c = c + 1
ElseIf val = '0' Or val = 'ct' Then
Range('A' & x) = ' '
End If
Next


'affichage du resultat et remplacement


normalement ca marche tu verras
sylvain
 
S

Steph

Guest
Merci bien pour ton aide.

Si j'utilise le code que tu m'as donné (que j'ai très légèrement modifié), cela fonctionne presque maintenat si l'on enlève l'initialisation des a t g c. Presque car la macro ne bugge pas mais me trouve 2 t et 18 c alors qu'il y en a 17 et 29... je ne sais pas du tout d'où ca peut provenir. Si on laisse l'initialisation à 0, pas de bug mais aucune msgbox.

Sub essai()

Dim a, t, g, c, x As Integer
Dim col As Byte
Dim val As String
nbligne = ActiveSheet.UsedRange.Rows.Count

Columns('A:A').Select
For x = 1 To nbligne
' a = t = g = c = 0
'incrémentation des variables
val = Range('A' & x)
If val = 'aa' Then
a = a + 2
ElseIf val = 'tt' Then
t = t + 2
ElseIf val = 'gg' Then
g = g + 2
etc...

Je vais partir en pause pour déjeuner et serai de retour vers 14h, si tu as une idée de l'origine de ce mauvais comptage, n'hésite pas.

Merci encore

Steph
 
S

Steph

Guest
Rebonjour,

C'est bon, tout fonctionne pour la première colonne. Sylv900 merci pour ton aide

La question est donc maintenant de savoir comment on fait cette opération en changeant de colonne jusqu'à la dernière.

Je suppose qu'il faut faire une boucle while du style

Dim col as byte
While isempty(col & 1) = false
...
wend

mais ceci ne fonctionne pas.

Comment initialiser col à la première colonne sur la gauche?
Quelle est la formulation pour une telle boucle?


Merci

Steph
 
S

Steph

Guest
J'ai essayé et sur le principe ta boucle est bonne.
Seulement, je ne sais pas comment remplacer les 'A' désignat la première colonne par les j.
Par exemple dans les expressions :

For x = 1 To 90
val = Range('A' & x)
If val = 'aa' Then
a = a + 2
ElseIf etc...

ou encore dans

MsgBox 'Le nombre de g dans cette colonne est:' & g
If g >= c Then
Range('A2:A90').Select
Selection.Replace What:='g', Replacement:='1', LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Selection.Replace What:='c', Replacement:='2', LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Else: Range('A2:A90').Select


As tu une idée?
 

Discussions similaires

Réponses
22
Affichages
782

Statistiques des forums

Discussions
312 229
Messages
2 086 424
Membres
103 206
dernier inscrit
diambote