La méthode "Range" de l'objet _Worksheet a échoué

vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012 - 14 sept. 2012 à 17:06
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012 - 14 sept. 2012 à 20:35
Bonjour à tous,

Je code actuellement en VBA et mon problème est le suivant:
Je dois parcourir presque toutes les feuilles de mon classeur pour copier des données dans chacune de ses feuilles dans une feuille nommée "Data". Le truc c'est que toutes les feuilles ne sont pas identiques, j'ai donc stocké dans une autre feuille, les cases de début et de fin de sélection pour la copie, dans Data (2). Je stocke ces valeurs dans deux chaines, temp1 et temp2.
Mon probleme vient de la ligne "Sh.Range(temp4).Copy
en effet quand je lance la macro, message d'erreur cf. titre du message.

Pour info, j'ai essayé un Sh.Activate, avant la Copy.
Jai essayé avec Sh.Range(Cells(blabla,blabla),Cells(blabla,blabla)).Copy (en récupérant le numéro de la ligne avec la fonction Mid et en stockant cela dans un string (ici blabla)
Toujours un message d'erreur.
J'ai bien déclaré mes Sh as Worksheet et tous les temp et les indices utilisés. rien n'y fait.
J'insiste sur le fait que c'est bien à la ligne Sh.Range(temp4).Copy que l'erreur apparait toujours.
Pouvez vous m'aider??

Merci d'avance

PS: Voila la partie de mon code que ca concerne.

For Each Sh In Worksheets
For i = 6 To k - 1
If Sh.Name = Sheets("Data (2)").Cells(i, 2).Value Then

temp1 = Sheets("Data (2)").Cells(i, 3).Value
temp2 = Sheets("Data (2)").Cells(i, 6).Value
temp4 = temp1 & temp3 & temp2
temp4 = """" & temp4 & """"

Sh.Range(temp4).Copy
Sheets("Data").Cells(a, 3).PasteSpecial Paste:=xlPasteValues

Do While Not (IsEmpty(Cells(a, 2)))
a = a + 1
Loop
End If
Next
Next Sh

7 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 sept. 2012 à 17:26
Bonjour,
Etrange manière de "travailler ainsi par tremplins" !!!!
Mais surtout :

temp1 = Sheets("Data (2)").Cells(i, 3).Value
temp2 = Sheets("Data (2)").Cells(i, 6).Value
temp4 = temp1 & temp3 & temp2
temp4 = """" & temp4 & """"


est super-étonnant !
Sans compter que temp3 = "" !!!

Je veux te laisser réfléchir à ce que tu fais !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
14 sept. 2012 à 17:32
Ah oui zut j'ai oublié de mettre que temp3 = ":"
Ca reste tout à fait étonnant. Le truc c'est que je n'arrivais pas à faire comprendre que je voulais les deux-points dans le String avec une simple concaténation du coup je suis passé par temp3, temp2 et temp1. Le faire en une seule fois faisait apparaitre des erreurs.

En tout cas je suis certain que temp4 vaut qqchose du genre "E278:D453" (avec les guillemets) puisque je le print sur une cellule de ma feuille et ca me l'affiche bien.

J'ai procédé de la sorte parce que au départ dans ma feuille Data (2) j'ai des valeurs du style E278 D456 etc.. qui sont stockés, donc je voulais réutiliser directement la valeur de la cellule.

Le truc c'est que meme si je récupère uniquement le "278" du "E278" (sans les guillemets) pour utiliser Cells,Cells dans Range, ca ne fonctionne toujours pas.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 sept. 2012 à 17:41
Il s'agit d'un STRING !
tes """" sont donc à enlever !
Cela n'ote absolument rtien à ce que je t'ai dit plus haut :
Etrange manière de "travailler ainsi par tremplins" !!!!

Tu ferais mieux de nous exposer les tenants et aboutissants (pas ta méthode). Il est fort vraisemblable que nous serons alors nombreux à te guider vers quelque chose de plus "orthodoxe"
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
14 sept. 2012 à 17:55
Oui tu as surement raison. Je t'expose alors clairement ma situation.
J'ai plein de feuilles dans lesquelles je dois récupérer plusieurs plages de données, mais qui ne sont pas exactement au meme endroit dans chaque feuille.
Ces différentes plages de données (largeur de deux colonnes à chaque fois) je dois les stocker dans une feuille nommée Data.
Dans la feuille Data (2) est stockée le début et la fin de chaque plage à selectionner. Pour etre clair, j'ai pour chaque ligne:
- le nom de la feuille
- la case du début de selection pour chaque plage (ex: C278)
- la case de fin de selection pour chaque plage (ex: D531)

Je dois donc d'abord vérifier si la feuille en cours (dans le For Each sh in WorkSheets) est l'une des feuilles qui m'interessent (et non pas d'autres comme Data ou Data (2) par exemple). Ca fonctionne bien ca.

Je dois mettre les données recoltées les unes à la suite des autres dans Data. c'est pour ca que j'avais mis une Do While not isempty(gnagnagna) Loop à faire avant de changer de Sh pour inscrire les donnée suivantes à la suite et non pas par dessus. je compte le nombre de lignes avant chaque passage à une autre feuille en gros. et je redemarre à la bonne ligne.

Mon probleme est bien la sélection de la zone à copier dans chaque feuille.
Je suis dans une feuille Sh (dans la boucle For Each). Je voudrais aller chercher dans data 2 les cases de début et de fin de sélection qui m'interessent.
En gros je veux:" la feuille Sh.Name = CeNom, alors va dans data (2) pour voir quelle plage de valeurs tu dois sélectionner, et ensuite tu copies cette plage et tu me la colles dans Data dans les deux colonnes correspondantes. ensuite on passe à la feuille suivante on fait pareil, en faisant attention de coller la nouvelle plage apres la suivante et pas par dessus."

Voila, je sais pas si c'est clair. Je suis plutot très novice en VBA et je sais pas m'en sortir.

Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 sept. 2012 à 19:10
Bien embrouillé, tout cela !
Je te suggère de commencer par nommer les plages qui t'intéressent, plutôt que d'aller chercher sur une feuille leurs adresses.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 sept. 2012 à 19:15
Salut

Merci d'utiliser la coloration syntaxique la prochaine fois (3ème icone à droite) = plus facile à relire et conserve l'indentation du code (espaces devant chaque ligne)

Ton code initial :
For Each Sh In Worksheets
    For i = 6 To k - 1
        If Sh.Name = Sheets("Data (2)").Cells(i, 2).Value Then
            temp1 = Sheets("Data (2)").Cells(i, 3).Value
            temp2 = Sheets("Data (2)").Cells(i, 6).Value
            temp4 = temp1 & temp3 & temp2
            temp4 = """" & temp4 & """"
            Sh.Range(temp4).Copy
            Sheets("Data").Cells(a, 3).PasteSpecial Paste:=xlPasteValues
            ' Recherche prochaine ligne vide (je suppose)
            Do While Not (IsEmpty(Cells(a, 2)))
                a = a + 1
            Loop
        End If
    Next
Next Sh
On y voit plus clair.

Pour te répondre :
If Sh.Name = Sheets("Data (2)").Cells(i, 2).Value Then
    Sh.Range(CStr(Sheets("Data (2)").Cells(i, 3).Value) & _
             ":" & _
             CStr(Sheets("Data (2)").Cells(i, 6).Value)).Copy
    Sheets("Data").Cells(a, 3).PasteSpecial Paste:=xlPasteValues
    ' Recherche prochaine ligne vide (je suppose)
    Do While Not (IsEmpty(Cells(a, 2)))
        a = a + 1
    Loop
End If

Il faut éviter le recourt aux Select et autre Copy/Paste.
Dans ton cas, cela supposerait de définir le Range de destination de la même taille que le Range de sélection, ce qui compliquerait les choses.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
vichoo90 Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 14 septembre 2012
14 sept. 2012 à 20:35
Merci beaucoup pour votre aide. A l'avenir jessaierai d'ameliorer la clarté de mes post
Je vais essayer ce que tu m'as dit.

Bonne soirée
0
Rejoignez-nous