quel est le code dans une macro pour rechercher des données

  • Initiateur de la discussion Jocelyn
  • Date de début
J

Jocelyn

Guest
Bonjour a tout le forum,

pour commencer je vous précise que je suis débutant, et c'est pourquoi je me tourne vers les spécialistes que vous etes.

Mon problème est le suivant j'ais créé un fichier devis dans lequel j'avais créé un onglet (feuil1)pour sauvegarder les données les plus importantes du devis,
pour ce faire j'avais mis en place un semblant de macro (merci à Didier_mDF pour m'avoir aidé a la rendre reellement fonctionnelle), elle fonctionne vraiment trés bien maintenant.

Par contre vu que mon devis comporte une partie de réalisé qui va etre ammenée a changer régulièrement j'aimerais pouvoir créer une macro qui irait chercher par raport au numéro de devis l'ensemble des éléments sauvegardés le concernant et qu'il les restituent dans la feuille devis afin de mettre à jour les éléments réalisés.

la deuxieme question est'il possible que lorsque les modifications seront effectuées dans la partie du réalisé la macro aille re sauvegarder les informations sur la ligne d'ou elle les a extraites en effaçant les anciennnes de façon a ne pas avoir plusieurs lignes pour un meme devis.

Je ne suis pas sur que mon discour ai été très clair je joint donc un fichier d'exemple.

je vous adresse a tous un grand merci d'avance
 

Pièces jointes

  • devis.zip
    14.8 KB · Affichages: 79
  • devis.zip
    14.8 KB · Affichages: 78
  • devis.zip
    14.8 KB · Affichages: 80
@

@+Thierry

Guest
Salut Jocelyn, le Forum

Le Fichier vient de partir dans ton mail, je le mettrai en ligne plus tard.

Sinon là j'ai du taff, je pense que ton astuce est correcte et pas tant bricolo que çà... Vider la CbxDevis est très astucieux puisque la boucle suivante stoppera la procédure si elle est vide...

Par contre pour ton info, tu pourrais faire directement ceci :

Private Sub CheckingDevis()
Dim i As Integer
With Me
For i = 1 To UBound(Devis)
If UCase(CStr(.CbxDevis.Value)) = UCase(CStr(Devis(i, 2))) Then
MsgBox "Attention le devis numéro " & .CbxDevis.Value & " existe déjà dans la base"
CbxDevis.Value = ""
End If
Next i
End With
End Sub

(pas besoin d'un second If pour la même condition)

Bravo pour ta persévérance et bon courage
@+Thierry
 
J

Jocelyn

Guest
Re bonjour @+thierry,

J'ai bien reçu ton mail,
je ne t'ai pas répondu plus tot je sort juste de réunion, et comme j'y retourne je voulais te dire j'ai bien reçu ton mail.

Je re garde a toutes les évolutions dont tu parle dans le week-end et je te tiens au courrant des lundi.

Comme j'ai deja eus un apperçu de tes capacités je ne suis pas inquiet.

Une fois encore merci
Bonne fin de journée,
Bonne soirée,
Bon week-end,
A+
Jocelyn
 
J

Jocelyn

Guest
Bonjour le Forum,
Bonjour @+Thierry,


D'abord j'espere que tu as passé un bon week-end, toi et tous ceux du Forum.

La version 3 du fichier fonctionne a merveille j'aurais quand meme bien aimé savoir comment tu as fait pour integrer le calendrier au niveau du UserForm, car si j'ai reperé les différentes lignes de code pour le calendar, je ne sais pas comment on peux integrer le calendrier en lui meme dans le UserForm, je suppose que c'est comme pour les autres boutons mais la je vois pas lequel (remarque c'est peut etre tout simplement les lignes de codes mais je trouve pas ca cohérent).


Sans vouloir abuser j'ai essayer d'integrer un bouton "impression", j'ai créé le bouton et je l'ai re lié à :
Private Sub CommandButton4_Click()
With UserForm1
.PrintForm
End With

