MSG BOX ET INPUTBOX

D

David

Guest
Bonjour à vous tous,
Une petite question qui ne devrait pas poser de problèmes aux pros que vous êtes :
ex : Je souhaiterais, après un msgbbox "message de test",vbyesno,"Mon message") ou inputbox (voulez-vous continuer,vbokcancel), la proposition "oui, non, annuler" ou "réessayer, abandonner, annuler" apparaisse en francais et non en anglais.
Qui sait comment ?
Merci.
 
B

Bernard

Guest
Bonjour David

Comme un petit schéma vaut mieux qu'un long discours....

Joint un fichier qui pose des questions de ce style avec des msgbox et des inputbox pour l'impression de pages des feuiles d'un classeur.

Cordialement

Bernard.
 
@

@+Thierry

Guest
Bonsoir Bernard, David, le Forum

Excellent le choix du texte pour l'exemple Bernard !

Attention toutefois à déclarer les variables, car là elles toutes sont Variant.

Option Explicit
Sub Imprimer()
Dim Ws As Worksheet
Dim FeuilNom As String
Dim Prem As String, Sec As String, Cop As String
Dim Msg As String, Style, Title As String, Default As String
Dim MyValue As Byte

Et la ligne de ton Epson Stylus Photo 915 n'est pas nécessaire et fera planter tout ceux/celles qui n'auront pas une imprimanate identique.

Petite astuce pour la syntax de MsgBox sans passer par toutes ces variables dans la démo ci-jointe...(just for the fun !! lol)

Bonne Soirée
@+Thierry
 

Pièces jointes

  • XLD-Joke-MsgBox.zip
    11.8 KB · Affichages: 20
B

Bernard

Guest
Bonsoir @+Thierry

Je pense que maintenant David à tout pour mettre au point ses msgbox et ses inputbox.

Effectivement les variables n'étaient pas déclarées dans le détail mais je ne sais si cela est vraiment important pour des messages ?

Pour la réduction des syntaxes, c'est un plus certain mais qui complique la compréhension des débutants.

L'imprimante c'est une pub gratuite Lol

Puisque tu est toujours aussi sympha et pédagogique je t'envois un sourire avec tous nos amis hihi

Cordialement

Bernard
 
@

@+Thierry

Guest
Re bonsoir

Ah oui pour les variables, j'avais ceci qui est assez explicit sur la taille des variables en espace mémoire. (c'est un PDF en anglais)

Et Dim Toto = Dim Toto As Variant... Dommage si Toto est Byte !!!

Bonne soirée
@+Thierry
 
L

LaurentTBT

Guest
Bonsoir, à tous,

Je profite de ce fil pour revenir sur une question que j'avais posée sur les variables.

Thierry, il y a quelques jours, tu conseillais dans un autre fil de remettre à Nothing des variables object en fin de procédure. Mais pourquoi? Ces variables, contrairement aux autres variables classique, ne sont-elles pas déchargées en fin de procédure? (pour des variables de niveau procédure, du moins)

Bonne soirée.

Laurent.
 
@

@+Thierry

Guest
Salut Laurent, re le Fil, le Forum

Euh oui, enfin non, lol je ne sais pas, tu m'as posé une question ?... Arf, je n'ai pas répondu ?... Arf, honte à moi !! lol..... mais kecekecé, Maître VBA, un rappel d'huissier..... Arf lol (un peu à la Vériland !! lol)

Non sincèrement je ne sais pas de quoi tu parles ? je t'ai conseillé quelque chose ? Cà me dit rien du tout ?

Les Variables objects, oui... en cours de procédure, oui... mettre à Nothing, euh oui...... je cherche...... le moteur fonctionne ? oui ... ouf !!!

Ah oui tu parles de Lien supprimé

Arf je vois ta question et je n'y ai pas répondu. Aie aie aie désolé !

Ben écoute Laurent, ta question nécessite plus amples recherches et réflexions, en fait je me suis toujours efforcé de mettre à nothing toutes les Variables Object car c'est comme ceci que j'ai appris à développer. Et c'est comme ceci que je lis toutes sortes de procédures professionnelles... Maintenant logiquement il semble vrai que les Variables Objects déclarée dans le même module devraient (toujours logiquement) ne pas avoir de "vie" en dehors de celles-ci (le durée de la Procédure), mais j'aimerais bien avoir confirmation, car le Set d'Objet est tout de même different d'un simple Dim de Variable...

