Fonction vba incompréhensible pour un nouveau!!!!

yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006 - 25 mars 2006 à 12:57
yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006 - 28 mars 2006 à 20:05
Bonjour à tous
Je ne connais rien ( ou presque ) en vba et je dois programmer une fonction vba qui est essentielle pour moi:
on m'a donné comme cahier des charges: connaissant les données L1 C1 L2 C2 comme arguments de ma fonction ( plage?) je dois renvoyer l'adresse de la plage de cellule L1C1: L2C2 qui puisse être utilisé dans la feuille excel avec la fonction NB.VIDe par exemple. En fait je dois utiliser des formules du style NB.VIDE(plage(cellule("contenu";D2)cellule("contenu";D3);cellule("contenu";E2);cellule("contenu";E3)))
Je n'y arrive pas aidez moi svp
Un grand merci d'avance si quelqu'un peut m'aider!!!!!!!

13 réponses

michelxld Messages postés 402 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 12 octobre 2008 30
25 mars 2006 à 13:50
bonjour

ta demande n'est pas tres claire ,mais tu peux essayer une procedure de ce type

Dim L1 As Integer, L2 As Integer, C1 As Integer, C2 As Integer


L1 = 1
L2 = 10
C1 = 1
C2 = 5


MsgBox Application.WorksheetFunction.CountBlank(Range(Cells(L1, C1), Cells(L2, C2)))

bon apres midi
michel
0
yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006
25 mars 2006 à 17:15
On m'a souvent dit que je n'étais pas clair !!!
J'ai commencé à faire une fonction vba en commencant comme ca:

Sub Main()
tempC = Application.InputBox(prompt:= "", Type:=2)
tempN = Application.InputBox(prompt:= "", Type:=2)
tempM = Application.InputBox(prompt:= "", Type:=2)
End Sub

Function plage(tempC, tempN, tempM) As Range

plage = Range(Cells(tempN, tempC), Cells(tempM, tempC)).Address

End Function

Ayant environ 3000 calculs à faire sur des plages différentes et des feuilles différentes je voulais que ma fonction plage me renvoie l'adresse du type K15:K41 afin que je puisse la combiner avec des fonctions du type moyenne/ NB.VIDE/ NB.SI etc...

J'espère avoir gagné en clarté pour une fois mais quelque chose me dit que c'est po le cas!
Si quelqu'un peut m'aider à résoudre mon pb merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
0
michelxld Messages postés 402 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 12 octobre 2008 30
25 mars 2006 à 18:37
bonsoir

tu peux essayer

Sub Main()
Dim tempC As Integer, tempN As Integer, tempM As Integer
tempC = Application.InputBox(prompt:="Indiquez le Numero de colonne", Type:=2)
tempN = Application.InputBox(prompt:="Indiquez le numero de la 1ere ligne", Type:=2)
tempM = Application.InputBox(prompt:="Indiquez le numero de la derniere ligne", Type:=2)


MsgBox Plage(tempC, tempN, tempM)
End Sub


Function Plage(tempC, tempN, tempM) As String
Plage = Range(Cells(tempN, tempC), Cells(tempM, tempC)).Address
End Function

bonne soiree
michel
0
michelxld Messages postés 402 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 12 octobre 2008 30
25 mars 2006 à 18:39
rebonsoir

une autre possibilité en sélectionnant directement la plage de cellules

Sub Main()
Dim X As Variant
Set X = Application.InputBox("Selectionnez une plage de cellules", Type:=8)


MsgBox X.Address
End Sub

bonne soiree
michel
0

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

Posez votre question
yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006
25 mars 2006 à 19:04
Merci pour l'info je vais essayer dans la soirée et je te tiens au courant
merci encore!!!!
0
yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006
25 mars 2006 à 19:51
Je viens d'essayer mais elle ne donne pas tout à fait ce que je voulais mais ca avance!
Je m'explique: lorsque je lance plage(11;15;41) elle me renvoie bien $K$15:$K$41 mais lorsque je l'imbrique avec une autre fonction ( NB.VIDE(plage(11;15;41)) par exemple), il me reponds #VALEURS
Que faut-il faire pour arranger cela
Encore merci!

PS: j'ai testé la première solution
0
michelxld Messages postés 402 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 12 octobre 2008 30
25 mars 2006 à 20:46
bonsoir

je me semble que tu essayes de recéer la fonction que je t'ai proposé dans mon 1er message ...

Sub Main()
Dim tempC As Integer, tempN As Integer, tempM As Integer
tempC = Application.InputBox(prompt:="Indiquez le Numero de colonne", Type:=2)
tempN = Application.InputBox(prompt:="Indiquez le numero de la 1ere ligne", Type:=2)
tempM = Application.InputBox(prompt:="Indiquez le numero de la derniere ligne", Type:=2)


