Copie de valeur

lestards

XLDnaute Nouveau
bonjour

est ce que quelqu’un aurai une idée de ce qui cloche dans mon code

Code:
Sheets("GESTION DS COMPTES").Range(Cells(1, 2), Cells(29, 2)).Value = Sheets("PLAN RESEAU").Range(Cells(2, 3), Cells(30, 3)).Value

je me retrouve toujours avec une erreur 1004 erreur definie par l application ou par l objet

alors que si je met
Code:
Sheets("GESTION DS COMPTES").Range("b1:b29").Value = Sheets("PLAN RESEAU").Range("c2:c30").Value

la ça fonctionne

merci d avance !
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Copie de valeur

Bonsoir lestards,

Dans la première formule Cells(2, 3) et Cells(30, 3) font référence à des cellules de la feuille active (qui je suppose est "GESTION DS COMPTES").

Range(Cells(2, 3), Cells(30, 3)) fait donc référence à une plage de la feuille GESTION DS COMPTES. Plage qu'on applique à la feuille "PLAN RESEAU". Une même plage ne peut appartenir à deux feuilles différentes.

L'écriture suivante permet de s'assurer d'être sur la bonne feuille:
Sheets("GESTION DS COMPTES").Range(Cells(1, 2), Cells(29, 2)).Value = _
Range(Sheets("PLAN RESEAU").Cells(2, 3), Sheets("PLAN RESEAU").Cells(30, 3)).Value

Dans votre seconde formule, vous utilisez Sheets("PLAN RESEAU").Range("c2:c30").
Dans cette formulation, il n'y a pas de risque de confusion puisque le range est directement appliqué à la feuille "PLAN RESEAU".
 

lestards

XLDnaute Nouveau
Re : Copie de valeur

merci mapomme pour la solution a la première partie de cette intrigue en 2 etapes !!!

le but de cette macro étant de coller les valeurs de plan reseau vers gestion des comptes dans une colonne qui change en fonction des données

la valeur "var" est bien la bonne mais la macro ne s exécute pas
(toujours la même erreur affichée)


Code:
Sub INFO_COMPTE()

Dim var As String

var = Sheets("PLAN RESEAU").Range("b1").Value + 1

Range(Sheets("GESTION DS COMPTES").Cells(1, var), Sheets("GESTION DS COMPTES").Cells(29, var)).Value = _
Range(Sheets("PLAN RESEAU").Cells(2, 3), Sheets("PLAN RESEAU").Cells(30, 3)).Value

End Sub

merci par avance
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Copie de valeur

Bonjour lestards,

Que contient la cellule Sheets("PLAN RESEAU").Range("b1") ? Un nombre, une chaine de caractère ?

Si c'est un nombre, pourquoi déclarez vous cette variable VAR comme étant un string ?
Essayez : Dim var as long au lieu de Dim var As String

Pour l'exemple, un fichier (que vous auriez pu sympathiquement joindre :) à vos messages) qui comprend 3 macros pour la recopie:
La première ne recopie que si B1 contient un nombre représentant un numéro de colonne, la deuxième ne recopie que si B1 contient un texte représentant une référence de colonne, la troisième s'adapte aux deux cas précédents. Faites varier la valeur de B1, puis cliquez successivement sur chacun des trois boutons.

Le code:
VB:
Option Explicit

Sub INFO_COMPTE_numeric()
Dim Var As Long

Sheets("GESTION DS COMPTES").Cells.Clear
Var = Sheets("PLAN RESEAU").Range("b1") + 1

Range(Sheets("GESTION DS COMPTES").Cells(1, Var), Sheets("GESTION DS COMPTES").Cells(29, Var)).Value = _
Range(Sheets("PLAN RESEAU").Cells(2, 3), Sheets("PLAN RESEAU").Cells(30, 3)).Value
End Sub

Sub INFO_COMPTE_string()
Dim Var As String, Numcol As Long

Sheets("GESTION DS COMPTES").Cells.Clear
Var = Sheets("PLAN RESEAU").Range("b1")
Numcol = Range(Var & 1).Offset(0, 1).Column