Je regarde ce que je trouve de mon coté, mais si vous avez plus d'info vous êtes bienvenus dans ce fil.

Bonne soirée
@+Thierry
 
M

Michel_M

Guest
Bonjour Laurent Thierry Bernard enfin tout le monde

Petit témoignage:

J'avais créé une collection avec la déclaration:

dim machin as new collection

A ma grande surprise, à la fin de la macro, "machin" ne s'est pas vidé et en réactivant la macro j'avais 2 fois les membres de la collection dans ma listbox

Pour résoudre le pb j'ai donc écrit en fin de prog:

set machin=nothing

A+
Michel
 
L

LaurentTBT

Guest
Bonjour à tous,

Merci bien Michel. Comme quoi, les vrais pros savent prendre les bonnes habitudes.

Quant à moi, je vais en avoir, des "Set Machin=Nothing" à rajouter! En plus, cela doit vite prendre des quantités de mémoires!

Bon dimanche.

Laurent.
 
@

@+Thierry

Guest
Bonjour Laurent, Michel, Bernard, David, le Forum

Je viens un peux de surfer dans cette énorme encyclopédie vivante qu'est le Net...

Je suis toujours perplexe, quand je vois certaines procédures de Frédérique S, Denis M., Clément M, Patrick P. qui emploient systématiquement en fin de procédure "Set TheObject = Nothing"

Mais par contre j'ai aussi noté que Laurent Longre qui est quand même notre référence nationale (même sur les sites US) ne le fait pas. En prime il a carrément écrit ceci dans un post du MPFE :

"Tu n'as pas besoin d'affecter Nothing aux variables objets à la fin de la procédure, dans la mesure où ce sont des variables locales (détruites automatiquement à la fin de la procédure). " (1999/12/14)

Dans mes recherches j'ai aussi noté que nos amis Ti et STeph, présents dans ce Forum et qui sont eux aussi d'Excellentes références, ne remettent pas non-plus à Nothing les variables Objects locales.



Au niveau de la mémoire j'ai aussi trouvé ceci d'un certain Abdoul S. :

Au niveau de la gestion mémoire : quand tu utilises Set, la variable ne contient pas une "copie" de l'objet, mais simplement une référence à celui-ci. Tant que tu n'utilises pas le mot-clé New (affectation d'une nouvelle instance de classe à une variable), la mémoire consommée par cette variable objet restera assez réduite. Si la variable est locale à la procédure (comme l'est apparemment MesSh dans ta macro), elle est de toute
façon détruite à la fin de cette procédure et la mémoire qui lui était allouée est automatiquement libérée. La libération explicite de cette mémoire, par Set Mavariable = Nothing, s'impose surtout dans le cadre de grosses macros avec des variables objets de niveau module et/ou qui réfèrent à des instances de classes.
(1998/01/23)




Par ailleurs, une récapitulation intéressante pour vider la mémoire (toujours du Grand Chef à 3 plumes... LL)

Vider une variable objet : Set MOnObjet = Nothing
Vider un tableau : Erase MonTableau
Vider une chaîne de caractères : MaChaîne = ""
Décharger un UserForm de la mémoire vive : Unload MonUserForm
Libérer *toute* la mémoire allouée par la macro : instruction End
(interrompt également le programme)
+ éviter si possible de manipuler trop souvent PageSetup, HPageBreaks
etc: presque tout ce qui touche à la configuration de l'impression sous
VBA génère des problèmes de mémoire non désallouée.
(2000-11-16)




Et ici une petite démo toujours de LL :

Dim XL As Excel.Application

Sub OuvreXL()
Set XL = New Excel.Application
End Sub

Sub QuitteXL()
XL.Quit
Set XL = Nothing
End Sub

Sub Exemple()
If XL Is Nothing Then OuvreXL
MsgBox XL.WorksheetFunction.TInv(0.5, 19)
If MsgBox("Continuer à utiliser les fonctions XL ?", vbYesNo) = _
vbNo Then QuitteXL
End Sub


