Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic [ Archives Visual Basic / J'AI BESOIN D'AIDE !!!! :) ] (Adoc5)

vendredi 25 juin 2004 à 15:32:47 | Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Adoc5

Bonjour tout le monde,

Je cherche à créer une fonction qui a pour paramètre d'entrée le nom de la colonne Excel.

La colonne choisi par l'utilisateur subira ensuite un traitement qq.

Comment pourrai-je coder ceci.

public function toto (row as ?) ????

Merci d'avance.


vendredi 25 juin 2004 à 15:38:04 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

ITALIA

Membre Club
A mon avis c plus une procedure qu'une Fonction


Public Sub TraitementExcel(ByVal MaColonne As integer)

End Sub

It@li@

vendredi 25 juin 2004 à 15:43:37 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Adoc5

Voila ce que j'ai écrit :

Public Sub lissage(ByVal Row As Integer)
Dim i As Integer
Dim Cellule As Range

Cellule.Row = Row
Cells(Cellule.Row, 1).Activate
While Not ActiveCells.Offset(Cellule.Row, 0).Value = ""
ActiveSheet.Cells(Row + 1, i) = (ActiveSheet.Cells(Row, i) + ActiveSheet.Cells(Row, i + 1)) / 2
i = i + 1
Wend
End Sub

En fait je fait une moyenne 2 à 2 des cellules de la colonne choisi par l'utilisateur. D'une part, je ne suis pas sûr de mon code et d'autre part, je ne sais pas quoi écrire dans Excel pour lancer cette fonction.

En conclusion je débute vraiment sur VB et je trime.


vendredi 25 juin 2004 à 16:29:44 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Mooiz

effectivement il y a quelques petites erreurs :

tout d'abord, il faut initialiser i (après les dim par exemple)
i = 1


Ensuite ta boucle est infinie :
ActiveCells.Offset(Cellule.Row, 0) ne change pas : si Cellule.Row vaut 1, alors ActiveCells.Offset(Cellule.Row, 0) sera toujours calé à A1. Il faut ajouter l'incrément :
while not ActiveCells.Offset(Cellule.Row, i)...

D'autre part, avec ce test de sortie, tu vas avoir un pb à la dernière itération : si la dernière valeur se trouve en A3, une fois arrivé à i=3 tu vas tester le contenu de ActiveCells.offset(cellule.row, 3), soit A3, qui va s'avérer non nul, donc tu vas calculer la moyenne entre A3 et A4, A4 etant nul -> ca n'a pas d'intérêt, donc je te conseillerais de tester :
while not ActiveCells.Offset(Cellule.Row, i+1).value=""

ou encore mieux :
while not ActiveCells.Offset(Cellule.Row, i+1).value="" and not ActiveCells.Offset(Cellule.Row, i).value=""

comme ca tu teste que les deux champs necessaires pour le calcul sont remplis

Enfin, si tu veux calculer les moyennes de A1 et A2, puis A2 et A3 (en supposant que tu aies choisi la colonne A) alors c'est bon. Mais si tu veux calculer la moyenne de A1 et A2, puis A3 et A4, dans ce cas la il faut remplacer i=i+1 par i=i+2