End Sub

Maintenant le UserForm s'imprime il me reste un petit problème, c'est au nivo de la mise en page de l'impression,
Jaimerais le centré horizontalement et rajouter un titre (voir peut etre autre chose mais je ne sais pas bien encore)
Le titre serait quelque chose du type "DEVIS IAAT" (en ce qui concerne le titre dans les propriété du UserForm j'avais mis "Formulaire de Devis" dans "Caption" mais la petit ligne bleu ou c'est indiqué n'est pas reprise lors de l'impression)

Tu vois que je n'avais pas de raison de m'inquieté tu est un vrai spécialiste

Merci pour l'info sur les If si j'ai tout compris on pe faire un seul If et mettre plusieurs actions a suivre c'est interressant a savoir (je me forme, je me forme et c'est toujours super d'apprendre merci)

Encore merci,
Bonne semaine,
Bonne journée,
A+
Jocelyn
 
J

Jocelyn

Guest
Re bonjour le forum,
Re Bonjour @+Thierry,

Juste pour t'indiquer que j'ai avancé un peu sur l'impression, je n'avais pas besoin d'imprimer les "CommandButton" alors j'ai modifier le code VBA de la façon suivant.

Private Sub CommandButton4_Click()
With UserForm1
ToggleButton1.Visible = False
CommandButton3.Visible = False
CommandButton4.Visible = False
CommandButton1.Visible = False
CommandButton2.Visible = False
.PrintForm
ToggleButton1.Visible = True
CommandButton3.Visible = True
CommandButton4.Visible = True
CommandButton1.Visible = True
CommandButton2.Visible = True
End With

End Sub

