vba : écrire un certain nombre de fois un nombre en fonction d'une variable

ter

XLDnaute Nouveau
Bonjour,

J'explique mon problème : Je dois vérifier qu'un nombre constitué de 7 chiffres correspond bien à deux autres colonnes (colonne 1 et 2).
Le problème étant que ce nombre est "plus ou moins" la concaténation des deux autres (récupération toujours du second, troisième et quatrième chiffre du nombre colonne 1 en début et en fin récupération de tous les chiffres du nombre colonne 2)... Au milieu des deux, il y a un certain nombre de zéros.
Le problème est que le nombre en colonne 2 peut varier (allant de 1 à 3 chiffres)... Ce nombre variant en fonction des lignes, mon nombre de zéros aussi (puisqu'en tout, il me faut 7 chiffres).

Un exemple :
nombre colonne 1 : 1302
nombre colonne 2 : 8
Nombre colonne 39 : 3020008

Autre exemple :
nombre colonne 1 : 2513
nombre colonne 2 : 102
nombre colonne 39 : 5130102

J'ai créé le code suivant :
Code:
Sub test_lot()

For i = 4 To 2181

    lenght = Len(Cells(i, 2))
    
    If lenght = 1 Then
        If Cells(i, 39) = Mid(Cells(i, 1), 2, lenght) & "000" & Cells(i, 2) Then
            Cells(i, 40) = Cells(i, 39)
        End If
    
    ElseIf lenght = 2 Then
        If Cells(i, 39) = Mid(Cells(i, 1), 2, lenght) & "00" & Cells(i, 2) Then
            Cells(i, 40) = Cells(i, 39)
        End If
        
        
    ElseIf lenght = 3 Then
        If Cells(i, 39) = Mid(Cells(i, 1), 2, lenght) & 0 & Cells(i, 2) Then
         Cells(i, 40) = Cells(i, 39)
        End If
    End If
      
        
Next i
End Sub

Celui-ci ne marche que quand il ne faut rajotuer qu'un seul 0.


Il y aurait donc deux moyens de me débloquer :
1) Me dire pourquoi quand je met des guillemets ça ne marche pas (et comment je peux faire pour que ça marche en gardant mon code en l'état).
2) Me dire comment je pourrais faire pour n'avoir qu'une seule boucle if (c'est à dire s'il y a moyen que je mette une ligne du genre : Cells(i, 39) = Mid(Cells(i, 1), 2, lenght) & 7-3-lenght*0 & Cells(i, 2) (mettre un certain nombre de zéros)



Quelqu'un saurait-il m'aider ? Cela m'aiderait beaucoup.

Merci d'avance :)
 

VDAVID

XLDnaute Impliqué
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

Bonjour ter,

Un test, (Si j'ai bien compris ^^) à insérer dans le projet de ta feuille ou dans un module:

Code:
Option Explicit
Dim Chaine As String
Dim i As Integer
Dim NumColRef As Byte
Dim Ws As Worksheet

Sub test_lot2()
    
    'Nom de la feuille où effectuer la macro
    Set Ws = Sheets("Feuil1")
    
    'Numéro de la colonne de la valeur finale
    NumColRef = 39
    
    With Ws
    
        For i = 4 To .Cells(65536, NumColRef).End(xlUp).Row
        
            If .Cells(i, NumColRef).Value <> "" Then
        
            Chaine = .Cells(i, NumColRef).Value
        
                If Chaine Like Mid(.Cells(i, 1).Value, 2, Len(.Cells(i, 1).Value)) & "*" And StrReverse(Chaine) Like StrReverse(.Cells(i, 2).Value) & "*" Then
            
                    MsgBox "La cellule " & .Cells(i, NumColRef).Address & " est valide"
            
                End If
        
            End If
        
        Next i
    
    End With
    
End Sub

N'hésite pas si tu as des questions ou si je suis à côté de la plage !

Bonne journée
 

ter

XLDnaute Nouveau
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

Bonjour Dranreb,

Je dois avouer que quand je lis ta suggestion Dranreb, je me sens un peu bête... et en même temps, après avoir essayé ton code rien ne marche, saurais-tu? (le code ne plante pas, seulement dans la colonne 40 aucune valeur ne s'affiche).
Voici le code utilisé :
Code:
Sub test_lot2()

For i = 4 To 2181
    If Cells(i, 39).Value = (Cells(i, 1) Mod 1000) * 10000 + Cells(i, 2) Then
        Cells(i, 40) = Cells(i, 39)
    End If
Next i
End Sub

EDIT: C'était finalement un problème de format. Cette solution pose toutefois quand même un problème. Si dans la colonne 1, il y a 3001, Cells(i, 1) Mod 1000 = 1 (et non à 001 comme j'aurais aimé avoir)


Bonjour VDAVID,
J'avoue que j'ai du mal à comprendre ton code :s
Je cherche à la fois à tester si ça marche, mais aussi à récupérer les valeurs, donc je préférerais juste qu'elles apparaissent dans la colonne de droite. Et ... euh... comme je comprends pas ton code, je sais pas le modifier en conséquence :s

Merci en tout cas !
Ter
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

Bonsoir à tous

Si j'ai bien compris en utilisant Mid et Format
Cf. macro de test ci-dessous (juste comme source d'inspiration, pas comme une solution immédiatement exploitable)
Code vba:
Sub mTest()
Dim k, j, l, m, messT$
k = 1302: j = 8: l = 2513: m = 102
n1 = Mid(k, 2, 9 ^ 9) & Format(j, "0000")
n2 = Mid(l, 2, 9 ^ 9) & Format(m, "0000")
messT = n1 & vbTab & "NBCAR=7 -> " & (Len(n1) = 7) & vbCrLf
messT = messT & n2 & vbTab & "NBCAR=7 -> " & (Len(n2) = 7) & vbCrLf
messT = messT & vbCrLf & "Tests OK avec ces chiffres"
MsgBox messT, vbInformation, "Nombres testés :" & k & ", " & j & ", " & l & ", " & m
End Sub
 

VDAVID

XLDnaute Impliqué
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

Bonjour tout le monde,

Si jamais:

Pour récupérer la valeur dans la colonne de droite quand ta condition est validée:

Code:
Sub test_lot2()
    
    'Nom de la feuille où effectuer la macro
    Set Ws = Sheets("Feuil1")
    
    With Ws
    
        For i = 4 To 2181
        
            If .Cells(i, 39).Value <> "" Then
        
            Chaine = .Cells(i, 39).Value
        
                If Chaine Like Mid(.Cells(i, 1).Value, 2, Len(.Cells(i, 1).Value)) & "*" And StrReverse(Chaine) Like StrReverse(.Cells(i, 2).Value) & "*" Then
            
                    .Cells(i, 40).Value = .Cells(i, 39).Value
            
                End If
        
            End If
        
        Next i
    
    End With
    
End Sub

L'instruction Like permet de comparer deux chaines de caractères entre elles, ici je compare la première valeur de la cellule (i,1) pour vérifier qu'elle correspond à une partie de la cellule à tester :

Mid(.Cells(i, 1).Value, 2, Len(.Cells(i, 1).Value)) & "*"

Le "*" correspondant à toutes les valeurs à la suite (ici les "0" + le ou les derniers chiffres de la cellule)

puis on fait la même chose pour le ou les chiffres à droite, en utilisant StrReverse qui permet de "retourner" une chaine de caractères (On part de la fin)

StrReverse(Chaine) Like StrReverse(.Cells(i, 2).Value) & "*"
 

ter

XLDnaute Nouveau
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

Bonjour,

Un grand merci à toi VDAVID. Tu m'as appris un certain nombre de fonctions utiles et ton algo marche :) (mais je ne sais toujours pas pourquoi les autres ne marchaient pas... un problème de format sans doute, étant donné qu'avec un seul 0 mon algo marche aussi).

Cordialement,
Ter


Edit :
Mon test ayant réussi, j'aimerais à présent récupérer le numéro à sept caractère exactement.
Et si je voulais modifier ton code pour récupérer le numéro à sept caractère, ce serait possible ? (parce que là, peut importe le nombre de zéros :s).
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

Bonjour.
VB:
If Cells(i, 39).Value = (Cells(i, 1) Mod 1000) * 10000 + Cells(i, 2) Then Cells(i, 40) = Format(Cells(i, 39), "0000000")
Il faut que la cible soit au format Texte. Ou alors reprendre le nombre tel quel mais mettre à la cellule cible le format de nombre personnalisé 0000000

Ou si la colonne 39 est aussi déjà au format texte et contient du texte :
VB:
If Cells(i, 39).Value = Format((Cells(i, 1) Mod 1000) * 10000 +  Cells(i, 2),  "0000000") Then Cells(i, 40) = Cells(i, 39)
 
Dernière édition:

ter

XLDnaute Nouveau
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

Bonjour Dranreb,

Ton code marche à présent, merci (la ligne 39 était au format texte).
Mais à présent que mon test semble marcher, j'aimerais récupérer les numéros à 7 chiffres de toutes mes lignes (et plus seulement faire un test). J'ai donc utilisé ton code (à peine modifié) :
Code:
For i = 4 To 2181
    Cells(i, 40) = Format((Cells(i, 1) Mod 1000) * 10000 + Cells(i, 2), "0000000")
Next i
End Sub

J'ai alors récupéré des numéros qui ne prenaient pas en compte les numéros devant (je suis vraiment pas doué niveau format).
J'ai alors changé leur format en personnalisé : 0000000.
Le problème est que je me retrouve avec des numéros qui ont la bonne apparence, mais que je ne peux pas comparer (avec d'autres valeurs à sept chiffres, mais qui eux, en ayant le format texte, gardent les zéros).
Sais-tu comment je pourrais faire ?

Par exemple, je me retrouve avec une cellule où je vois affiché 0030009, mais qui en formule garde la forme 30009. Le problème étant que lorsque je lance une recherchev pour rechercher 0030009, il ne la trouve pas (et pour cause).

Merci en tout cas :)
 

Staple1600

XLDnaute Barbatruc
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

Bonjour à tous

ter:
Il semblerait que je sois sous cape d'invisibilté
Ou alors c'est ton navigateur qui te joue des tours ;)
(cf mon précédent message (rédigé à 1h47 ce matin) dans ton fil qui semble avoir été "vanish in the air" ;) )
 

Dranreb

XLDnaute Barbatruc
Re : vba : écrire un certain nombre de fois un nombre en fonction d'une variable

J'ai donc utilisé ton code (à peine modifié) :
Le code rappelé derrière est celui qui convient pour des numéros enregistrés en tant que textes dans des cellules préalablement munies d'un format de Texte (changer le format après coup ne transforme jamais la nature des données qui y sont enregistrées: un format numérique est purement et simplement ignoré si la cellule contient du texte, et si elle n'est pas muni d'un format de texte avant qu'on lui assigne une valeur texte, celle ci risque d'être convertie en nombre)
Et spécifiez, à rechercher, un type de donnée identique à celui qui est enregistré, avec les 0 non significatifs si c'est du texte.
 

Discussions similaires

Réponses
0
Affichages
137
Réponses
7
Affichages
322

Statistiques des forums

Discussions
312 103
Messages
2 085 317
Membres
102 862
dernier inscrit
Emma35400