Macro - Remplacer un caractère + un nombre (variable)
Bonjour à tous,
Je recherche le moyen de simplifier ce bout de macro:
Sub Macro1()
' Macro1 Macro
Columns("A:A").Select
Selection.Replace What:=".1", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:=".2", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:=".3", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:=".4", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End SubL'idée est de remplacer le caractère "." + un Nombre par rien "", j'ai essayer avec ce code
Sub Macro1()
' Macro1 Macro
Dim Nb As Byte
For Nb = 1 To 12
Columns("A:A").Select
Selection.Replace What:="Que faut-il mettre ici", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End Submais je ne trouve pas ce qu'il faut mettre à la place de "Que faut-il mettre ici", quelqu'un aurait une idée svp ?
J'ai cherché sur le forum mais je ne trouve rien en tapant "remplacer", "plusieurs éléments", "remplacer variable" ...
Merci d'avance pour votre aide et bonne journée ^^
Bonjour
Nb sans " autour
et ne pas oublier le Next
Mais 11 et 12 ne servent à rien car déjà enlevés par 1 et 2
Bonjour
Nb sans " autour
et ne pas oublier le Next
Mais 11 et 12 ne servent à rien car déjà enlevés par 1 et 2
Bonjour Chris,
Merci pour votre réponse mais cela ne fonctionne pas, en mettant Nb sans " cela remplace tous les chiffres de 1,2,3,4... hors j'ai besoin de supprimer uniquement les chiffres qui se trouve après le 2ème "." ainsi que celui-ci.
Exemple:
P/1.002.1
P/1.002.2
P/1.002.3
P/1.002.4
Les 4 valeurs doivent devenir P/1.002
Bonjour
a tester
Sub RecheDel()
Del = Array(".1", ".2", ".3", ".4", ".5", ".6")
For L = 2 To Cells(Rows.Count, 1).End(xlUp).Row
MaVar = Range("A" & L).Value
For Each A In Del
MaVar = Replace(MaVar, A, "")
Next A
Range("A" & L).Value = MaVar
Next
End SubA+
Maurice
Bonjour
a tester
Sub RecheDel() Del = Array(".1", ".2", ".3", ".4", ".5", ".6") For L = 2 To Cells(Rows.Count, 1).End(xlUp).Row MaVar = Range("A" & L).Value For Each A In Del MaVar = Replace(MaVar, A, "") Next A Range("A" & L).Value = MaVar Next End SubA+
Maurice
Bonjour Maurice,
Merci pour ce code, en effet cela fonctionne, pouvez-vous expliquer pas-à-pas votre code [j'aimerai ne pas juste faire un simple copier/coller et basta ... mais bien comprendre le code (que j'ai un peu compris)] Merci pour votre explication.
Par contre ici le code est bon à condition qu'on est que quelques nombres .1 / .2 / .3 ... Dans mon message de base je n'ai mis que 4 nombres parce que ceci est répétitif, le problème est que ces nombres vont de 1 jusqu'à 128 et cela peut évoluer dans le temps, du coup il faudrait à chaque fois mettre à jour le code...
Auriez-vous une autre méthode vis-à-vis des nombres ? Ou une modification pour intégrer une série de nombre allant de 1 à 500 ou plus ...
Mais déjà un grand merci pour ce bout de code ^^
Bonjour à tous
Oups j'avais zappé le point
Bonjour
si le 2eme point se trouve toujours en 8eme position
marco plus simple
Sub RecherRef()
For L = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Range("A" & L).Value = Left(Range("A" & L).Value, 7)
Next
End SubA+
Maurice
Bonjour à tous
Dans le cas contraire
Sub RecheDel()
Del = Array(".1", ".2", ".3", ".4", ".5", ".6", ".7", ".8", ".9")
For L = 2 To Cells(Rows.Count, 1).End(xlUp).Row
MaVar = Range("A" & L).Value
For Each A In Del
If InStr(MaVar, A) > 0 Then
MaVar2 = Mid(MaVar, InStr(MaVar, A), 10)
MaVar = Replace(MaVar, MaVar2, "")
Exit For
End If
Next A
Range("A" & L).Value = MaVar
Next
End SubBonjour
on peux jouer
a voir
Sub cherchePoint()
For Lg = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Mot = Range("A" & Lg)
L = Len(Mot)
For I = L To 1 Step -1
If Asc(Mid(Mot, I, 1)) = 46 Then
Range("A" & Lg).Value = Left(Range("A" & Lg).Value, I - 1)
Exit For
End If
Next
Next
End SubA+
Maurice
Re bonjour à tous,
Bonjour à tous
Dans le cas contraire
Sub RecheDel() Del = Array(".1", ".2", ".3", ".4", ".5", ".6", ".7", ".8", ".9") For L = 2 To Cells(Rows.Count, 1).End(xlUp).Row MaVar = Range("A" & L).Value For Each A In Del If InStr(MaVar, A) > 0 Then MaVar2 = Mid(MaVar, InStr(MaVar, A), 10) MaVar = Replace(MaVar, MaVar2, "") Exit For End If Next A Range("A" & L).Value = MaVar Next End Sub
Chris malheureusement ton code ne marche pas.
Bonjour
on peux jouer
a voir
Sub cherchePoint() For Lg = 2 To Cells(Rows.Count, 1).End(xlUp).Row Mot = Range("A" & Lg) L = Len(Mot) For I = L To 1 Step -1 If Asc(Mid(Mot, I, 1)) = 46 Then Range("A" & Lg).Value = Left(Range("A" & Lg).Value, I - 1) Exit For End If Next Next End SubA+
Maurice
Merci Maurice mais ce code marche mais lorsqu'on a par exemple "P/12.100" on va avoir un problème ...
En pièce jointe un exemple de ce que j'ai (colonne A), le résultat attendu avec les valeurs qui sont mise à jour avec la Macro en rouge (colonne D) et un contrôle si c'est bon (colonne E), un modèle (colonne I) pour recoller la base en colonne A après le test de la Macro.
Est-ce qu'on peut pas gérer cela avec la base que j'ai fait ? J'ai la possibilité de remplacer le "." par autre chose si besoin, n'hésitez pas à me proposer d'autres solutions ... je suis preneur de toutes explications/solutions ...
Merci à vous !
Bonjour
j'espère que tu a mis tout les cas
Sub cherchePoint()
ValACompter = "."
For Lg = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Mot = Range("A" & Lg)
MaVal = Mot
MonRes = Split(MaVal, ValACompter)
If UBound(MonRes) = 1 Then Mot = MaVal & "."
L = Len(Mot)
For I = L To 1 Step -1
If Asc(Mid(Mot, I, 1)) = 46 Then
Range("B" & Lg).Value = Left(Range("A" & Lg).Value, I - 1)
Exit For
End If
Next
Next
End SubA+
Maurice
bonsoir,
une autre proposition
Sub aargh()
delim = "."
colres = "B" 'colonne résultat
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
s = Cells(i, 1)
k = 0
For j = 1 To Len(s)
If Mid(s, j, 1) = delim Then
k = k + 1
If k = 2 Then s = Left(s, j - 1): Exit For
End If
Next j
Cells(i, colres) = s
Next i
End SubBonjour,
Merci pour votre aide.
A+
Bonjour à tous,
Je ré-ouvre le sujet car je dois réaliser une modification suite à un rajout d'un caractère et d'un nouveau besoin.
Dans le fichier joint, colonne A ce que j'ai à la base, colonne C ce que j'aimerais avoir après activation de la Macro en colonne A.
En faite, je cherche à faire une macro avec plusieurs condition, j'ai commencer avec ce code:
Dim Nb_LigneB As Long
Nb_LigneB = Range("B65536").End(xlUp).Row
Dim Plage_donnee As Long
For Plage_donnee = 2 To Nb_LigneB
If Cells(Plage_donnee, 3).Value Like "*,*" Then
Cells(Plage_donnee, 9).FormulaR1C1 = "Ok"
End If
Next Plage_donnee
End SubAvec ce code j'arrive à identifier les cellules avec une virgule, et pour le moment je met "OK" dans la 9ème colonne.
Je cherche à remplacer en vain:
Cells(Plage_donnee, 9).FormulaR1C1 = "Ok"Par une formule du style:
Range("C4").AutoFill Destination:=Range("C4:C5"), Type:=xlFillDefaultAu final j'aimerais plusieurs conditions:
- Si la cellule contient "000" ou "129" je ne fais rien
- Si la cellule contient un point je copie la cellule précédente
- Si la cellule contient une virgule j'étire la cellule du dessus d'une case
J'ai aussi essayer avec For ... each, mais le problème reste le même, je n'arrive pas à lui dire de sélectionner la cellule précédente et ...
Voilà j'espère que ma demande est claire ... désolé si c'est pas le cas.
Bonjour,
une proposition
Sub aargh()
oa = Split("p/00.000", ".")
With Sheets("feuil1")
dl = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To dl
t = .Cells(i, 1)
If i > 2 Then t1 = .Cells(i - 1, 3)
If InStr(t, "000") > 0 Or InStr(t, "129") Then
.Cells(i, 3) = t
Else
a = Split(t, ".")
oa = Split(t1, ".")
If UBound(a) = 1 Then
If a(0) = oa(0) Then a(1) = oa(1) + 1 Else a(1) = 0
Else
If a(0) = oa(0) Then a(1) = oa(1) Else a(1) = 0
End If
.Cells(i, 3) = a(0) & "." & Format(a(1), "000")
End If
Next i
End With
End Sub
Bonjour,
Merci pour ton code h2so4, j'ai l'option Explicit du coup que faut-il déclarer comme variable ?
Peux-tu expliquer ton code ?
Merci
Faut-il déclarer les variables comme ceci:
Dim oa() As String, a As String
Dim i As Integer, t As Integer, t1 As Integerbonjour,
voici le code adapté et commenté
Option Explicit
Sub aargh()
Dim oa As Variant, a As Variant ' variable tableau qui contiendra une découpe de la base en utilisant le point comme séparateur, oa valeur ligne précédente, a valeur ligne actuelle
Dim t As String, t1 As String 't et t1 contiennent la valeur de la base pour la ligne actuelle et la ligne précédente
Dim dl As Long, i As Long 'dl dernière ligne, i pointeur de ligne en cours/ligne actuelle
t1 = "p/00.000" 'première valeur de t1
With Sheets("feuil1") 'selection obglet
dl = .Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne
For i = 2 To dl 'on parcourt les lignes
t = .Cells(i, 1) 't =base ligne actuelle
If i > 2 Then t1 = .Cells(i - 1, 3) ' t1=ligne précédente, si elle existe
If InStr(t, "000") > 0 Or InStr(t, "129") Then 'base contient 000 ou 129 ?
.Cells(i, 3) = t 'nouvelle base = base de la ligne actuelle
Else
a = Split(t, ".") 'découpe de la base actuelle
oa = Split(t1, ".") 'découpe de la base précédente
If UBound(a) = 1 Then ' si 2 éléments on a trouvé un seul point
If a(0) = oa(0) Then a(1) = oa(1) + 1 Else a(1) = 0 ' si premier élément de la base actuelle = premier élement de la base précédente on ajoute 1 à la séquence sinon séquence=0
Else
If a(0) = oa(0) Then a(1) = oa(1) Else a(1) = 0 ' on a trouvé plus d'un point, si le premier élément de la base actuelle = premier élément de la base précédente on copie la séquence actuelle=séquence précédente sinon séquence=0
End If
.Cells(i, 3) = a(0) & "." & Format(a(1), "000") 'on met la nouvelle base actuelle en colonne 3
End If
Next i
End With
End Sub
Bonjour à tous,
h2so4, j'espère que tu vas bien car j'ai besoin de toi encore une fois ^^
Peux-tu modifier ta macro en la simplifiant un peu ? En faite avec le temps je me rend compte que j'aurais besoin de la simplifier car je n'utilise pas à 100% l'une des 2 fonctions que tu m'as créer, celle-ci "Si la cellule contient un point je copie la cellule précédente", en faite si la cellule contient un "." après la base qui est "p/00.000" je la laisse tel quel et je ne fait rien (mais il faut garder l'incrémentation si besoin).
J'ai bien essayé de la faire moi-même mais je ne trouve pas comment y arriver ... Un vrai noob !
Je t'ai remis ce que j'aimerais dans le fichier joint
Merci pour ton aide !