Range(Sheets("GESTION DS COMPTES").Cells(1, Numcol), Sheets("GESTION DS COMPTES").Cells(29, Numcol)).Value = _
Range(Sheets("PLAN RESEAU").Cells(2, 3), Sheets("PLAN RESEAU").Cells(30, 3)).Value
End Sub

Sub INFO_COMPTE_numeric_ou_string()
Dim Var As Variant, Numcol As Long

Sheets("GESTION DS COMPTES").Cells.Clear
Var = Sheets("PLAN RESEAU").Range("b1").Value
If IsNumeric(Var) Then Numcol = Var + 1 Else Numcol = Range(Var & 1).Offset(0, 1).Column

Range(Sheets("GESTION DS COMPTES").Cells(1, Numcol), Sheets("GESTION DS COMPTES").Cells(29, Numcol)).Value = _
Range(Sheets("PLAN RESEAU").Cells(2, 3), Sheets("PLAN RESEAU").Cells(30, 3)).Value
End Sub

Nota: la ligne Sheets("GESTION DS COMPTES").Cells.Clear n'est là que pour l'exemple, il ne faut pas la conserver pour votre cas réel.
 

Pièces jointes

  • Copie de valeur v1.xlsm
    19.1 KB · Affichages: 33
Dernière édition:

lestards

XLDnaute Nouveau
Re : Copie de valeur

pour ce qui est de la valeur il sagit du numéro de colonne donc un chiffre

quand a la valeur string (je suis pas vraiment un pro ça vous avez pus vous en rendre compte :)) je pensais quelle désignai une valeur nombre ou texte indifféremment .

encore merci pour le temps consacré et promis la prochaine foi je joins un sympathique fichier ;)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Copie de valeur

re,

(...) quand a la valeur string (je suis pas vraiment un pro ça vous avez pus vous en rendre compte :)) je pensais quelle désignai une valeur nombre ou texte indifféremment (...)

Un string contient une chaine de caractères ou bien est vide. VBA est cependant assez souple avec les types et tente implicitement de faire des conversions.

Ainsi, on aurait pu écrire (b1 étant un nombre) en reprenant votre code:
VB:
Sub INFO_COMPTE_conversion_implicite()
Dim var As String

var = Sheets("PLAN RESEAU").Range("b1").Value + 1

Range(Sheets("GESTION DS COMPTES").Cells(1, 0 + var), Sheets("GESTION DS COMPTES").Cells(29, 0 + var)).Value = _
Range(Sheets("PLAN RESEAU").Cells(2, 3), Sheets("PLAN RESEAU").Cells(30, 3)).Value

End Sub

Dans l'expression de droite Sheets("PLAN RESEAU").Range("b1").Value + 1, VBA fait l'addition du nombre contenu dans B1 (disons 2) avec le nombre 1. Il trouve un nombre. Il va tenter d'affecter ce nombre à la variable string var. Il fait donc une conversion de nombre vers string -> var va donc contenir la chaine "3" et non le nombre 3.

Si on utilise ensuite var dans cells(1,var), VBA provoque une erreur. Or on sait que les expressions cells(1,3) et cells(1,"c") sont correctes. Cela supposerait qu'en interne, la fonction cells est implémentée avec une vérification des types de données car dans notre cas nous avons cells(1,var) = cells(1,"3") qui provoque une erreur. VBA semble considérer "3" est bien un string mais que le string "3" ne repésente pas une référence texte correcte pour une colonne.

En remplaçant cells(1,var) par Cells(1, 0 + var), on force VBA à faire une addition entre 0 et un string. Dans ce cas VBA tente de faire les conversions qui lui semble utiles. Il fait donc 0 +"3" -> 0 + 3 qui donne comme résultat le nombre 3 et non plus le string "3". Cells(1, 0 + var) devient donc Cells(1, 3) qui est correctement interprété.

Les conversions implicites sont un gain au niveau de l'écriture des codes mais peuvent aussi aboutir à des résultats inattendus.

(...) et promis la prochaine foi je joins un sympathique fichier (...)
Avec de jolies couleurs ? ;) ;)
 

Pièces jointes

  • Copie de valeur v2.xlsm
    17.6 KB · Affichages: 30
Dernière édition:

Discussions similaires

Réponses
2
Affichages
505

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 185
dernier inscrit
salhit