MsgBox _
Application.WorksheetFunction.CountBlank(Range(Plage(tempC, tempN, tempM)))


End Sub


Function Plage(tempC, tempN, tempM) As String
Plage = Range(Cells(tempN, tempC), Cells(tempM, tempC)).Address
End Function

bonne soiree
michel
0
yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006
26 mars 2006 à 09:54
Merci pour cette fonction
Est ce qu'il est possible, au lieu d'en afficher le résultat, de l'affecter à une cellule. En fait, si je comprends bien, lorsque la fonction renvoie l'addresse $L$15:$L$41, c'est une addresse acceptée par vba mais qui n'est pas reconnue comme une plage de cellule quand on l'utilise dans la feuille excel: est-il possible de transformer l'addresse string pour l'utiliser directement dans les fonctions sous la feuille excel?

bon dimanche
Yoyo
0
michelxld Messages postés 402 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 12 octobre 2008 30
26 mars 2006 à 11:17
bonjour

pour afficher le résultat dans la cellule A1 , remplace la ligne

MsgBox _
Application.WorksheetFunction.CountBlank(Range(Plage(tempC, tempN, tempM)))

par


Range("A1") = _
Application.WorksheetFunction.CountBlank(Range(Plage(tempC, tempN, tempM)))

mais je doute que cela réponde à ta demande ,car j'ai beaucoup de mal à comprendre ce que tu veux réaliser , nottament cette phrase :
"est-il possible de transformer l'addresse string pour l'utiliser directement dans les fonctions sous la feuille excel"

bonne journée
michel
0
yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006
26 mars 2006 à 11:43
Bonjour

Effectivement j'ai du mal à me faire comprendre et je te remercie sincerement de continuer à essayer de me depanner. Je ne sais pas si c'est possible mais j'aimerais t'envoyer une partie du fichier afin que tu puisses mieux comprendre ce que je dois faire. Le seul pb est que je ne sais pas comment te faire parvenir ces informations

Merci encore
Yoyo
0
yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006
28 mars 2006 à 18:49
Bonjour à tous

A defaut de pouvoir faire parvenir le fichier entier, voici un des tableaux que je dois remplir ( il y en a 10 par feuille et il y a 15 feuilles )

<COLGROUP>
<COL style=\"WIDTH: 60pt\" span=14 width=80>

----

,
,
A1,
A2,
A,
B1,
B2,
B,
----

J = 0,
nbre ind,
moy ou %,
nbre ind,
moy ou %,
nbre ind,
moy ou %,
nbre ind,
moy ou %,
nbre ind,
moy ou %,
nbre ind,
moy ou %,
----

,
=D6-K117,
=NB.SI(plage(11;CELLULE("contenu";D2);CELLULE("contenu";D3));"1")/D124*100,
=D7-K118,
=NB.SI(plage(11;CELLULE("contenu";D4);CELLULE("contenu";D5));"1")/F124*100,
#VALEUR!,
=NB.SI(plage(11;CELLULE("contenu";D2);CELLULE("contenu";D5));"1")/H124*100,
=H6-K119,
=NB.SI(plage(11;CELLULE("contenu";H2);CELLULE("contenu";H3));"1")/J124*100,
=H7-K120,
=NB.SI(plage(11;CELLULE("contenu";H4);CELLULE("contenu";H5));"1")/L124*100,
=J124+L124,
=NB.SI(plage(11;CELLULE("contenu";H2);CELLULE("contenu";H5));"1")/N124*100,
----

,
#NOM?,
=MOYENNE(plage(12;CELLULE("contenu";D2);CELLULE("contenu";D3))),
=D7-L118,
=MOYENNE(plage(12;CELLULE("contenu";D4);CELLULE("contenu";D5))),
=D125+F125,
=MOYENNE(plage(12;CELLULE("contenu";D2);CELLULE("contenu";D5))),
=H6-L119,
=MOYENNE(plage(12;CELLULE("contenu";H2);CELLULE("contenu";H3))),
=H7-L120,
=MOYENNE(plage(12;CELLULE("contenu";H4);CELLULE("contenu";H5))),
=J125+L125,
=MOYENNE(plage(12;CELLULE("contenu";H2);CELLULE("contenu";H5))),
----

