C/c d'une plage vers une feuille en fc d'argument
Bonjour à tous,
C'est donc mon premier post, la première fois que malgré des heures de recherche sur différents forums je n'arrive pas à résoudre mon problème.
Pour expliciter le problème :
J'ai un fichier excel qui comporte X onglets dont un comportant des données et les autres servant à analyser ces données.
J'aimerais à l'aide d'une fonction ou d'une procédure (j'ai du mal à déterminer ce que je dois utiliser) copier une partie des données de mon onglet de données à un de mes onglets d'analyse et ceci en fonction de l'adresse de 2 cellules que je lui passe par argument.
Pour expliciter tout ca :
J'aimerais copier les valeurs de l'onglet data, de la plage de cellule BB220 à BB229 (Ce sont les arguments) dans l'onglet analyse à partir de la cellule A23
Sachant que j'essaye depuis quelques jours à l'aide d'une fonction et que je n'y arrive pas voici l'idée
Function data(Y_deb As Range, Y_fin As Range)
Sheets("Data_post_essai"). Activate
Range(Y_deb, Y_fin). Select
Selection.Copy
Sheets("MesureULAB").Select
Range("A23").Select
ActiveSheet.Paste
data = "j'ai copié"
End FunctionJ'ai aussi essayé ca d'après d'autres forums
Function data(Y_deb As Range, Y_fin As Range)
With Sheets("Data_post_essai")
.Range(Y_deb, Y_fin).Copy _
Sheets("MesureULAB").Range("A23")
End With
End FunctionLa cellule ou j'entre la formule est renvois alors #valeur! et rien n'est copié coller.
Merci d'avance si quelqu'un arrive à résoudre mon problème
Informatiquement votre,
Laura
essaye ce code : je passe en paramètres les numéros de lignes et de colonnes des cellules de début et de fin de plage
Function data(ligne_deb As Long, col_debut As Long, ligne_fin As Long, col_fin As Long)
Sheets("feuil1").Activate
Range(Cells(ligne_deb, col_debut), Cells(ligne_fin, col_fin)).Select
Selection.Copy
Sheets("feuil2").Select
Range("A23").Select
ActiveSheet.Paste
End Function
Public Sub test()
Call data(3, 5, 6, 8)
End Sub
Bonjour,
Des définitions à assimiler !
Une procédure Function est destinée à renvoyer un résultat, c'est ce qui la différencie d'une procédure Sub. Dans ton cas tu écris une fonction que tu utilises en fait comme Sub...
Pour coder correctement, on évite d'imiter l'enregistreur et de coller des Select partout !
Pour travailler efficacement en VBA on apprend à ne pas appeler copier-coller n'importe quel transfert de valeurs, et à éviter de copier puis coller quand ce n'est pas nécessaire. Les méthodes Copy et Paste implique un transfert de données par le presse-papier de Windows. Si l'on ne transite pas par le presse-papier, il n'y a pas copier-coller et on gagne en efficacité.
Au cas particulier :
Sub data(Y_deb As Range, Y_fin As Range)
Dim Plg
Plg = Sheets("Data_post_essai").Range(Y_deb, Y_fin)
Sheets("MesureULAB").Range("A23").Resize(UBound(Plg)).Value = Plg
data = "c'est fait !"
End SubCette procédure doit assurer le job et signaler que c'est fait !
La cellule ou j'entre la formule est renvois alors #valeur! et rien n'est copié coller.
Ça c'est dans le cas où tu veux une fonction utilisable en feuille de calcul (ne revenons pas sur le copier-coller....)
Alors :
Function data(Y_deb As Range, Y_fin As Range)
data = Sheets("Data_post_essai").Range(Y_deb, Y_fin)
End FunctionCeci fonctionnera, à la condition de sélectionner le nombre de cellules nécessaire au transfert, taper la fonction avec ses arguments et valider par Ctrl+Maj+Entrée (car ton résultat est une matrice de valeurs !)
Cordialement.
edit : Dans tous les cas, tes arguments étant de type Range, ils doivent être passés sous forme d'objets Range !
Merci à vous deux,
Je préfère la solution de MFerrand, mais je n'arrive pas à la faire fonctionner
J'ai créer ceci
Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Dim Y_deb, Y_fin As Range
Dim cell As Cells
Y_deb = BB220
Y_fin = BB289
cell = A23
MsgBox prompt:="je suis ici"
' Réaction aux hyperliens
Select Case Target.Range.Cells(1).Value
'
Case "Analyser Data"
' Import de la feuille de données
Call data(Y_deb, Y_fin, cell)
Case Else
MsgBox Title:="Commande non implémentée", prompt:="Aucune action n'est associée à l'hyperlien dans la cellule " & Target.Range.Address
End Select
End Sub
Sub data(Y_deb As Range, Y_fin As Range, cell As Cells)
Dim Plg
Plg = Sheets("Data_post_essai").Range(Y_deb, Y_fin)
Sheets("MesureULAB").Range("cell").Resize(UBound(Plg)).Value = Plg
MsgBox prompt:="c'est fait !"
End Subqui ne marche pas, aucun des 2 msgBox ne s'active quand je clique sur mon hyper lien (qui pointe sur lui même)
Pour le 2ème bout de code, n'y a t'il pas moyen de faire selectionner le bon nombre de case directement par la macro ? car il change en fonction des fichiers
Houlala ! Tu inventes un syntaxe au fur et à mesure !!!
Dim Y_deb, Y_fin As RangeLes variables se typent individuellement, Y_deb n'est donc pas typée ! La typer Range, explicitement.
Dim cell As CellsCells n'est pas un type d'objet ! cell est à typer Range !
Y_deb = BB220
Y_fin = BB289
cell = A23??? L'affectation d'une référence d'objet à une variable doit toujours utiliser l'instruction Set !
Et d'autre part, BB220, BB289 ou A23 seront interprétées comme des variables non déclarées, non initialisées et donc vides !
Set Y_deb = Worksheets("nomFeuille...").Range("BB220")Voilà une façon d'affecter une variable Range (en précisant le nom de la feuille).
MsgBox prompt:="je suis ici"Pourquoi donc ça ?
Select Case Target.Range.Cells(1).ValueLe Cells(1) est superflu, même si cela n'empêchera pas de fonctionner...
Si ton hyperlien fonctionne comme tu l'attends, la procédure lancée devient :
Sub data(Y_deb As Range, Y_fin As Range, cell As Range)
Dim Plg
Plg = Sheets("Data_post_essai").Range(Y_deb, Y_fin)
cell.Resize(UBound(Plg)).Value = Plg
MsgBox prompt:="c'est fait !"
End Subcell est en effet un objet Range, pas une donnée String (et de toute façon il s'agit d'une variable : un nom de variable ne s'utilise jamais entre guillemets, en mettant des guillemets on indique un mot et non plus le contenu de la variable ainsi nommée...)
Cordialement.
Désolée :O, j'ai pas vraiment appris VBA dans les règles de l'art je pense,
Si je suis tous tes conseils j'obtiens donc ce code, qui devrait fonctionner :
Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Dim Y_deb As Range, Y_fin As Range, cell As Range
Set Y_deb = Worksheets("Data_post_essai").Range("BB220")
Set Y_fin = Worksheets("Data_post_essai").Range("BB289")
Set cell = Worksheets("MesureULAB").Range("A23")
MsgBox prompt:="je suis ici"
' Réaction aux hyperliens
Select Case Target.Range.Cells(1).Value
'
Case "Analyser Data"
' Import de la feuille de données
Call data(Y_deb, Y_fin, cell)
Case Else
MsgBox Title:="Commande non implémentée", prompt:="Aucune action n'est associée à l'hyperlien dans la cellule " & Target.Range.Address
End Select
End Sub
Sub data(Y_deb As Range, Y_fin As Range, cell As Range)
Dim Plg
Plg = Sheets("Data_post_essai").Range(Y_deb, Y_fin)
cell.Resize(UBound(Plg)).Value = Plg
MsgBox prompt:="c'est fait !"
End SubEst tu certain de ca " Les variables se typent individuellement, Y_deb n'est donc pas typée ! La typer Range, explicitement." car j'ai toujours fait de cette manière et ca a toujours bien fonctionner "
L'hyperlien n'a pas l'air de marcher o/
Je deviens folle
Est tu certain de ca " Les variables se typent individuellement, Y_deb n'est donc pas typée ! La typer Range, explicitement." car j'ai toujours fait de cette manière et ca a toujours bien fonctionner "
Absolument !
Au cas particulier, comme tu appelles une procédure en utilisant cette variable, tu aurais une erreur "ByRef incompatible", car l'argument de la proc. est déclaré Range et tu le lui passe au moyen d'une variable qui n'est pas exactement du même type...
Pour ton lien, pas d'avis ! Mais tu devrais placer ton MsgBox dans le Case "analyser data", cela te permettrait de t'assurer que tu passes par là... !
Cordialement.
Mes hyperlink ne marche plus ^^ aucun de ceux que j'avais fait et qui marchait avant bon ...
Tu as deux fichiers... Il vaudrait mieux n'avoir que le bon d'ouvert (et l'autre ailleurs qu'à son emplacement initial pour éviter des interactions s'ils ont des éléments communs !)
Le fichier sur le quel je travail est celui du bas, ce que je ne comprend pas c'est pourquoi mes feuilles sont déconnecté sur leurs codes (on voit sur le fichier d'origine qu'il y a une seule feuille par feuille (et les hyper liens marchent alors que sur le 2nd fichier on a 2 objets par feuille par exemple la feuille 1 du premier fichier est composé de la feuille 12 et la feuille 2 dans le second mon code qui se trouve dans la feuille 1 se trouve dans la feuille 2 et la feuille originelle (feuille 12) ne contient plus rien.
Tu saurais pourquoi ?
Je n'avais pas fait attention à cette anomalie !
Mais c'est apparemment une anomalie, jamais vu une telle présentation ! ?
Ca m'arrive de temps en temps je repars sur des sauvegarde précédente mais la ca m’embête si quelqu'un sait comment revenir à la normal !
C'est arrivé suite à une erreur !
Sais-tu comment tu as fait pour aboutir à ça ! Car je ne saurais pas le reproduire...
C'est arrivé une fois quand j'ai lancé une macro et ensuite ca me le faisait sur chaque feuille que j'ouvrais, si je n'enregistre pas et que je ferme tout ca revenait à la normal!
Sauf que la je ne m'en suis pas rendu compte