Il devait surement y avoir plus simple et plus rapide mais au moins j'arrive au résultat que j'attendais. (Et toujours du bricolage, du bricolage!!!!!!!!!!) (lol) (mais bon c'est mieux que rien)

Par contre pour la mise en forme d'impression pour l'instant je n'arrive a rien (mais je persiste)

Merci encore
Bonne journée
Bonne soirée
A+
Jocelyn
 
@

@+Thierry

Guest
Bonjour Jocelyn, le Forum

Ah sorry je n'avais pas vu ta nouvelle question. Pour ce coup là, çà va être très simple... Tu n'auras pas de solution simple et fiable pour imprimer directement un UserForm avec "PrintForm"... C'est une possibilité pour avoir une capture de ton UserForm mais il n'a n'y a pas de paramétrage facile pour l'impression.

En fait, si tu veux mon avis perso, un UserForm est un Outil Interactif de Saisie ou de Contrôle mais en aucun cas un UserForm ne doit servir pour l'édition d'un rapport imprimé directement.

La solution, tu te fabriques un formulaire sur une Feuille Additionnelle (comme j'ai fait pour Nicole Lien supprimé) et tu renvoies les données du UserForm dessus et ce sera cette feuille qui sera imprimée comme tu le veux, avec le design que tu veux et les paramètres d'impression (Centrage, Marges etc) que tu veux....

C'est beaucoup plus simple, fiable et propre que d'imprimer le UserForm lui-même.

Pour renvoyer les données, vu qu'Excel ne va pas aimer des duplications de champs nommées en fait tu n'as qu'à faire ton formulaire et mettre des "=TxbDate" , ="CbxDevis", etc etc.... sur ta nouvelle feuille... Même pas besoin de changer la programmation...

Bon Appétit
@+Thierry
 
J

Jocelyn

Guest
Bonjour le Forum,
Bonjour @+Thierry,

Je viens te prendre connaissance de ta réponse et je fais confiance au spécialiste que tu es, donc j'essai de mettre ca en place, et que ca marche ou non je te donne le résultat.

J'espere que ce sera pour te dire tout fonctionne a merveille mais avec un débutant comme je le suis on ne sait jamais.

Bonne nouvelle quand meme je n'ai pas de question a te poser aujourdhuis.

Je me suis un peu trop avance j'ai toujour la problematique pour le calendar en soit ce n'est pas important mais si un jour je devais rééditer un userform avec l'insertion du calendar je serais bien ennuyé. J'ai vu que dans les références-VBAproject le calendar était coché mais aprés pour l'insérer sur le UserForm c'est une autre histoire.

Encore et encore merci,
Bonne fin de journée,
A+
Jocelyn
 
@

@+Thierry

Guest
Bonjour Jocelyn, le Forum

Sacré Fil celui là !!! 24ème Post et en duo uniquement !

Pour inserrer un Contrôle ActiveX non prévu dans la boite à Outils Contrôles en plus des Standards TextBox, ListBox, ComboBox, CheckBox, ToggleButton, CommandButton, OptionButton, Label, SpinButton, ScrollBar, Frame, Image, MultiPage, TabStrip, RefEdit... Il faut :

Quand tu es sur cette Boite à Outil active, tu clicks droit depuis le MultiPage où se trouve les 15 Contrôls par défaut, et tu auras dans le menu contextuel "Contrôles Supplémentaires"... De là il y a beacoup de choix, très peu te seront utile, et d'autres ne fonctionneront pas, bien qu'ils soient affichés... En fait pour t'éviter de faire des bêtises ne t'orientes dans un premier temps que vers ceux dont le nom commence par MicroSoft...

Le Calendrier que j'ai utilisé se nomme "Calendar Control 9.0" pour la version 2000 d'Office (ou 10.0 si tu es sous Office XP, ou 11.0 si tu es sous 2003)...

Pour te montrer, voici ma barre d'Outils dans VBE :


On peu facilement ajouter des Onglet à cette barre d'outil en cliquant à droit lorsque l'on est en dehors du MultiPage, le menu contextuel proposera diverses option dont Nouvelle Page...

Bonne Fin d'Aprèm
@+Thierry
 
J

Jocelyn

Guest
Bonjour le Forum,
Bonjour @+Thierry,

Pour commencer j'espere que les points !!!!!!!!!!!!! de ton dernier message etait de plaisir et non d'agacement !!!!!!!!!!!!!!! (lol!!!!!!!!!!!!!!!!!!)et oui je suis d'accord avec toi pour avoir surfé sur le forum il y en a peu qui on autant de post et qui plus est avec seulement 2 personnes.

une bonne nouvelle qui me rejouit, je suis parvenu a aider 2 demandeurs rassurre toi je ne vais pas prendre ta place sur le Forum demain (re lol !!!!!!!!!!!!!) pour l'instant l'aide n'a porté que sur des problèmes de formule (mais bon c'est deja mieux que rien). Et oui que veux tu j'ai essayé de me pencher sur des problèmes de VBA et la je dois dire merci a ceux qui ont trouvé une solution. Alors content de ton élève ? :)

Revenons a notre Fil,
Merci ca y est j'ais trouver les controles supplementaire et je m'en tiendrais a tes recommendations qui sont toujours excellentes.
Comme exemple j'ai procédé comme tu me l'avait conseil a la mise en page d'un formulaire et oui bravo plus de problème concernant l'impression et la mise en page (le Fil que tu m'a indiquer m'a aussi été trés utile)

Histoire d'allonger le Fil :) !!!!!!

Juste un petit détail dans "TxtNumber"prev et réel si je veux mettre un chiffre avec décimal par exemple 1.5 il ne reconnait pas le point du pavet numérique mais seulement la virgule de l'alpha et ca je sais que les utilisateur vont préférer se servir du pavet numérique, donc si c'est réalisable je suis preneur.

Encore merci,
Bonne journée,
A+
Jocelyn
 
@

@+Thierry

Guest
Bonjour Jocelyn, le Forum

Non rassure toi, jamais d'énervement avec moi, il vaut mieux ! Les Trois Points de suspension indiquent simplement que mes indications ouvrent vers des chemins vastes...

Pour tes TextBox et le Point du Pavé numérique il faut rajouter un peu de code pour chacune des quatres TextBox comme ceci :

Private Sub TxtNumberPrevA_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 44 Or KeyAscii = 46 Then
KeyAscii = Asc(Application.International(xlDecimalSeparator))
End If
End Sub

Private Sub TxtNumberPrevB_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 44 Or KeyAscii = 46 Then
KeyAscii = Asc(Application.International(xlDecimalSeparator))
End If
End Sub

Private Sub TxtNumberReelA_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 44 Or KeyAscii = 46 Then
KeyAscii = Asc(Application.International(xlDecimalSeparator))
End If
End Sub

Private Sub TxtNumberReelB_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 44 Or KeyAscii = 46 Then
KeyAscii = Asc(Application.International(xlDecimalSeparator))
End If
End Sub

Si tu veux voir ceci en démo, je te conseille :

Démo Téléchargeable Lien supprimé (45k)

Fil de Discussion Lien supprimé


Bonne Journée

@+Thierry
 
J

Jocelyn

Guest
Re bonjour le Forum,
Re bonjour @+Thierry,

Merci pour la réponse précédente ca fonctionne.

en mettant le fichier en teste je me suis rendu compte qu'il me manquait une Combobox.

Cette combobox ne doit pas comporté de menu déroulant,alor dans le userform j'ai créé une Zone texte nommée "Cbxlibelle"
pour l'integrée j'ai changé certaine partie des codes :
'A partir de là procédure Commune... (Le L est intialisé en fonction..)

With .Range("A" & L)
.Value = TheDate
.NumberFormat = "d mmmm yyyy"
End With
.Range("B" & L) = Me.CbxDevis '==> Changement de Val(Me.CbxDevis) pour "2004-000001"
.Range("C" & L) = Me.CbxCommanditaire
.Range("D" & L) = Me.CbxRespCommande
.Range("E" & L) = Val(Me.TxtNumberPrevA)
.Range("F" & L) = Val(Me.TxtNumberPrevB)
.Range("G" & L) = Val(Me.TxtNumberReelA)
.Range("H" & L) = Val(Me.TxtNumberReelB)
.Range("I" & L) = TheCoef
.Range("J" & L) = CoefIncerti
.Range("K" & L) = TxTotalReel
.Range("L" & L) = TxEcartTotl
.Range("M" & L) = Me.Cbxlibelle (j'ai ajouté cette ligne)

ca c'est pour la sauvegarder le libelle du devis
ensuite j'ai changer cette ligne:

Devis = WsData.Range("A2:I" & WsData.Range("A65536").End(xlUp).Row) 'augmentation !! (de A jusqu'à I)

Par

Devis = WsData.Range("A2:M" & WsData.Range("A65536").End(xlUp).Row) 'augmentation !! (de A jusqu'à M)

