XL 2010 [RESOLU] Fonction Replace inopérante avec "columns"

g.milano

XLDnaute Junior
Bonjour,

Je viens de rencontrer un problème avec la fonction Replace.

Si j'utilise "columns" (qui est bien pratique) comme ci-dessous, il n'y a aucun remplacement :

VB:
    For Each c In eBayCat.Columns("A")
        naiyou.Columns("F").Replace c.Value, c.Offset(0, 2).Value, xlPart
    Next c

Alors qu'en modifiant uniquement le premier "columns" par un range, ça fonctionne sans problèmes !

VB:
    For Each c In eBayCat.Range("A1:A" & eBayCat.Rows.Count)
        naiyou.Columns("F").Replace c.Value, c.Offset(0, 2).Value, xlPart
    Next c

Auriez-vous une explication ?? Je ne comprends pas pourquoi.

Merci.
 
Dernière édition:

Paf

XLDnaute Barbatruc
Bonjour g.milano, vgendron :),

En supposant que eBayCat est le CodeName d'une feuille, eBayCat.Columns renvoie toutes les colonnes de la feuille,
eBayCat.Columns("A") renvoie toutes les colonnes A, donc un seul élément.
La boucle For Each c In eBayCat.Columns("A") ne fera qu'un tour et c sera un range de la colonne entière. il n'y aura donc pas de c.value.
Mais, si ça pouvait fonctionner, on bouclerait de la ligne 1 à la ligne +/- 65000 ou +/- 1000000 (selon les versions d'Excel) que la cellule soit ou non renseignées.

C'est d'ailleurs le même cas avec For Each c In eBayCat.Range("A1:A" & eBayCat.Rows.Count)

Dans cette instruction, eBayCat.Range("A1:A" & eBayCat.Rows.Count) renvoie toutes les cellules de la plage , et donc c sera le range de chaque cellule.

A+
 

g.milano

XLDnaute Junior
Bonjour,

Merci pour vos premières interventions

Je constate que mes variables ne sont pas claires pour vous, désolé.

eBayCat est une range qui est constituée ainsi :
VB:
Set taiyaku = Workbooks.Open("C:\ebay\対訳表.xlsx")
Set eBayCat = taiyaku.Sheets("eBayCat番号").UsedRange

De plus, j'avais testé la validité des 2 ranges (eBayCat.Columns("A") et eBayCat.Range("A1:A" & eBayCat.Rows.Count)) en utilisant dans la boucle des commandes de coloration du style (Range.Interior.Color = RGB(200, 200, 200)).
Dans les 2 cas, c'est la bonne range qui est grisée (donc désignation ok, la range n'est pas vide, c'est le bon endroit toussa). Et comme je désigne la même range, le résultat devrait être le même non ? Hors, "columns" ne génère aucune modification ni erreur au demeurant. La macro passe et ne fait rien. Et avec range, ça marche !

J'ai joint mon fichier test, vous verrez qu'il n'y a que la différence columns/range dans la macro (regardez les 2 premiers onglets avant de lancer la macro qui est dans le 3eme).

Merci m(_ _)m
 

Pièces jointes

  • Test_Replace.xlsm
    24.5 KB · Affichages: 34

vgendron

XLDnaute Barbatruc
Hello

donc..as tu essayé ceci:
Code:
For Each c In eBayCat.Columns(1).Cells

le code complet avec les deux méthodes
Code:
Sub TestReplace()

    Dim eBayCat As Range
    Dim Col As Range
    Dim Plg As Range

    Set eBayCat = ActiveWorkbook().Sheets("Trad").UsedRange
    eBayCat.Interior.Color = RGB(150, 200, 250)

    'Colonne NOK
    Set Col = ActiveWorkbook().Sheets("ColNok").UsedRange.Columns("B")
    Col.Interior.Color = RGB(200, 100, 100)
    For Each c In eBayCat.Columns(1).Cells
        Col.Replace c.Value, c.Offset(0, 1).Value, xlPart
    Next c

    'Range OK
    Set Plg = ActiveWorkbook().Sheets("PlgOk").UsedRange.Columns("B")
    Plg.Interior.Color = RGB(100, 200, 100)
    For Each c In eBayCat.Range("A1:A" & eBayCat.Rows.Count)

        Plg.Replace c.Value, c.Offset(0, 1).Value, xlPart
    Next c

End Sub
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re

Pas sûr que vous ayez lu ma réponse, et encore moins sûr d'avoir été clair.

même si eBayCat = ActiveWorkbook().Sheets("Trad").UsedRange, donc l'ensemble des cellules utilisées,
eBayCat.Columns("A") représente l'"objet" colonne A de cette plage (que les pro corrigent cet éventuel abus de langage), mais pas les éléments qu'il contient.
On pourra utiliser les propriétés de cet objet par exemple : eBayCat.Columns("A").Interior.Color = RGB(150, 200, 250), qui va mettre la couleur sur l'ensemble de la colonne A (de la plage eBayCat).

si vous lancer ce code
Code:
  For Each c In eBayCat.Columns("A")
          MsgBox c.Address
  Next c
il n'y aura qu'un seul affichage (puisqu'il n'y a qu'un seul objet : la colonne A) de l'adresse de l'objet($A$1:$A$69)

Pour accéder aux élément de cet objet, il faut dire lesquels, et comme le précise vgendron , en utilisant .cells.

Code:
  For Each c In eBayCat.Columns("A").Cells
          MsgBox c.Address
  Next c
Affichera une par une l'adresse des cellules


A+
 

g.milano

XLDnaute Junior
Effectivement, ça marche :confused:
Merci et Bravo ! :)

Mais ce que je voudrais comprendre, c'est pourquoi ? Qu'est-ce qui fait qu'avec la fonction "each c" le "columns" seul ne marche pas et qu'on doivent lui claquer un ".cells" aux fesses o_O (et tout ça au lieu de faire un range).

Si quelqu'un avait une explication, ce serait super ;)
 

g.milano

XLDnaute Junior
Je viens de lire la nouvelle réponse de PAF qui est arrivée pendant que j’écrivais ma réponse (et je suis parti aussitôt désolé). J'avais lu votre première réponse, mais comme il y avait un doute (vous pensiez que ma range était une feuille), j'avoue ne pas avoir été très attentif au contenu ; mes excuses.
Votre exemple avec la msgbox est l'adresse est clair : columns renvoie un objet (et pas une range) qui est une plage complète et indivisible.

Merci pour votre réponse.
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
151
Réponses
12
Affichages
225
Réponses
7
Affichages
404

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG