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 Sub

Bonjour,

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 = Tablo

mais 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 Sub

S'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 Sub

Et 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

Rechercher des sujets similaires à "travail variable tableau"