jai aussi changé

Private Sub TheLocker(MyBoolean As Boolean)
Dim CTRL As Variant

For Each CTRL In Array("CbxCommanditaire", "CbxRespCommande", "TxtNumberPrevA", _
"TxtTotalPrevA", "TxtNumberPrevB", "TxtTotalPrevB", "TxbGrandTotalPrev")

par

Private Sub TheLocker(MyBoolean As Boolean)
Dim CTRL As Variant

For Each CTRL In Array("CbxCommanditaire", "CbxRespCommande", " Cbxlibelle", "TxtNumberPrevA", _
"TxtTotalPrevA", "TxtNumberPrevB", "TxtTotalPrevB", "TxbGrandTotalPrev")
pour bloquer l'écriture en modification

et pour finir j'ais ajouter une ligne a cette portion de code

'Scanning du Tableau Devis si le numéro exite
For i = 1 To UBound(Devis)
If UCase(CStr(.CbxDevis.Value)) = UCase(CStr(Devis(i, 2))) Then
'si ou on remplit les CombobBox et TextBox s'y afférant
TheDate = Devis(i, 1) '<<<<<<<<< RECUPERATION DATE EN VARIABLE DATE
.TxbDate = Format(TheDate, "DD/MM/YYYY") 'Mise en format Date FR (attention c'est du Text)
.CbxCommanditaire.Value = Devis(i, 3)
.CbxRespCommande.Value = Devis(i, 4)
.TxtNumberPrevA.Value = Devis(i, 5)
.TxtNumberPrevB.Value = Devis(i, 6)
.TxtNumberReelA.Value = Devis(i, 7)
.TxtNumberReelB.Value = Devis(i, 8)
TheCoef = Devis(i, 9) '<<<<<<<<<<<<<<<<<<<<<AJOUT Coefficient d'incertitude
.Cbxlibelle.Value = Devis(i, 13) <<<<<<moi j'ai ajouter cette ligne

