Probleme VBA Excel 3 questions de debutant!!!

Fermé
vinch - 6 mars 2008 à 16:08
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 - 13 mars 2008 à 17:56
Bonjour,
Je suis debutant en VBA et j'ai essayé de faire une petite macro pour faire un rangement de publication. bref....

J'ai plusieurs soucis et ils sont les suivants:

1- J'ai crée une userform que j'appel par une procedure dans ma feuille 1.
voici ma ligne de code:

Sub Newp()

Nameof.Show
Content.Show

authors = InputBox("Name of the different authors?" _
, vbInformation)
If authors = "" Then continueclear.Show

Journalchoice.Show

End Sub

Un moment Bonjour,
Je suis debutant en VBA et j'ai essayé de faire une petite macro pour faire un rangement de publication. bref....

J'ai plusieurs soucis et ils sont les suivants:

1- J'ai crée une userform que j'appel par une procedure dans ma feuille 1.
voici ma ligne de code:

Sub Newp()

Nameof.Show
Content.Show

authors = InputBox("Name of the different authors?" _
, vbInformation)
If authors = "" Then continueclear.Show

Journalchoice.Show

End Sub

Dans ma fonction authors je demande si cette fonction est vide de m'ouvrir une userform. Dans cette userform je voudrais faire un bouton qui me permet de fermer la userform mais aussi la fonction newp. J'ai essayé ceci:

Sub CommandButton2_Click()
Unload continueclear
Close newp (ou exit sub mais cela ferme la userform)
End Sub

mais il n'a que la userform qui se ferme. Peut etre existe il une commande particuliere pour eviter de retourner à newp et continuer sur la userform suivante Journalchoice.

2- Pour essayer de resoudre le probleme j'ai essayé de fixer une valeur à une variable dans la userform afin de mettre une condition dans ma procedure newp. Comme cela si la valeur dans ma procedure est OK elle me fait exit sub.
Comme ceci.

Sub Newp()

...
authors = InputBox("Name of the different authors?" _
, vbInformation)
If authors = "" Then continueclear.Show

If terminer = 1 then exit sub

Journalchoice.Show

End Sub

avec

Sub CommandButton2_Click()
terminer = 1
Unload continueclear
End Sub

Mais le probleme et je m'en doutais est que la variable ne se transfert pas dans la procedure newp!!! J'ai essayé avec:
Public terminé as integer mais je ne comprend pas forcement comment faire pour que cette valeur fixée pour cette variable reste valable pour les autres procedures!!!

3- Et voici ma derniere question.
J'ai créé une userform avec une combobox. J'ai pu voir que pour donner la dimension de la combobox par rapport à un tableau il suffit d'utiliser rowsource ainsi:

Private Sub UserForm_Initialize()
ComboBox1.RowSource = "Feuil2!A2:A20"
End Sub

Mon dernier souci est que le tableau que je veux choisir s'agrandi à chaqe fois que je rajoute une cellule, mais la plage choisi par la combobox elle ne s'agrandi pas et je ne peux donc pas voir toute la liste necessaire. Il me faudrait donc un moyen pour agrandir cette liste.

Je vous remercie pour les futurs infos et j'espere avoir ete clair dans mes explications!!!!!!
A bientot
Vinch
A voir également:

5 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 716
6 mars 2008 à 22:31
bonjour

1 Peut etre existe il une commande particuliere pour eviter de retourner à newp et continuer sur la userform suivante Journalchoice.

Pour cela il faut ouvrir ton formulaire en non modal : Nameof.Show 0

2 J'ai essayé avec:
Public terminé as integer mais je ne comprend pas forcement comment faire pour que cette valeur fixée pour cette variable reste valable pour les autres procedures!!!


Il faut la définir dans un module comme tu l'as fait pour que toutes les procédures puissent l'utiliser.


3 Il me faudrait donc un moyen pour agrandir cette liste.

Pour cela il faut nommer ta liste avec une fonction DECALER comme ceci :
menu insertion / nom / définir puis
"noms dans le classeur : liste

fait référence à :
=DECALER(Feuil1!$A$2;;;NBVAL(Feuil1!$A:$A)-1;1)

ensuite tu mets en procédure :
ComboBox1.RowSource = "liste" 

Ainsi ta liste évolue sans souci avec la fonction.

en espérant avoir contribué à la résolution.
0
Bonjour,

merci pour toutes ces informations, et pardon pour le début du message qui est un peu etrange. (je n'y es pas fait attention lorsque j'ai posté le message)

Bref c'est tout bon pour les deuxieme et troisieme points, mais en ce qui concerne le premier j'ai pas tout compris!!!
Je ne sais pas ce que signifie:

"Pour cela il faut ouvrir ton formulaire en non modal : Nameof.Show 0 "

J'ai essayé de rajouter le 0 mais ca me met un message d'erreur.
Je vais réexpliquer mon probleme car le debut etait un peu confu.

Je voudrais en fait arreter la procedure newp () à travers la commande de ma userform continueclear.
voici ce que j'ai:

Sub Newp()
Nameof.Show
If Range("A4") = "" Then
Exit Sub
End If

Content.Show
If Range("B4") = "" Then continueclear.Show

authors = InputBox("Name of the different authors?" _
, vbInformation)
If authors = "" Then continueclear.Show
Range("E4").Value = authors

Range("F4").Value = Date

Journalchoice.Show

End Sub
voici ma userform continueclear

Private Sub CommandButton1_Click()
Unload continueclear
End Sub
Sub CommandButton2_Click()
Suppr
Unload continueclear
??????????????????????????????????????????????????????
End Sub
Private Sub Label1_Click()

End Sub

La ligne avec les points ???? est en fait le lieu ou j'aimerais dire d'arreter la procedure newp() car une fois que j'ai appuyé sur cette " CommandButton2_Click() " ma procedure newp() continue avec notament les userform suivantes ("journalchoice") et la variable "authors".
Je ne peux donc pas utiliser "Exit sub" ou meme "close newp" mais peut etre existe t il une autre fonction comme stop ou..... pour eviter que la procedure newp() continue.

Merci encore pour les propositions précédentes et celle à venir.
vinch
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 716
7 mars 2008 à 15:01
bonjour

Ta question est toujours assez confuse car tu n'as pas tout à fait intégré la procédure objet et tu raisonnes en séquentiel.

Ta procédure newp vis sa vie ( attend probablement la fin d'un "show" si j'ai compris) alors que tu es dans une autre et donc pour intervenir sur newp il faut agir sur l'événement show en positionnant peut-être une variable "public" pour pouvoir faire un exit sub comme tu veux : tes "??????" doivent donc générer l'événement adéquat dans newp.

Je te conseille de positionner un point d'arrêt dans newp puis de faire du pas pour voir ce qui se passe et comprendre ce qu'il te faut faire cas la configuration qui te pose souci..
0
Bonjour,

J'ai donc repris pas à pas toute la procédure newp et je l'ai decoupée en plusieurs procedures pour pouvoir stopper la ou je le souhaitais. Donc merci pour le conseil des points d'arrets.

Maintenant j'ai une derniere question mais elle n'est plus vraiment en rapport avec les questions précédentes.
Je veux donc faire des boutons de tri grace à de toogle ou checkbox enfin peut importe.
je voulais savoir si il m'était possible de créer une procédure "tricroissant" et "tridecroissant" dans un module tel que:

Sub tricroissant1()
Selection.Sort Key1:=Range("A2") _
, Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False _
, Orientation:=xlTopToBottom
End Sub

Sub tridecroissant1()
Selection.Sort Key1:=Range("A2") _
, Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False _
, Orientation:=xlTopToBottom
End Sub

et de l'appeler pour chaques boutons. Je sais que cela est possible mais la difficulté pour moi est de trouver une solution pour que le bonton que j'appelle choisisse la bonne colonne à trier, car si je le laisse comme ceci il me trira sans cesse la colonne A pour n'importe quel bouton choisi.

Est il donc possible de fixer un variable dans le bouton (par exemple ici dans le bouton ci dessous) ou par un autre moyen pour changer: Key1:=Range("A2") en la colonne desirée.

Peut etre faut il tout simplement faire autant de tricroissant1, tricroissant2, tricroissant3..... qu'il y a de colonne en changeant Key1:=Range("B2"), Key1:=Range("B2"), respectivement....????

Voici mon bouton appelant le tri

Private Sub CheckBoxName_Click()
If CheckBoxName.Value = False Then
range("A2").CurrentRegion.select
tricroissant1
Else
range("A2").CurrentRegion.select
tridecroissant1
End If
End Sub

A bientot et encore merci
Vinch
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 716
11 mars 2008 à 15:40
bonjour

Personnellement, je pense qu'il vaut mieux utiliser un module de tri paramétré.
Si tu veux trier sur douze colonnes, pas de souci tu lances 12 fois ton tri en commençant par l'ordre de tri le plus faible jusqu'au plus important.
Je te modifie pour l'exemple ton code en rajoutant le tri approprié
Private Sub CheckBoxName_Click()
dim ligne as integer, colonne as integer
ligne = 2
colonne = 1
If CheckBoxName.Value = False Then
       Call tri(Cells(ligne , colonne).CurrentRegion, Cells(ligne , colonne), xlAscending)
Else
        colonne = 4
        Call tri(Cells(ligne , colonne).CurrentRegion, Cells(ligne , colonne), xlDescending)
End If
End Sub 


Sub tri(plage As Range, debut_tri As Range, ordre As Integer)
plage.Sort Key1:=debut_tri, Order1:=ordre, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub

0
Merci encore,
j'ai bien compris le code proposé, mais il y a une chose qui ne fonctionne pas et cela me retourne le message d'erreur suivant:

Erreur d'éxecution '1004'

Impossible de lire la propriété CurrentRegion de la classe Range.