LL comments :
Si les fonctions d'Excel doivent être périodiquement rappelées par ta
macro, il vaut mieux laisser l'instance d'Excel ouverte en permanence,
et ne la refermer que quand ta macro n'en a plus besoin.

Avantage : comme Excel est déjà ouvert, la fonction est appelée plus
vite. Inconvénient: l'instance d'Excel ouverte consomme des ressources
en mémoire vive.


Ce qui laisse bien entendre aussi l'utilisation du Set TheObject = Nothing est important dans le cas de Variables Publiques.




Ensuite j'ai aussi passé un moment sur le site de Chip Pearson (Excellent site pour ceux qui parlent anglais Chip Pearson)

Je n'ai pas vraiment trouvé d'explication pour ce sujet précis, mais par contre j'ai trouvé ceci qui selon toute vraisemblance pourrait être une cause de mauvaise optimisation dans le style de "Variable Object Collection" que Michel décrit plus haut....

Don't Use The New Keyword In A Dim Statement
"ne pas utiliser l'instruction New dans une déclaration de Dim"

C'est à dire de ne pas utiliser ceci :
Dim MyCollection As New Collection

En effet Chip, indique que ceci est la méthode "Auto-Instancing". Elle va systématiquement générer en Run-Time une compilation de codes cachés et ceci à chaque fois que l'on fera appel à la Variable pendant la procédure... Contrairement à ce que l'on pourrait penser (et bien que çà sauve du texte à taper pour le développeur !) par cette méthode "Auto-Instancing" l'objet "MyCollection" n'est pas créé par la Déclaration Dim. L'objet est généré

De plus il dit qu'à aucun moment on ne pourra déterminer si cette Variable est en fait vide ou non !
En d'autres termes l'instruction "New" agit plus comme un ordre de compilation et pas une instruction "d'action" pour VBA.

Ce que Chip conseille à la place :
Dim MyCollection As Collection
Set MyCollection = New Collection


C'est çà qui est bien quand on participe à un Forum comme celui-ci, on se remet tous les jours en question et c'est uniquement comme ceci que l'on apprend !!!

LigneSeparator.gif


Pour conclure (sorry pour ce long fil, mais il ne représente même pas le temps que j'ai passé pour cette question !!) donc j'ai finalement testé la procédure que j'avais mise dans l'autre fil de discussion qui a déclenché la question de Laurent :

Macro d'origine
Sub TxtLineCountMethodOne()
Dim FSO As Object, TXT As Object
Dim Chemin As String, Fichier As String
Dim Nbr As Long
Chemin = ThisWorkbook.Path & "\"
Fichier = "Daily-2004-03-26.txt"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set TXT = FSO.OpenTextFile(Chemin & Fichier, 8, False)
Nbr = TXT.Line - 1
MsgBox "le Fichier " & Fichier & " contient " & Nbr & " lignes "
TXT.Close

Set FSO = Nothing
Set TXT = Nothing
End Sub

Et la je regarde si FSO "est encore vivant" !!!

Macro TEST
Dim Chemin As String, Fichier As String

Sub TxtLineCountMethodOne()
Dim FSO As Object, TXT As Object
Dim Nbr As Long
Chemin = ThisWorkbook.Path & "\"
Fichier = "Daily-2004-03-26.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TXT = FSO.OpenTextFile(Chemin & Fichier, 8, False)
Nbr = TXT.Line - 1
MsgBox "le Fichier " & Fichier & " contient " & Nbr & " lignes "
TXT.Close

Testing
End Sub

Sub Testing()

Set TXT = FSO.OpenTextFile(Chemin & Fichier, 8, False)
Nbr = TXT.Line - 1
MsgBox "le Fichier " & Fichier & " contient " & Nbr & " lignes "
TXT.Close
End Sub

J'ai immédiatement une erreur 424 "Objet Requis" ce qui laisse bien la confirmation que mon Object FSO n'existe plus ! (La fenêtre Variables Locales confirme la même chose)

Donc Laurent ne change pas tout !

Bon Dimanche à Tous et Toutes (moi par contre j'ai des procédures à modifier... surtout pour le Dim Toto As New Collection lol)
@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
312 512
Messages
2 089 203
Membres
104 063
dernier inscrit
lisadp