quand je lance le UserForm il me fait bien les sauvegardes, il renseigne bien mon formulaire et me remonte bien toutes les infos en modification de plus j'arrive bien a ne pas changer le libelle en modif.

le seul soucis c'est que si ce champ n'ai pas rempli il ne déclenche pas cette partie de code :

For Each CTRL In Controls
If CTRL.Tag = "Mandatory" Then
If CTRL.Value = "" Then Bad = Bad + 1
End If
Next

If Bad > 0 Then
MsgBox "Des Champs Obligatoire Sont Vides", vbCritical, T
Else
DevisBuilding 'Appel d'un autre macro

peux tu me dire ce que j'ai oublié de corriger

Merci d'avance,
Bon appétit,
A+
Jocelyn

PS encore une fois j'en ai coller un kilometre de long dans ce post mais maintenant tu doit avoir l'habitude :) !!!!!!
 
@

@+Thierry

Guest
Bonsoir Jocelyn, le Forum

J'ai bien eu tes deux messages en BAL, et tu as de la chance de les avoir envoyé à travers USF_XLD_Contacts Manger.... (car mon Outlook détruit tout !!!)

Donc pour ta question c'est très simple et c'est un truc de Ti...

Fenêtre Propriété de ta TextBox déguisée en Combobox ! lol
Dans cette fenêtre tu cherches la proipriété "Tag et Toc" !! !!! lol (nan juste Tag !! lol)

Bonne soirée
@+Thierry
 
J

Jocelyn

Guest
Bonjour le Forum,
Bonjour @+Thierry,

Je vais pas etre trés inventif mais merci pour ta réponse une fois de plus c'est exactement ce qu'il falait.

Et j'espere que de t'avoir appelé directement sur ton mail ne t'a pas trop ennuyé, mais je ne voulais pas recréer un nouveau fil.

Une nouvelle fois bravo pour ton User carnet d'adresse et envoi de mail c'est génial et je me suis empressé de le charger a des fins perso et des que j'ai "une minute" (je devrait dire un mois lol!!!!!!!!!!!!!!!!!!!!!!)je vais me pencher sur les lignes de code

Maintenant j'ai une explication beaucoup plus détaillée de : If CTRL.Tag = "Mandatory"

Aussi bien pour CTRL.Tag que pour le "Mandatory"

Eh bien encore merci,
Bonne soirée,
A+
Jocelyn
 
J

Jocelyn

Guest
Bonjour le forum,
Bonjour thierry,

Je me suis appercu d'un petit soucis dans le fichier, je te donne l'explication et aprés la solution que j'ai touvée, j'aimerais juste que tu me dise si c'est cohérent ca fonctionne mais si tu le veux bien j'aimerais avoir ton avis.

le problème est le suivant depuis le rajout du point surle pavet numérique si le chiffre entré est par exemple 1.5 la sauvegarde effectuée dans "DataHisto" est 1 pour ces 4 éléments

.Range("E" & L) = Val(Me.TxtNumberPrevA)
.Range("F" & L) = Val(Me.TxtNumberPrevB)
.Range("G" & L) = Val(Me.TxtNumberReelA)
.Range("H" & L) = Val(Me.TxtNumberReelB)