Et la je dois bien avouer je suis incapable de resoudre le probleme, je ne comprend pas ce que cela veut dire!!!!!!!

D'autre part, j'aurais encore une question, hihihi, mais comme je fais mon programme en fonction des idées, j'ai penser à quelques choses mais je ne sais pas si c'est réalisable.
Je voudrais ajouter dans une cellule le mot "papier" si la publication que je viens de lire est au format papier, jusque la rien de difficile.
Mais ensuite je voudrais une autre option qui mettrait le mot "lien" avec un hyperlink d'une publication sous format Pdf. J'aimerais faire une Userform qui me demande si il s'agit d'un papier ou d'un document electronique. Et Lorsqu'il s'agit d'un lien je voudrais pouvoir enregistrer le mot lien avec bien evidement le lien du document concerné.

J'ai constaté qu'il était possible de le faire manuellement mais aussi sous vba avec le code ci dessous:

Private Sub CommandButton1_Click()
Range("A2") = link
Range("A2").Select
ActiveSheet.Hyperlinks.Add Anchor:=selection, Address:= _
"Biblio\Rheo behavior of PA 11 with varying Winit.pdf"
With selection.Font
.ColorIndex = xlAutomatic
End With
End Sub

Le probleme est que j'ai une "Address" fixe et bien entendu je souhaiterais la modifier en selectionnant la publi dans un dossier par exemple!!!!!

Encore merci pour toutes ces informations.
Vinch
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 716
12 mars 2008 à 17:25
bonjour

Impossible de lire la propriété CurrentRegion de la classe Range.
Et la je dois bien avouer je suis incapable de resoudre le probleme, je ne comprend pas ce que cela veut dire!!!!!!!


J'ai laissé ton utilisation de CurrentRegion, mais personnellement je n'utilise pas car je ne trouve pas cette fonction très fiable.
Private Sub CheckBoxName_Click()
dim ligne as integer, colonne as integer
ligne = 2
colonne = 1
If CheckBoxName.Value = False Then
       Call tri(Cells(ligne , colonne).resize(Cells(ligne , colonne).end(xldown).row, _
            Cells(ligne , colonne).end(xltoright).column), Cells(ligne , colonne), xlAscending)
Else
        colonne = 4
        Call tri(Cells(ligne , colonne-3).resize(Cells(ligne , colonne).end(xldown).row, _
            Cells(ligne , colonne).end(xltoright).column), Cells(ligne , colonne), xlDescending)
End If
End Sub 

Ainsi tu récupères deuis A2 jusqu'à la dernière colonne de droite et jusqu'à la dernière colonne en bas : c'est ce que devrait faire CurrentRegion.

erreur 1004, c'est en général que le code est incorrect pour excel et il n'arrive pas à interpréter.

Le probleme est que j'ai une "Address" fixe et bien entendu je souhaiterais la modifier en selectionnant la publi dans un dossier par exemple!!!!!

Pour cela il faut ouvrir un dialogue de lecture des fichiers et c'est une autre fonction.

Tu devrais regarder l'aide sur ouvrir GetOpenFilename et cela t'ouvres la fenêtre de choix puis en fermant, tu obtiens le chemin du fichier dans une variable.
0
Merci pour tout les conseils!!
J'ai réussi à faire ma fonction tri avec quelques adaptations!!!
Ca donne ca:

Private Sub CheckBoxAddthe_Click()
Dim ligne As Integer, colonne As Integer
ligne = 2
colonne = 6
If CheckBoxAddthe.Value = False Then
Call tri(Cells(ligne, colonne), xlAscending)
Else
Call tri(Cells(ligne, colonne), xlDescending)
End If
End Sub

Sub tri(debut_tri As Range, ordre As Integer)
insert
Range("A3").CurrentRegion.Select
Selection.Sort Key1:=debut_tri, Order1:=ordre, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
suppr
End Sub

car malheureusement l'expression "Cells(ligne , colonne).resize(Cells(ligne , colonne).end(xldown).row, Cells(ligne , colonne).end(xltoright).column)" ne marchait pas pour selectionner le tableau.!!!

Mais j'ai trouvé une astuce pour que CurrentRegion marche et je ne sais pas pourquoi mais ca marche!!!!
J'ai inseré une fonction "insert" au debut qui m'insere une ligne!!!!!! et bien entendu j'ai une fonction "suppr" qui la supprime ensuite!!!!!
Je ne sais pas du tout pourquoi mais ca marche!!!!!!!!!

Je vais maintenant regarder pour l'option GetOpentoFileName.

Merci encore pour toutes les info à bientot.
vinch
0

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

Posez votre question
Bonjour

Je vous serez reconnaissant de bien vouloir m aider a programmer un losange juste avec son extremite superieur et sa longueur du cote en vba excel .

Je vous en remercie d avance

Un etudiant en galere !!
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 716
13 mars 2008 à 17:56
bonjour

Tu devrais ouvrir un sujet à toi car ta question n'a rien à voir avec ce sujet.
0