OVH Cloud OVH Cloud

Acces a un autre onglet par une fonction VBA

5 réponses
Avatar
CB
Bonjour,

J'ai un probleme sur lequel je bute depuis des heures.

Je souhaite ecrire une fonction abcd dans un premier onglet A, qui doit acceder
a des donnees qui sont dans un autre onglet B.
Je commence par recopier ces donnees dans une variable tableau, pour travailler
directement avec cette variable.

Cela donne le code suivant qui ne fonctionne pas :

Function abcd(ppp As Integer) As Integer
'Selectionner dans l'onglet B toute la plage de cellules
Sheets(2).Select
valeurs = Range(Cells(2, 1), Cells(Range("A65356").End(xlUp).Row, 11)).Value
'Mes traitements ici
abcd = resultat_de_mes_traitements
End Function

L'instruction sheets(2).select ne fait rien, alors que dans une procedure, elle
fonctionne.
Est-ce une limitation inherente aux fonctions, et si oui, existe-t-il un moyen
de l'eviter ?

Faire une seule instruction :
Valeurs = Sheets(2).Range(Cells(2, 1), Cells(Range("A65356").End(xlUp).Row,
11)).Value

Ne donne rien ou plante : erreur 1004.

J'ai (mal ?) lu les faq et (mal ?) epluche google, mais sans succes.

Merci.

--
Ce message a ete poste via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/

5 réponses

Avatar
Pascal Engelmajer
Salut,
Sheets(2).Select
valeurs = Range(Cells(2, 1), Cells(Range("A65356").End(xlUp).Row,
11)).Value

remplacé avntageusement par
valeurs = Sheets(2).Range(Cells(2, 1),
Cells(Range("A65356").End(xlUp).Row, 11)).Value


--
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel
"CB" a écrit dans le message de news:


Bonjour,

J'ai un probleme sur lequel je bute depuis des heures.

Je souhaite ecrire une fonction abcd dans un premier onglet A, qui doit
acceder

a des donnees qui sont dans un autre onglet B.
Je commence par recopier ces donnees dans une variable tableau, pour
travailler

directement avec cette variable.

Cela donne le code suivant qui ne fonctionne pas :

Function abcd(ppp As Integer) As Integer
'Selectionner dans l'onglet B toute la plage de cellules
Sheets(2).Select
valeurs = Range(Cells(2, 1), Cells(Range("A65356").End(xlUp).Row,
11)).Value

'Mes traitements ici
abcd = resultat_de_mes_traitements
End Function

L'instruction sheets(2).select ne fait rien, alors que dans une procedure,
elle

fonctionne.
Est-ce une limitation inherente aux fonctions, et si oui, existe-t-il un
moyen

de l'eviter ?

Faire une seule instruction :
Valeurs = Sheets(2).Range(Cells(2, 1),
Cells(Range("A65356").End(xlUp).Row,

11)).Value

Ne donne rien ou plante : erreur 1004.

J'ai (mal ?) lu les faq et (mal ?) epluche google, mais sans succes.

Merci.

--
Ce message a ete poste via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/


Avatar
CB
Merci pour votre reponse.
J'ai deja teste cette solution, sans succes (voir le bas de mon premier message).


Meme dans les procedures (Sub...End Sub) cela ne marche pas (excel 2000), sauf
en activant d'abord l'onglet.

J'ai l'impression que les fonctions VBA (function...end function) ne peuvent pas
manipuler les onglets s'ils ne sont pas ceux ou elles sont situees.

Est-ce exact ?

Merci.
--
Ce message a ete poste via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/
Avatar
CB
Bon, je me reponds a moi meme :
Voila comment faire :
Function aaa(a As Range)
valeurs = a.Resize(a.End(xlDown), a.End(xlToRight)).Value
End Function

--
Ce message a ete poste via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/
Avatar
Pascal Engelmajer
Salut,
on sait pas trop la réponses à quoi !!!
car
Function b()
Dim i As Integer, j As Integer
Dim valeurs
Dim bb As String
'======================================================== Sheets(2).Select
valeurs = Range(Cells(2, 1), Cells(Range("A65356").End(xlUp).Row,
11)).Value
'======================================================== For i = 1 To UBound(valeurs)
For j = 1 To UBound(valeurs, 2)
bb = bb & valeurs(i, j) & "/"
Next j, i
b = bb
End Function


Sub bid()
MsgBox b()
End Sub
fonctionne parfaitement
--
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel
"CB" a écrit dans le message de news:


Bon, je me reponds a moi meme :
Voila comment faire :
Function aaa(a As Range)
valeurs = a.Resize(a.End(xlDown), a.End(xlToRight)).Value
End Function

--
Ce message a ete poste via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/


Avatar
xx
Bonjour,

La difficulté que je rencontrais était d'écrire une fonction VBA pouvant
être appelée à travailler sur un onglet quelconque.
Bien que l'exemple ci-dessous fonctionne, l'onglet est imposé [sheets(2)].
Pour généraliser à toutes les situation possibles, j'avais d'abord tenté de
passer en paramètre (de type string) à la fonction le nom de l'onglet, ce
qui était source d'erreurs 1004 dans le meilleur des cas, ou alors
l'instruction
sheet(parametre).Resize(a.End(xlDown), a.End(xlToRight)).Value
était purement et simplement ignorée dans le pire des cas.

La solution qui fonctionne est de passer un paramètre de type range :
Function aaa(a As Range)
valeurs = a.Resize(a.End(xlDown), a.End(xlToRight)).Value
End Function
Cette fonction aaa peut ainsi être appelée depuis l'onglet Feuil1, en A1,


par exemple, avec comme paramètre Feuil2!F3.

Le Resize utilisé dans ce test n'est pas l'objet de la difficulté, c'est
juste une facilité pour m'éviter de sélectionner l'intégralité des
(immenses) zones sur lesquelles travaille la fonction.

Merci de vos réponses.

Le même exemple
"Pascal Engelmajer" a écrit dans le
message de news:
Salut,
on sait pas trop la réponses à quoi !!!
car
Function b()
Dim i As Integer, j As Integer
Dim valeurs
Dim bb As String
'======================================================== > Sheets(2).Select
valeurs = Range(Cells(2, 1), Cells(Range("A65356").End(xlUp).Row,
11)).Value
'======================================================== > For i = 1 To UBound(valeurs)
For j = 1 To UBound(valeurs, 2)
bb = bb & valeurs(i, j) & "/"
Next j, i
b = bb
End Function


Sub bid()
MsgBox b()
End Sub
fonctionne parfaitement
--
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel
"CB" a écrit dans le message de news:


Bon, je me reponds a moi meme :
Voila comment faire :
Function aaa(a As Range)
valeurs = a.Resize(a.End(xlDown), a.End(xlToRight)).Value
End Function

--
Ce message a ete poste via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/