Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2011, 09h47   #1
Invité de passage
 
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 1
Points : 1
Par défaut Extraction des chiffres pour créer un nombre dans une chaîne alphanumérique

Bonjour,

Je souhaiterais extraire uniquement les chiffres contenu dans plusieurs cellules pour ensuite pouvoir les comparer.
Je souhaite intégrer cela dans une macro VBA.

par exemple, j'ai ARF234 et df234 dans deux cellules différentes. Le but étant que si le nombre créé par les chiffres extraits dans les 2 cellules sont les mêmes (ici ce sera donc 234) alors la condition est vrai et donc action.

Quelqu'un peut-il m'aider pour effectuer cette extraction et surtout bien obtenir deux chiffres à comparer (sachant qu'il faut aussi que je considère peut-etre le cas où certaines cellules ne contiennent pas de chiffres)?

Bonne journée
nimiquel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 10h51   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Bonjour,

Une solution consiste a se créer sa propre fonction

Cette proposition retourne EGAL si identique sinon PAS EGAL

A mettre dans un module
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function CompareNombre(rg1 As Range, rg2 As Range) As String
 
Dim Lng1 As Long
Dim Lng2 As Long
 
Dim i As Integer
 
For i = 1 To Len(rg1.Value)
    If IsNumeric(Mid(rg1.Value, i, 1)) Then Lng1 = Lng1 & Mid(rg1.Value, i, 1)
Next i
For i = 1 To Len(rg2.Value)
    If IsNumeric(Mid(rg2.Value, i, 1)) Then Lng2 = Lng2 & Mid(rg2.Value, i, 1)
Next i
 
CompareNombre = IIf(Lng1 = Lng2, "EGAL", "PAS EGAL")
 
End Function
A utiliser en formule
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 13h16   #3
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut heu...!!!

bonjour nimiquel

pour jfontaine

ca marche mieux comme ca

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 
Function CompareNombre(rg1, rg2) As String
 
Dim Lng1 As Long
Dim Lng2 As Long
 
Dim i As Integer
 
For i = 1 To Len(rg1.Value)
    If IsNumeric(Mid(rg1.Value, i, 1)) Then Lng1 = Lng1 & Mid(rg1.Value, i, 1)
Next i
For i = 1 To Len(rg2.Value)
    If IsNumeric(Mid(rg2.Value, i, 1)) Then Lng2 = Lng2 & Mid(rg2.Value, i, 1)
Next i
 
CompareNombre = IIf(Lng1 = Lng2, "EGAL", "PAS EGAL")
 
End Function
Sub voyons_si_c_est_egal()
lareponse = CompareNombre(Range("A1"), Range("A2"))
MsgBox lareponse
End Sub

au plaisir
__________________
mes fichiers dans les contributions:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 13h21   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Salut Patrick

Que veux tu dire par
Citation:
ca marche mieux comme ca
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 14h33   #5
Invité de passage
 
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 1
Points : 1
Bon je suis mauvais en codage mais comment intégrer votre fonction dans mon if?

Voici le code alors le if de départ qui ne marchait pas


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    For nw = 2 To Nb_Lignes
        For nz = 2 To Nb_LigneC
 
If (Sheets("Global").Range("G" & nw) Like Sheets("EPR").Range("F" & nz)) Then
 
Sheets("Global").Range("P" & nw) = Sheets("EPR").Range("F" & nz)
Sheets("Global").Range("Q" & nw) = Sheets("EPR").Range("G" & nz)
Sheets("Global").Range("R" & nw) = Sheets("EPR").Range("H" & nz)
Sheets("Global").Range("S" & nw) = Sheets("EPR").Range("AX" & nz)
 
End If
 
        Next nz
    Next nw
Merci encore pour l'aide.
nimiquel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 14h38   #6
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Essais comme cela
Code :
If CompareNombre(Sheets("Global").Range("G" & nw),Sheets("EPR").Range("F" & nz)) = "EGAL" then
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 14h42   #7
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut re

bonjour jfontaine

j'ai essayer ton code comme tu l'a donné et visiblement les variables

n'etait pas pris en compte comme elle devait l'etre
d'ou le
Code :
lareponse = CompareNombre(Range("A1"), Range("A2"))
a la place de ta version

en ayant le type de variable dans la fonction et non dans l'appel a la fonction

au plaisir
__________________
mes fichiers dans les contributions:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 14h56   #8
Invité de passage
 
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 1
Points : 1
Il me sort une "incompatibilté de type" sur la ligne suivante:
Code :
For i = 1 To Len(rg1.Value)
Je crois comprendre que cela arrive lorsque je n'ai pas de chiffre dans ma chaîne de caractère ou que la cellule est vide.
Sinon je crois que ça marche sans problème.
Ca mérite une condition supplémentaire c'est ça? Vous avez une piste?
nimiquel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 15h14   #9
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Citation:
Ca mérite une condition supplémentaire c'est ça?
Dans le cas une cellule vide on aura
D'ou un problème car le pas d'avancement d'une boucle For est + 1

Ajoutes un test de contrôle que tes cellules sont bien pleines
Ce test peut être ajouté à la fonction
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 17h08   #10
Membre habitué
 
Avatar de issoram
 
Homme Zeco
Développeur informatique
Inscription : janvier 2009
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Zeco
Localisation : France, Saône et Loire (Bourgogne)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2009
Messages : 219
Points : 121
Points : 121
Envoyer un message via MSN à issoram
Tu peux utiliser aussi la fonction val et t'inspirer de la partie "Extraire toutes les valeurs numériques (entiers et décimales) contenues dans une chaîne" de ce tutoriel sur la manipulation des chaines de caractères: http://silkyroad.developpez.com/VBA/...racteres/#LI-P

Cordialement.
issoram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 18h08   #11
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

La fonction de Jérôme marche très bien, une variante avec "Instr" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
Function CompareNombre(rg1 As Range, rg2 As Range) As String
 
    Dim Lng1 As Long
    Dim Lng2 As Long
 
    Dim i As Integer
 
    For i = 1 To Len(rg1.Value)
        If InStr("0123456789", (Mid(rg1.Value, i, 1))) <> 0 Then Lng1 = Lng1 & Mid(rg1.Value, i, 1)
    Next i
 
    For i = 1 To Len(rg2.Value)
        If InStr("0123456789", (Mid(rg2.Value, i, 1))) <> 0 Then Lng2 = Lng2 & Mid(rg2.Value, i, 1)
    Next i
 
    CompareNombre = IIf(Lng1 = Lng2, "EGAL", "PAS EGAL")
 
End Function
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 19h15   #12
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour un tous
Une autre proposition utilisant les expressions régulières (Nécessite l'activation de la référence VBScript Regular Expressions 5.5)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
'Nécessite l'activation de la référence VBScript Regular Expressions 5.5
Function Comp(ByVal MotA As String, ByVal MotB) As Boolean
Dim Reg As New VBScript_RegExp_55.RegExp
 
With Reg
    .Pattern = "\D"
    .Global = True
    MotA = .Replace(MotA, "")
    MotB = .Replace(MotB, "")
End With
Set Reg = Nothing
Comp = MotA = MotB
End Function
La fonction Comp retourne True si MotA et MotB contiennent le même nombre après élimination de tous les autres caractères.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/09/2011, 16h38   #13
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut re

bonjour

pour mercatog

waouahh!! ca c'est du costaud je garde!!!
__________________
mes fichiers dans les contributions:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h01   #14
Invité de passage
 
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 1
Points : 1
Je viens d'essayer la méthode de Theze (et de Jérome) et ça marche mieux mais pas lorsqu'une des cellules est vide.
Pour la méthode de mercatog, je crois tout simplement que je n'ai pas la possibilité d'activer VBScript_RegExp_55.RegExp ... dommage!
Mais merci pour tout.
nimiquel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h06   #15
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Citation:
Je viens d'essayer la méthode de Theze (et de Jérome) et ça marche mieux mais pas lorsqu'une des cellules est vide.
Adapte le code pour prendre en compte ce cas.
Soit dans la fonction, soit avant l'appel de la fonction
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 13h06   #16
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour
Pour ne pas activer la référence, la même fonction
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Function Comp(ByVal MotA As String, ByVal MotB) As Boolean
Dim Reg As Object
 
Set Reg = CreateObject("vbscript.regexp")
With Reg
    .Pattern = "\D"
    .Global = True
    MotA = .Replace(MotA, "")
    MotB = .Replace(MotB, "")
End With
Set Reg = Nothing
Comp = MotA = MotB
End Function
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 13h23   #17
Invité de passage
 
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 1
Points : 1
Salut Mercatog,

Comment intégrer ta fonction dans ma macro ?
Je suppose que c'est du genre:
mais je ne vois pas ce que la fonction renvoie.

Merci
nimiquel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 13h31   #18
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Relis plus haut
Citation:
La fonction Comp retourne True si MotA et MotB contiennent le même nombre après élimination de tous les autres caractères.
Type
Code :
1
2
3
4
5
6
7
8
Dim Str1 as string, Str2 as string
Str1="élém2_ 36 B 5"
Str2="2AB3_vg65Mta"
If Comp(Str1,Str2) Then
   Msgbox "Même nombres contenus dans les 2 chaînes"
else
   Msgbox "Nombres contenus sont différents"
end if
Remarque, Si les 2 chaines ne contiennent pas de chiffres ou l'une ne contient pas de chiffres et l'autre vide alors Comp est aussi true
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 13h31   #19
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut re

bonjour mercatog

purrée ci avec ca il ne s'en sort pas !

une question, a quoi sert le "\D" .moi vouloir apprendre

au plaisir
__________________
mes fichiers dans les contributions:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 13h38   #20
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour Patrick
Plutôt je donnerai un lien intéressant: Les Expressions Rationnelles appliquées en VBA Access Par Charles A
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h48.


 
 
 
 
Partenaires

Hébergement Web