Probleme de copiage de chaine de caractere en vba
Résolu
Cedric_hess
Messages postés
30
Statut
Membre
-
pijaku Messages postés 13513 Statut Modérateur -
pijaku Messages postés 13513 Statut Modérateur -
Bonjour tout le monde ,
j'ai un code VBA qui fait la comparaison entre 4 colonnes et qui stock les resultats dans autres 3 colonnes , le code marche parfaitement quand j'ai fait des tset mais j'ai pas fait attention aux espaces alors maintenant quand le code stock les resultat qui sont des chaines de caracteres il copie pas tout le contenu de la cellule il copie jusqu'au premier espace et il s'arrete .
par exemple : si la chaine a copier est ''Air Approval always needed'' dans le resultat je trouve que ''Air'' est ce que il y a une solution pourque le code me copie la chaine entiere ? voici le code et le ficheir excel sur lequel je travail
voila le fichier excel : https://www.cjoint.com/c/FCEhZSO3Bev
et voila le code;
Merci a vous !
j'ai un code VBA qui fait la comparaison entre 4 colonnes et qui stock les resultats dans autres 3 colonnes , le code marche parfaitement quand j'ai fait des tset mais j'ai pas fait attention aux espaces alors maintenant quand le code stock les resultat qui sont des chaines de caracteres il copie pas tout le contenu de la cellule il copie jusqu'au premier espace et il s'arrete .
par exemple : si la chaine a copier est ''Air Approval always needed'' dans le resultat je trouve que ''Air'' est ce que il y a une solution pourque le code me copie la chaine entiere ? voici le code et le ficheir excel sur lequel je travail
voila le fichier excel : https://www.cjoint.com/c/FCEhZSO3Bev
et voila le code;
Sub comparer()
Dim Derlig As Long, Lig As Long, Ref As String
Dim T_ab, D_ab As Object, T_cd, D_cd As Object
Dim T_fgh, Cptr As Long, Separ
Dim start As Single
'--------------------initialisations
start = Timer
Application.ScreenUpdating = False
'nettoyage
Range("E2:G30000").Clear
'concaténation colonnes A & B
Set D_ab = CreateObject("scripting.dictionary")
Derlig = Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
T_ab = Range("A2:B" & Derlig)
For Lig = 1 To UBound(T_ab)
Ref = T_ab(Lig, 1) & " " & T_ab(Lig, 2)
If Not D_ab.exists(Ref) Then D_ab.Add Ref, ""
Next
T_ab = D_ab.keys
'concaténation colonnes C & D
Set D_cd = CreateObject("scripting.dictionary")
Derlig = Columns("C").Find(what:="*", searchdirection:=xlPrevious).Row
T_cd = Range("C2:D" & Derlig)
For Lig = 1 To UBound(T_cd)
Ref = T_cd(Lig, 1) & " " & T_cd(Lig, 2)
If Not D_cd.exists(Ref) Then D_cd.Add Ref, ""
Next
T_cd = D_cd.keys
'- -----------------comparaisons
ReDim T_fgh(3, 0) 'preparation tablo comparé
' DELETED_fonctionnalités
For Lig = 0 To UBound(T_ab)
If Not D_cd.exists(T_ab(Lig)) Then
Separ = Split(T_ab(Lig))
ReDim Preserve T_fgh(3, Cptr)
T_fgh(0, Cptr) = Separ(0)
T_fgh(1, Cptr) = Separ(1)
Cptr = Cptr + 1
End If
Next
'NEW_fonctionnalités
For Lig = 0 To UBound(T_cd)
If Not D_ab.exists(T_cd(Lig)) Then
Separ = Split(T_cd(Lig))
ReDim Preserve T_fgh(3, Cptr)
T_fgh(0, Cptr) = Separ(0)
T_fgh(2, Cptr) = Separ(1)
Cptr = Cptr + 1
End If
Next
'------------------restitution
Range("F2").Resize(Cptr, 3) = Application.Transpose(T_fgh)
Derlig = Range("E2:H100000").Find(what:="*", searchdirection:=xlPrevious).Row
Range("F2:H" & Derlig).Borders.Weight = xlThin
Application.ScreenUpdating = True
MsgBox "comparaison efffectuée en " & Timer - start & " secondes"
End Sub
Merci a vous !
A voir également:
- Probleme de copiage de chaine de caractere en vba
- Caractère ascii - Guide
- Caractère spéciaux - Guide
- Caractere speciaux - Guide
- Plus de chaine tv - Guide
- Caractere vide - Guide
1 réponse
Bonjour,
est ce que il y a une solution pourque le code me copie la chaine entiere ?
Le code "copie" bien la chaine entière. Le problème est ta façon de le concaténer puis de le splitter.
Si tu utilisais un caractère spécial comme séparateur de la concaténation, tu pourrais ensuite "splitter" ta chaîne en fonction de ce caractère, et pas en fonction des espaces.
Dans le code corrigé ci-dessous, j'utilises ¤ pour concaténer (au lieu de ton " ")
est ce que il y a une solution pourque le code me copie la chaine entiere ?
Le code "copie" bien la chaine entière. Le problème est ta façon de le concaténer puis de le splitter.
Si tu utilisais un caractère spécial comme séparateur de la concaténation, tu pourrais ensuite "splitter" ta chaîne en fonction de ce caractère, et pas en fonction des espaces.
Dans le code corrigé ci-dessous, j'utilises ¤ pour concaténer (au lieu de ton " ")
Ref = T_ab(Lig, 1) & "¤" & T_ab(Lig, 2). Comme ça, le split devient
Separ = Split(T_ab(Lig), "¤")et il me sépare la chaine comme il convient.
Option Explicit
Sub comparer()
Dim Derlig As Long, Lig As Long, Ref As String
Dim T_ab, D_ab As Object, T_cd, D_cd As Object
Dim T_fgh, Cptr As Long, Separ
Dim start As Single
'--------------------initialisations
start = Timer
Application.ScreenUpdating = False
'nettoyage
Range("E2:G30000").Clear
'concaténation colonnes A & B
Set D_ab = CreateObject("scripting.dictionary")
Derlig = Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
T_ab = Range("A2:B" & Derlig)
For Lig = 1 To UBound(T_ab)
Ref = T_ab(Lig, 1) & "¤" & T_ab(Lig, 2)
If Not D_ab.exists(Ref) Then D_ab.Add Ref, ""
Next
T_ab = D_ab.keys
'concaténation colonnes C & D
Set D_cd = CreateObject("scripting.dictionary")
Derlig = Columns("C").Find(what:="*", searchdirection:=xlPrevious).Row
T_cd = Range("C2:D" & Derlig)
For Lig = 1 To UBound(T_cd)
Ref = T_cd(Lig, 1) & "¤" & T_cd(Lig, 2)
If Not D_cd.exists(Ref) Then D_cd.Add Ref, ""
Next
T_cd = D_cd.keys
'- -----------------comparaisons
ReDim T_fgh(3, 0) 'preparation tablo comparé
' fonctionalités suppprimés
For Lig = 0 To UBound(T_ab)
If Not D_cd.exists(T_ab(Lig)) Then
Separ = Split(T_ab(Lig), "¤")
ReDim Preserve T_fgh(3, Cptr)
T_fgh(0, Cptr) = Separ(0)
T_fgh(1, Cptr) = Separ(1)
Cptr = Cptr + 1
End If
Next
'nouvelles fonctionalités
For Lig = 0 To UBound(T_cd)
If Not D_ab.exists(T_cd(Lig)) Then
Separ = Split(T_cd(Lig), "¤")
ReDim Preserve T_fgh(3, Cptr)
T_fgh(0, Cptr) = Separ(0)
T_fgh(2, Cptr) = Separ(1)
Cptr = Cptr + 1
End If
Next
'------------------restitution
Range("F2").Resize(Cptr, 3) = Application.Transpose(T_fgh)
Derlig = Range("E2:H100000").Find(what:="*", searchdirection:=xlPrevious).Row
Range("F2:H" & Derlig).Borders.Weight = xlThin
Application.ScreenUpdating = True
MsgBox "comparaison efffectuée en " & Timer - start & " secondes"
End Sub
A+