voila
Sinon un dernier petit truc (mais ca releve plus de l'esthetique qu'autre chose) : il faudrait uniformiser ta méthode d'accès aux cellules : dans le test de sortie de boucle tu utilises activecells.offset, et dans la boucle, tu passes par activesheet.cells. Ca ne pose pas de problème mais je pense que c'est plus compréhensible de tout faire de la même manière (soit l'un soit l'autre, je n'ai pas assez de conaissances pour dire quelle méthode et préférable). Mais je chipote ;-)

lundi 28 juin 2004 à 08:03:01 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Adoc5

ok, merci beaucoup.

Mais ensuite, dans Excel, comment je fait l'appel de cette fonction. Je me place par exemple dans une cellule de la colonne C et j'y écrit =lissage(1) ????

La question peut sembler un peu débile mais c'est la première fois que je programme une fonction en VBA...

Merci d'avance à celui ou à celle qui me répondra.

lundi 28 juin 2004 à 08:25:26 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Adoc5

Pour plus de précisions :

J'ai écrit ceci pour mon programme et à priori je pense que ça devrait marcher :

Option Explicit

Public Sub lissage(ByVal Row As Integer)
' Déclaration des variables
Dim i As Integer
Dim Cellule As Range
i = 1

Cellule.Row = Row
Cells(Cellule.Row, 1).Activate
While Not ActiveCells.Offset(Cellule.Row, i + 1).Value = "" And Not _
ActiveCells.Offset(Cellule.Row, i).Value = ""
ActiveSheet.Cells(Row + 1, i) = (ActiveSheet.Cells(Row, i) + ActiveSheet.Cells(Row, i + 1)) / 2
i = i + 2
Wend
End Sub

Mais comme je suis un débutant en VBA, je ne sais pas comment le tester. Je me suis placé au début de la colonne C, dans la première cellule et là, j'ai écrit : =lissage(2)
2 car je veux faire la moyenne sur la colonne B. Mais, losque j'écris ceci, dans la colonne C, en résultat, j'au un magnifique #Name?. HAAAAAAAAAA mon Dieu que faire ????

Si tu as une idée, n'hésite pas, car commencer comme ça un Lundi matin ça vous fait froid dans le dos... lol

@+ et bonne journée.


lundi 28 juin 2004 à 09:01:00 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Mooiz

Typiquement, une fonction en VBA s'appelle lors d'un evenement, par exemple clic sur un bouton. Il doit surement exister un moyen pour ajouter une fonction à la bibliothèque excel, mais je ne pense pas que ca passe par VBA.
Donc : effectivement ca ne marche pas comme ca. Le plus simple pour commencer, c'est de créer un bouton et de lancer ta procédure lorsque l'utilisateur va cliquer sur le bouton. Pour faire ca, c'est tout bete : après avoir crée le bouton, tu double clique dessus et ca t'écris la procédure qui gère l'évènement "clic sur le bouton" puis ca te positionne directement dedans. Et là tu peux faire appel à ta procedure lissage, par exemple lissage(1). Maintenant, si le clic sur un bouton ne te convient pas, il existe plein d'autres évènements (ouverture du document, ...), à toi de trouver celui qui te convient le mieux
Ensuite, si tu veux donner le choix à l'utilisateur de spécifier la colonne à traiter, tu peux commencer avec une boite de dialogue simple en appelant inputbox. Ca va t'ouvrir une boite de dialogue dans laquelle tu pourras donner la valeur de la colonne à traiter. Pour l'appel, tu écris quelque chose comme ca :

dim colonne as variant
colonne = inputbox("Colonne à traiter :")
lissage(colonne)

Note : j'ai mis colonne en variant car il me semble que inputbox renvoie une chaine de caractère, ce qui n'irait pas avec le paramètre de ta procédure. Plutot que de faire une conversion (et parce que je ne me souviens pas de la fonction qui fais ca !!!) je declare ma variable en variant, comme ca ca passe tout seul. Attention tout de même, avec cet exemple tu peux donner "A" comme valeur à colonne, et dans ce cas, l'appel à lissage(colonne) va effectuer le traitement sur la colonne qui a pour numéro le code ascii de la lettre "A". Donc ce code permet quelques dérives, à manipuler avec précaution.
Enfin, si une inputbox ne te suffit pas (c'est vrai que c'est moche) tu peux faire une fenêtre toi même, mais je te laisse découvrir

En esperant avoir répondu à tes questions

lundi 28 juin 2004 à 11:42:14 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Adoc5

non ça marche :

Option Explicit
Option Base 1
Public Function Lissage(col As Range)
' Déclaration des variables
' cells (ligne,colonne)
Dim i As Double, j As Double, rt, nRow As Double
On Error GoTo errFound
i = 1
While col.Cells(i, 1) <> ""
i = i + 1
Wend
nRow = i - 1
ReDim rt(1 To nRow, 1)
For i = 1 To nRow - 1
rt(i, 1) = (col(i, 1) + col(i + 1, 1)) / 2
Next
rt(nRow, 1) = col(nRow, 1)
Lissage = rt
Exit Function
errFound:
Lissage = Err.Description
End Function

c'est la fontion que j'ai faite.
Ensuite pour l'utiliser, tu créés une colonne A avec 10 chiffres par exemple, ensuite dans la colonne B tu vas sélectionner 10 cases, dans la partie fx tu écris lissage(la sélection des 10 chiffres de la colonne A) puis tu cliques à la fois sur Ctrl Shift Entrée et là tu as ta moyenne. En fait je raisonne en terme de vecteur verticaux.


lundi 28 juin 2004 à 13:08:32 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Adoc5

Par contre, j'ai testé ce prog avec des nombres négatifs, et là, ça ne marche plus, si qq'un voit pourquoi, je suis prenneur.



lundi 28 juin 2004 à 13:42:31 | Re : Aidez-moi !!! je trime sur un truc qui doit être super simple mais j'ai pas le déclic

Mooiz

Ok avec une fonction ca marche (c'est toujours bon à savoir ;-)
j'ai essayé ta fonction (sous open office, linux oblige) et je suis pas sur qu'elle soit vraiment adaptée : je sais pas ce que fais ctrl+shift+entrée sous excel mais si c'est comme sous OOo (c'est à dire que ca copie la formule que tu à écrit dans toutes les cases sélectionnées), alors tu perds beaucoup de temps : chaque fois que tu appelle ta fonction, tu fais les calculs pour toute ta colonne A. Donc en appelant 10 fois ta fonction, tu calcule 10 fois tes moyennes -> 100 calculs contre 10, c'est pas top optimisé
Donc si tu veux l'utiliser comme ca, autant la mettre dans une seule case puis l'executer, ca fera pareil
Ensuite je ne sais pas si l'objet range est adapté : si tu ne selectionnes pas toutes les valeurs à traiter plus au moins une case vide, je ne sais pas si tu vas pas sortir en erreur : la boucle a une seule condition d'arrêt : trouver une case vide. Si ton objet range n'ene a pas, alors arrivé à la dernière valeur, je pense que tu vas faire un dépassement d'index sur ton objet range -> plantage (à ce propos, c'est bien d'avoir ajouté une gestion d'erreur). Pour ma part, je choisirais plutot comme paramètre un numéro de colonne (ou alors recupérer le numéro de colonne de ton objet range), comme proposé dans les premières solutions de l'algo, comme ca tu n'as pas à tout selectionner, ca limite les risques d'erreur
voila


1 2

Cette discussion est classé dans : simple, truc, super, trime, déclic


Répondre à ce message

Sujets en rapport avec ce message

NIX! super le new design mais encore un truc (pas un bug mais une suggestion) [ par BlackWizzard ] ba oui, now que t'as changé la presentation des codes, tu pourrais en mettre plus par page, non?genre 30 à 50 par page au lieu de 10...ou encore mieux creer une base de donnees [ par damd ] salut a tousj'aimerai creer une base de donnees sous visual basic.j'ai deja essayer plein de truc, et rien n'a marché.en fait je veut un truc simple : Un truc tout simple... [ par syltouille ] Voila je voulais savoir comment faire un petit exercice tout simple.J'ai un formulaire avec 2 boutons, un pour compter et l'autre pour arreter de comp vérifier format d'une chaine (général) [ par themaste ] Slt a tous!!Voila en fait j'aimerais faire un truc tout simple, dont je n'ai pas trouver la solution en cherchant ds les posts.En fait, j'ai trouve pl Probleme de TreeView [ par freddy1787 ] Salut TLM,Bonjour je cherche un code super super simple pour pouvoir enregistrer le contenu d'une TreeView dans un fichier text.J'en ai deja trouve un UN TRUC TOUT SIMPLE: Formulaire VB pour BD Excell [ par sofitux ] Je ne suis pas dévelopeuse et je suis nulle en informatiqueJ'ai une BD sur EXcel et j'aimerai créer un formulaire VB pour que les utilisateurs du fich truc tout simple [ par Miss_Am ] En fait voila je débute en vba et je voulais savoir comment faire ca.....Je suis sure que c tout simple....Je doit faire un devis pour de la location question super simple ! [ par Homer Simpson ] comment dupliquer un fichier et renommer le fichier destinataire ?Merci VB.net : Faire un Splitter !!! [ par fabts ] Bonjour à tous,je débute en VB.net, et j'aimerais faire un splitter. J'ai trouvé plein de truc, VB 6.0, des fois un peu de .net, mais je comprend que VB.net : faire un Splitter [ par fabts ] Bonjour à tous,je débute en VB.net, et j'aimerais faire un splitter. J'ai trouvé plein de truc, VB 6.0, des fois un peu de .net, mais je comprend que


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 4,337 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.