alors j'ai procédé a ce changement la

.Range("E" & L) = Me.TxtNumberPrevA
.Range("F" & L) = Me.TxtNumberPrevB
.Range("G" & L) = Me.TxtNumberReelA
.Range("H" & L) = Me.TxtNumberReelB

j'ai après rencontre un autre problème :

les montants sauvegardé ettait en format texte ce qui fait due vu que j'ai construit un TCD a partir de "DataHisto" celui-ci ne voulait pas faire la somme de ces 4 champs

J'ai alors songer a rectifier comme ca

.Range("E" & L) = Me.TxtNumberPrevA * 1
.Range("F" & L) = Me.TxtNumberPrevB * 1
.Range("G" & L) = Me.TxtNumberReelA * 1
.Range("H" & L) = Me.TxtNumberReelB * 1

la plus de problème pour mon TCD et ma sauvegarde, par contre lorsqu'a la création d'un devis lorsque les "TxtNumberReelA" et "TxtNumberReelB" n'etaient pas renseignés il bloquait sur les lignes

.Range("G" & L) = Me.TxtNumberReelA * 1
.Range("H" & L) = Me.TxtNumberReelB * 1

Normal on ne pe pas multiplier un espace vide.

Donc pour coriger j'ai changer

For Each CTRL In Controls
If CTRL.Tag = "Mandatory" Then
If CTRL.Value = "" Then Bad = Bad + 1
End If
Next

par

For Each CTRL In Controls
If CTRL.Tag = "Mandatory" Then
If CTRL.Value = "" Then Bad = Bad + 1
End If
Next
For Each CTRL In Controls
If CTRL.Tag = "un" Then
If CTRL.Value = "" Then CTRL.Value = 0

End If
Next

en prenant soin d'aller ecrire "un" dans la partie "Tag" des propriétés de "TxtNumberReelA" et de "TxtNumberReelB".

en faisant ces modifications tout fonctionne bien
je voulais simplement ton avis de spécialiste sur mes différents bricolages

Encore Merci de toute l'aide que tu m'a apporte
bonne soirée
A+
Jocelyn
 
@

@+Thierry

Guest
Bonsoir Jocelyn

Inutile de m'envoyer des mails car j'ai eu celui ci (ce long post) directement dans ma BAL puisque je coche systématiquement "Recevoir la réponse par email à l'adresse ci-dessus"...

Surtout que tu n'as pas perdu de temps , ce dernier Post 20-07-04 16:37, et ton mail d'appuie 20/07/2004 16:37 !!! (pas perdu une minute !! lol)

M'enfin !!! ce genre de truc a le don de m'énerver quand j'ouvre ma BAL le soir (je ne consulte pas mes mails pendant la journée) et que je reçois coup sur coup la même demande...

Pour ton problème, oui il est exact quand multipliant les demandes d'élaboration à distance, je n'ai plus vu cette appli tourner depuis un bail et c'est toujours un risque en travaillant par petits bouts sans avoir tous les éléments en main dès le départ, on zap des trucs...

Le coup des décimales c'est un truc que Val ne gère pas, il ne faut pas tout remettre en vrac et ton astuce "Me.TxtNumberPrevA * 1" n'est pas bête, mais très mal vue par VBA, c'est certain...

Non pas la peine de faire toute une usine à Gaz, tout bêtement ceci devrait te tirer d'affaire (sous réserve d'ommission sur le reste des codes et des interactions possibles !!! je téléphone à mon avocat d'ailleurs !! lol)

.Range("E" & L) = CDbl(Me.TxtNumberPrevA)
.Range("F" & L) = CDbl(Me.TxtNumberPrevB)
.Range("G" & L) = CDbl(Me.TxtNumberReelA)
.Range("H" & L) = CDbl(Me.TxtNumberReelB)

Bonne soirée
@+Thierry
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 294
Messages
2 086 896
Membres
103 404
dernier inscrit
sultan87