Ranger, ranger, toujours ranger

Bonjour tout le monde,

petite question de théorie dont je ne trouve pas de réponse définitive, où que je me tourne...

Il y a souvent une c... dans le potage avec ces histoires de Range dynamiques!

Dernier cas en date : depuis une USF dans Feuil1, je calcule une plage dans Feuil : impec!

Quand je veux l'éliminer, pas moyen!

Il a fallu que j'active la Feuil3, éliminer avec le MÊME code et revenir sur Feuil1, vers la USF!

Quelqu'un peut me donner la clef de cette théorie?

        sRep = MsgBox("Vous êtes sur le point d'effacer " & sFlag & " de l'annuaire!" & Chr(10) & _
                    "Vous confirmez la suppression définitive ?", vbYesNo)
        If sRep = 6 Then
            Application.ScreenUpdating = False
            Worksheets("Feuil3").Activate
            Worksheets("Feuil3").Range(Cells(iFlag3, iFlag4), Cells(iFlag3, iFlag4 + 2)).Delete shift:=xlUp
            Worksheets("Feuil1").Activate
            Application.ScreenUpdating = True
        End If

Le même code SANS l'activation de Feuil3 me renvoie une erreur!

Merci de vos lumières!

Bonjour curulis57

Au lieu du code suivant:

Worksheets("Feuil3").Range(Cells(iFlag3, iFlag4), Cells(iFlag3, iFlag4 + 2)).Delete shift:=xlUp

Essai le code suivant:

Worksheets("Feuil3").Range(Worksheets("Feuil3").Cells(iFlag3, iFlag4), Worksheets("Feuil3").Cells(iFlag3, iFlag4 + 2)).Delete shift:=xlUp

(Et en supprimant l'activation de la feuille).

Dis moi si ça résout ton problème

Salut d3d9x,

oui, ça fonctionne super!

Mais, dis-moi, c'est une syntaxe obligatoire et officielle pour ces cas-là ou c'est une bidouille, géniale d'accord, mais une bidouille quand même à utiliser au cas par cas?

En tout cas, merci !

Je vais adapter ça à un autre DELETE de colonnes complètes dans cette même Feuil3 ou j'ai dû passer par une boucle FOR NEXT .Column(x).Delete pour que ça fonctionne...

A+

Pour moi c'est contextuel. Dans certains cas il ne semble pas nécessaire d'écrire cette syntaxe abominable, mais dans d'autres elle l'est. Te dire quand l'un suffit ou l'autre est nécessaire je n'ai qu'une hypothèse:

Lorsque la feuille active est la feuille sur laquelle tu veux travailler, ta syntaxe suffit. Par contre quand la feuille active n'est pas la feuille sur laquelle tu travailles, tu es obligé de préciser sur quelle feuilles les cellules sont.

Ainsi dans ta première syntaxe, tu demandes d'effacer de la feuil3 les cellules d'une autre feuille -> beug.

Pour simplifier ta syntaxte, essai d'écrire la chose suivante:

With Worksheets("Feuil3")
.Range(.Cells(iFlag3, iFlag4), .Cells(iFlag3, iFlag4 + 2)).Delete shift:=xlUp
End With

Ce qui devrait te permettre d'énormément simplifier les choses.

La différence entre "Feuil3.Range..." ou "With Feuil3... .Range..." est extrêmement subtile!

Je comprends mieux mes approximations et erreurs!

Sois-en remercié!

A+

attention tu te trompes sur l'utilisation du with je t'invite à rechercher sur internet comment il s'utilise. il n'indique pas du tout la feuille active mais permet de simplifier le code. ce qu'il faut retenir c'est que le "." sera executé comme si il etait ecrit worksheet(...)

Oui, j'avais déjà compris cela à propos de "With...".

La subtilité dont je parlais concernait "Feuil3. Range..." où je considérais que "Feuil3." suffisait à renseigner la suite comme faisant partie de "Feuil3" ! Ce qui, pour moi contre toute logique, n'est manifestement pas le cas!

Ou alors, il y a une autre subtilité qui m'échappe encore ?!?


Pour compléter ce que je développais, pourquoi ceci fonctionne-t-il ?

For x = 1 To 3
                Feuil3.Columns(Col).Delete shift:=xlToLeft
            Next
        End If

ou encore ceci ?

Feuil3.Cells(1, iFlag).Value = sFlag

ou encore ceci ?

iFlag1 = Feuil3.Cells(1, Col).End(xlDown).Row

Instructions et variables qui partent toutes de l'USF ?

Bonjour,

oui mais ton problème c'est pas les Range c'est les Cells qui comme les range représente un objet cellule ou plage de cellules et comme pour les range si tu ne précise pas la feuille c'est la feuille courante qui est utilisée ..

Salut Pierre,

merci d'aider à me sortir de mes grottes Exceliennes !

Essayons de dégager les principes!

Si j'écris : "Feuil3. Cells(1,6)...", ça roule !

Mais, si j'écris "Feuil3. Range( Cells(1,6), Cells(2,7))...", ça ne roule plus!

Dans le deuxième cas, cela voudrait dire que les Cells prises en compte dans . Range( Cells...) seraient issues de la Feuille active, dans ce cas-ci, Feuil1 -> bug !

C'est très subtil! Avoue!

Donc, pour ne plus m'énerver là-dessus, ce sera "With..."

Ai-je bien circonscrit le problème ?

Cela dit, ce sont des arrachages de cheveux que je préfère à bien d'autres!

A+

Sauf erreur de ma part, on programme orienté objet

Worksheet("Feuil1") est un objet de type Worksheet

Cet objet contient des sous-objets et des sous variables.

Lorsque tu écris

Worksheet("Feuil1").Range("A1")

tout est lié

Par contre lorsque tu écris:

Worksheet("Feuil1").Range(Cells(1,1))

Cells n'est pas issue de l'objet Worksheet("Feuil1"). Ne sachant pas d'où il est issu, Excel considère que c'est issu de la feuille active.

Mais en écrivant ceci:

Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(iFlag3, iFlag4), Worksheets("Feuil1").Cells(iFlag3, iFlag4 + 2))

Si on met de la couleur, la premiere partie est issue de l'objet Worksheets("Feuil1"), de même que la seconde partie, de même que la troisième!

Worksheets("Feuil1").Range(EXP1,EXP2)

EXP1 = Worksheets("Feuil1").Cells(iFlag3, iFlag4)

EXP1 = Worksheets("Feuil1").Cells(iFlag3, iFlag4)

Ok, d3d9x,

c'est ce que j'ai voulu (maladroitement, sans doute) exprimer!

Il me faudra encore quelque temps pour intégrer les frontières entre objets distincts...

20 ans de VB 6.0 sans trop se tracasser de ces ..."futilités" , la facture doit bien arriver un jour!

Merci à tous!

A+

Bonsoir tout le monde,

Grand merci à tous de m'avoir éclairé avec autant de patience et de pédagogie!

Il me reste à bien digérer la leçon!

A+

Rechercher des sujets similaires à "ranger"