Travail en variable tableau
Bonsoir,
Je cherche à modifier la valeur de cellules situées dans plusieurs colonnes.
Pour accélérer le traitement, je souhaite effectuer ceci par le biais de variable tableau, mais c'est là que mes problèmes commencent !
Le fichier joint et le code ci-dessous seront plus parlant que des explications détaillées.
Je vous remercie d'avance pour le temps passer à m'aider et pour vos conseils.
Bien cordialement,
Dan
Option Explicit
'Recherche le nom d'un champ puis sélectionne sa colonne et effectue le traitement
Sub Correction_Champs()
Dim i As Long, j As Integer
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String
Dim Ligne As Long
Dim CelDep As String, CelArv As String
Dim Col As Integer
Dim ColT As String
Dim vCol(2) As String
Dim Tablo As Variant
Dim Cell As Variant
Dim LigneArv As Long
Sheets("Donnees").Select
vCol(0) = "ColA"
vCol(1) = "ColB"
vCol(2) = "ColC"
Valeur_Cherchee = vCol(i)
Set PlageDeRecherche = Rows(1)
Set Trouve = PlageDeRecherche.Cells.Find(What:=Valeur_Cherchee, LookAt:=xlWhole)
If Not Trouve Is Nothing Then
CelDep = Trouve.Offset(1, 0).Address
Col = Range(CelDep).Column
ColT = Split(Columns(Col).Address(ColumnAbsolute:=False), ":")(1)
CelArv = Range(ColT & Rows.Count).End(xlUp).Rows.Address
LigneArv = Split(CelArv, "$")(2)
'Range(CelDep & ":" & CelArv).Select
End If
For Ligne = 2 To LigneArv
For Col = 1 To 3
'C'est à partir d'ici que ça se complique
'les données ne sont pas prises en compte dans la variable tableau
Tablo(Ligne, Col) = Range(Ligne, Col).Value
If Tablo(Ligne, Col) = "Te" Then
Tablo(Ligne, Col) = "Terrain"
End If
If Tablo(Ligne, Col) = "In" Then
Tablo(Ligne, Col) = "Inventaire"
End If
If Tablo(Ligne, Col) = "Do" Then
Tablo(Ligne, Col) = "Domaine"
End If
Next Col
Next Ligne
'Recoller la colonne modifiée au même emplacement
End SubBonjour,
Fournir le classeur kivabien avec.
A+
Bonjour à tous,
sur le principe, il faut que tu lises toute ta plage en une fois si tu veux gagner du temps, idem pour l'écriture :
Tablo = Range(Ligne, Col).Resize(LigneArv, 3).Value
For Ligne = 2 To LigneArv
For Col = 1 To 3
If Tablo(Ligne, Col) = "Te" Then
Tablo(Ligne, Col) = "Terrain"
End If
If Tablo(Ligne, Col) = "In" Then
Tablo(Ligne, Col) = "Inventaire"
End If
If Tablo(Ligne, Col) = "Do" Then
Tablo(Ligne, Col) = "Domaine"
End If
Next Col
Next Ligne
Range(Ligne, Col).Resize(LigneArv, 3).Value = Tablomais vu ton code tu aurais tout avantage à faire un Remplacer je pense.
eric
Bonjour,
Mes excuses pour l'oubli de la pièce jointe.
Merci pour ta proposition Eriiic. Effectivement, l'idée d'utiliser le remplacer est peut-être la plus simple et pas si longue que ça en durée.
Je vais quand même avoir des tableaux avec quelques milliers de lignes et un nombre de champs à modifier conséquents. Dans certains cas, il peut y avoir jusqu'à 13 valeurs différentes à modifier pour une colonne.
J'ajoute quand même le fichier en précisant que les colonnes à traiter ne sont pas contigües (ce qui n'était pas le cas dans la version d'hier soir que j'ai voulu trop simplifier).
Cette modification va influer sur le mode de sélection et sur la boucle de traitement.
J'ai remplacé mon code par le tien. Il reste un problème que je n'ai pas résolu sur la ligne Tablo = Range(Ligne, Col).Resize(LigneArv, DerCol).Value
Ligne n'est pas connu (normal car pas déclaré en amont), mais je n'ai pas compris comment faire.
En tout cas, un gros merci déjà pour les réponses apportées.
Bien cordialement,
Dan
Bonjour,
Dans cette situation l'utilisation d'Array ne me semble pas pertinente.
Une macro de ce style devrait suffire :
Sub Macro1()
With Range("A1").CurrentRegion
.Replace What:="Te", Replacement:="Terrain", LookAt:=xlWhole
.Replace What:="Do", Replacement:="Domaine", LookAt:=xlWhole
.Replace What:="In", Replacement:="Inventaire", LookAt:=xlWhole
End With
End SubS'il y a effectivement des colonnes vides modifier comme suit :
Sub Macro2()
Dim i&, ii&
For i = 1 To Cells(Columns.Count).End(xlToLeft).Column
ii = IIf(Cells(Rows.Count, i).End(xlUp).Row > ii, Cells(Rows.Count, i).End(xlUp).Row, ii)
Next
With Range(Cells(2, 1), Cells(ii, i))
.Replace What:="Te", Replacement:="Terrain", LookAt:=xlWhole
.Replace What:="Do", Replacement:="Domaine", LookAt:=xlWhole
.Replace What:="In", Replacement:="Inventaire", LookAt:=xlWhole
End With
End SubEt si tu tiens absolument à passer par un Array tu peux le définir de la manière suivante :
Dim i&, ii&,k&, Arr
For k = 1 To Cells(Columns.Count).End(xlToLeft).Column
ii = IIf(Cells(Rows.Count, k).End(xlUp).Row > ii, Cells(Rows.Count, i).End(xlUp).Row, ii)
Next
Arr = Range(Cells(1, 1), Cells(ii, k)).Value
For i = 2 to Ubound(Arr)
'...A+
Bonjour…
Et avec un tableau structuré* (nommé ici TB) défini à partir de la plage :
Private Sub R()
Dim P As Range
Set P = Union([TB].Columns(1), [TB].Columns(3), [TB].Columns(6), [TB].Columns(7))
P.Replace "te", "Terrain"
P.Replace "in", "Inventaire"
P.Replace "do", "Domaine"
End Sub* à utiliser autant que faire ce peut
Bonjour et MERCI pour vos propositions qui fonctionnent vraiment super bien !
Mais... comme malheureusement rien n'est simple en ce bas monde, je suis tout de même forcé de passer par une recherche de champs et donc dans l'impossibilité de sélectionner le tableau tout entier, car je vais avoir des colonnes qui comporteront des nombres et en fonction du nom (et donc de la fonction) de cette colonne, ces nombre devront être remplacés par des valeurs complètement différentes :
Pour le champ Referencement :
1 → Géoréférencement
2 → Ratchmt. géographique
Pour le champ versionME :
1 → Rapportage 2010
2 → V. interne 2013
Pour le champ Observation :
1 → Vu
2 → Entendu
En fonction du nom de champ, il faudra donc que j'ajoute ces conditions (qui peuvent aller jusqu'à 30 choix pour certains champs).
C'est d'ailleurs pour cette raison que je souhaitais passer par une variable tableau, mais le remplacement direct me semble très efficace.
Désolé, mais en cherchant à simplifier pour être plus clair, j'ai en fait compliqué les choses, même si vos réponses me font avancer dans ma réflexion.
Je rajoute pour ex. quelques colonnes avec les champs comme indiqués ci-dessus pour faciliter la compréhension et à partir de la col O les résultats attendus (le résultat du traitement doit rester dans les colonnes d'origine).
En tout cas, merci encore pour votre implication,votre maitrise d'Excel et votre goût du partage de la connaissance.
Bon am,
Dan
Moi je n'utiliserai un Array que sur les colonnes à remplacements complexes.
Pour les autres "replace" me semble préférable.
Option Explicit
Sub Macro3()
Dim k&, iLC%, iLR&, iR&, Arr, vC&
Application.ScreenUpdating = False
iLC = Cells(Columns.Count).End(xlToLeft).Column
For k = 1 To iLC
iLR = IIf(Cells(Rows.Count, k).End(xlUp).Row > iLR, Cells(Rows.Count, k).End(xlUp).Row, iLR)
Next
With Range(Cells(1, 1), Cells(iLR, iLC))
.Replace What:="Te", Replacement:="Terrain", LookAt:=xlWhole
.Replace What:="Do", Replacement:="Domaine", LookAt:=xlWhole
.Replace What:="In", Replacement:="Inventaire", LookAt:=xlWhole
End With
For k = 1 To iLC
If Cells(1, k) = "Referencement" Then
With Range(Cells(1, k), Cells(iLR, k))
.Replace What:=1, Replacement:="Géoréférencement", LookAt:=xlWhole
.Replace What:=2, Replacement:="Ratchmt. géographique", LookAt:=xlWhole
End With
End If
Next
For k = 1 To iLC
If Cells(1, k) = "VersionME" Then
With Range(Cells(1, k), Cells(iLR, k))
.Replace What:=1, Replacement:="Rapportage 2010", LookAt:=xlWhole
.Replace What:=2, Replacement:="V. interne 2013", LookAt:=xlWhole
End With
End If
Next
For k = 1 To iLC
If Cells(1, k) = "Observation" Then
With Range(Cells(1, k), Cells(iLR, k))
.Replace What:=1, Replacement:="Vu", LookAt:=xlWhole
.Replace What:=2, Replacement:="Entendu", LookAt:=xlWhole
End With
End If
Next
'pour les colonnes à remplacements multiples
For k = 1 To iLC
If Cells(1, k) = "TaColonneSpecialRemplacementsMultiples" Then
Arr = Range(Cells(1, k), Cells(iLR, k)).Value
For iR = 2 To iLR
vC = Arr(iR, 1)
Arr(iR, 1) = SpecReplace(vC)
Next
Range(Cells(1, k), Cells(iLR, k)) = Arr
End If
Next
End Sub
Function SpecReplace(i&)
Select Case i
Case 1: SpecReplace = "bla"
Case 2: SpecReplace = "blabla"
Case 3: SpecReplace = "blablabla"
Case 4: SpecReplace = "blablablabla"
Case 5: SpecReplace = "blablblablabla"
End Select
End Function
A+
Bonjour à tous,
Merci Galopin01 pour la réflexion le travail et le partage ! C'est exactement ce qu'il me fallait.
Merci aussi à Eriiic et Ordonc qui ont proposé des solutions très intéressantes.
Je marque cette demande comme résolue.
Au plaisir
Bonne journée
Dan
Re-bonjour,
J'ai encore un petit point qui m'embête. Pour les remplacements multiples, ça fonctionne bien tant que la colonne en question contient des nombres, par contre elle peut aussi contenir des lettres ou parties de mots et dans ce cas, il y a une erreur d'incompatibilité de type (erreur d'exécution 13).
Je suppose que ça doit être une bricole ?
J'ai essayé de modifier le type de variable vC& en variant, mais je ne dois pas avoir bien compris l'erreur, car ce n'est pas ça.
Bonne journée,
Dan