,
=D6-M117,
=MOYENNE(plage(13;CELLULE("contenu";D2);CELLULE("contenu";D3))),
=D7-M118,
=MOYENNE(plage(13;CELLULE("contenu";D4);CELLULE("contenu";D5))),
=D126+F126,
=MOYENNE(plage(13;CELLULE("contenu";D2);CELLULE("contenu";D5))),
#NOM?,
=MOYENNE(plage(13;CELLULE("contenu";H2);CELLULE("contenu";H3))),
=H7-M120,
=MOYENNE(plage(13;CELLULE("contenu";H4);CELLULE("contenu";H5))),
=J126+L126,
=MOYENNE(plage(13;CELLULE("contenu";H2);CELLULE("contenu";H5))),
----

,
=D6-N117,
=MOYENNE(plage(14;CELLULE("contenu";D2);CELLULE("contenu";D3))),
=D7-N118,
=MOYENNE(plage(14;CELLULE("contenu";D4);CELLULE("contenu";D5))),
=D127+F127,
=MOYENNE(plage(14;CELLULE("contenu";D2);CELLULE("contenu";D5))),
=H6-N119,
=MOYENNE(plage(14;CELLULE("contenu";H2);CELLULE("contenu";H3))),
=H7-N120,
=MOYENNE(plage(14;CELLULE("contenu";H4);CELLULE("contenu";H5))),
=J127+L127,
=MOYENNE(plage(14;CELLULE("contenu";H2);CELLULE("contenu";H5))),
----

,
=D6-O117,
=MOYENNE(plage(15;CELLULE("contenu";D2);CELLULE("contenu";D3))),
=D7-O118,
=MOYENNE(plage(15;CELLULE("contenu";D4);CELLULE("contenu";D5))),
=D128+F128,
=MOYENNE(plage(15;CELLULE("contenu";D2);CELLULE("contenu";D5))),
=H6-O119,
=MOYENNE(plage(15;CELLULE("contenu";H2);CELLULE("contenu";H3))),
=H7-O120,
=MOYENNE(plage(15;CELLULE("contenu";H4);CELLULE("contenu";H5))),
=J128+L128,
=MOYENNE(plage(15;CELLULE("contenu";H2);CELLULE("contenu";H5))),
----

,
=D6-P117,
=NB.SI(plage(16;CELLULE("contenu";D2);CELLULE("contenu";D3));"1")/D129*100,
=D7-P118,
=NB.SI(plage(16;CELLULE("contenu";D4);CELLULE("contenu";D5));"1")/F129*100,
=D129+F129,
=NB.SI(plage(16;CELLULE("contenu";D2);CELLULE("contenu";D5));"1")/H129*100,
=H6-P119,
=NB.SI(plage(16;CELLULE("contenu";H2);CELLULE("contenu";H3));"1")/J129*100,
=H7-P120,
=NB.SI(plage(16;CELLULE("contenu";H4);CELLULE("contenu";H5));"1")/L129*100,
=J129+L129,
=NB.SI(plage(16;CELLULE("contenu";H2);CELLULE("contenu";H5));"1")/N129*100

Les cellules D2 D3 D4 et D5 contiennent les ligneqs de référence pour les plages A1 et A2 et bien sur celles ci varient à chaque feuille de calcul. La colonne H contient la mùeême chose pour les plages B1 B2
Comme vous le verrez plus haut, la fonction plage renvoie des adresses du style $L$15:$L$41 valable en vba mais pas pour excel. A ce propos existe t'il un type vba qui remplacerait "As range" par " as Xlrange" ou "XLaddress"
Pitié aideeeeezzzzzzz moiiiiiiiii

PS: encore merci à toi Michel pour ton aide
0
michelxld Messages postés 402 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 12 octobre 2008 30
28 mars 2006 à 19:59
bonsoir

tu insères cette fonction dans un module

Function NBVide_Plage(NumDebutLigne, NumFinLigne, NumColonne) As Integer
Dim Plage As Range


Set Plage = Range(Cells(NumDebutLigne, NumColonne), Cells(NumFinLigne, NumColonne))
NBVide_Plage = Application.WorksheetFunction.CountBlank(Plage)
End Function



ensuite dans une cellule , la formule

=NBVide_Plage(2;10;1)

2 correspond à la 1ere ligne de la plage à tester
10 est la derniere ligne de la plage
1 est le numero de colonne

si ce n'est pas ça , j'abandonne car je ne comprend rien à tes messages ...désolé ...

bonne soiree
michel
0
yoyohft Messages postés 8 Date d'inscription samedi 25 mars 2006 Statut Membre Dernière intervention 28 mars 2006
28 mars 2006 à 20:05
Merci pour toute l'aide que tu m'as apportée. Je pense que je vais me débrouiller avec cette fonction et essayer de l'adapter aux fonctions NB.SI ET MOYENNE
Desole de ne pas toujours etre clair ca n'est pas facile pour moi je n'y connais rien en vba!

Bonne soirée

Yoyo
0