Bug dans Excel mais je ne comprends pas pk

Hello à vous.

Après avoir réussi à régler un problème grâce à un ancien post sur ce forum, je refait appel à vous pour me re-aider.

Mon programme fonctionne mais lors de la détection d'un doublon dans la colonne Scannage, mon programme se bloque. Je ne peut plus fermer mon Userform1 ni fermer excel. Hé oui il me reste que le contrôle + alt + supp.

Le but de mon fichier est d'utiliser un scan QR code qui fonctionne très bien pour scanner une étiquette et si celle-ci n'a pas encore été scannée, je rentre la date et l'heure dans la colonne A et le numéro de container dans lequel a été mis la pièce scannée.

Tandis que si cette étiquette a déjà été scannée, j'ai un messbox qui me dit que c'est déjà dans le container.

Pouvez-vous m'aider svp?

621234567-copie.xlsm (294.22 Ko)

Bon alors après 2 jours de galère, ben j'ai toujours pas trouvé pk ça bugg comme ça. Tant que je veut saisir des nouveaux codes barre ça fonctionne mais des que je rencontre un doublon, après il m'est impossible de fermer excel mise a part mon ctrl alt supp.

Je laisse tomber pour ce soir et me remets dessus demain.

Biz le forum

Hello,

Ton soucis vient du fait que tu as mal pensé le déroulement des opérations et que tes opérations de fin de procédure TextBox4_AfterUpdate reparte en doublon et du coup reparte en boucle sans fin,...

N'hésite pas à te faire un schéma sur papier de ton déroulé exacte d'opération utilisateur ou un MCD et à le suivre, ça te fera gagner du temps.

Ci-joint ton fichier sans le bug, je te t'ai commenté mes modifs.

Je vais te passer un fichier exemple, histoire que tu vois un principe de schématisation dans un 2ème post.

...


Re :

Voila un exemple de formulaire que j'ai bossé, tu y trouvera un principe de déroulé d'action à faire, de MCD :

Voili voila, pause terminée, je repars à ma torture fiscale.

EDIT : Oui j'allais oublié, pense à lancer tes macros à l'aide du débogueur VBA et à avancer pas à pas par la touche F8 quand tu teste, tu retrouvera la ligne en erreur.

Bye

421234567-copie-4.xlsm (290.54 Ko)

Hello à toi et déjà merci de t’intéresser à mon problème. Désolé pour le retard mais j'étais sur un autre document ces derniers jours.

Une fois la validation effectuée, l'userform1 doit se ré-afficher car en fait l'opératrice utilise un scann datalogic et scanne un datamatrix après l'autre. Elle n'a pas le temps d'utiliser une souris ou un clavier (sauf en cas de doublon ou un msgbox l'informe que le datamatrix qu'elle à scanné à déjà été scanné auparavant=> Doublon dans un numéro de série scanné a la douchette).

En gros mon grafcet

1) Ouverture du userform1 à l'ouverture du fichier (ça c bon j'ai volontairement désactivé lors de mes tests)

2) Rentrer un numéro de container qu'on changera à chaque nouveau conditionnement (le premier sera 1 puis après en fonction de la quantité, la fille passera au numéro suivant)

3) Aller dans la case numéro que je vais scanner et hop flachage du datamatrix

3.1) Le numéro n'est pas dans la colonne B hop je valide une nouvelle ligne avec date+heure now , scannage renseigné dans textbox4 et caisse renseignée dans textbox3 => je réaffiche le userform1 pour continuer à scanner et repart à 3) sauf si je doit changer mon num de container je repart à 2 (je ne veut pas d'incrémentation auto mais une modiff de l'opératrice)

3.2) Le numéro scanné dans textbox4 est déjà dans la colonne B hop msgbox STOP LA COCOTTE TA UN DOUBLON. Si tu clic sur OK ou la croix du msgbox t'arrive sur la feuille excel et tout ce qui est vba n'est plus affiché.

ET LA........ c le drame c'est à ce moment que j'ai envie de fracasser mon clavier.

Je désespère car je n'arrive vraiment pas. Par contre c'est quoi un MCD?

Bonne soirée à toi

Bonsoir le fil, bonsoir le forum,

Si la procédure Exit peut remplacer la procédure AfterUpdate, voilà comment je verrais les choses :

Private O As Worksheet
Private DL As Long

Private Sub UserForm_Initialize()

Set O = Worksheets(1)
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row
TextBox1.Text = O.Cells(DL, 2).Value
TextBox2.Text = O.Cells(DL, 3).Value
TextBox3.Text = O.Cells(DL, 3).Value
var_test = WorksheetFunction.CountIf(O.Range("C6:C1000"), TextBox3.Text)
TextBox5.Text = var_test
End Sub

Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim R As Range

If Me.TextBox4.Value = "" Then Exit Sub
Set R = O.Columns(2).Find(Me.TextBox4.Value, , xlValues, xlWhole)
If R Is Nothing Then
    O.Cells(DL + 1, 1).Value = Now
    O.Cells(DL + 1, 2).Value = Me.TextBox4.Text
    O.Cells(DL + 1, 3).Value = Me.TextBox3.Text
Else
    MsgBox "Doublon detecté"
    Cancel = True
    Me.TextBox4.Value = ""
End If
End Sub

Private Sub CommandButton1_Click()
ActiveWorkbook.Close True
End Sub

Hello a toi.

J'ai essayé avec ton code et ça fonctionne sans planter. Par contre il faut que une fois ma donnée validée (après le flashage du scann, celui-ci envoi bien un saut de ligne comme si tu validait avec entrée), si aucun doublon n'a été détecte et que les données scannées on été rentrées dans le tableau, que mon curseur retourne dans la textbox4 qui sera vide pour poursuivre le scannage.

De plus il faut que les textbox1 et 2 se mettent à jour a chaque scannage afin que la fille voit le dernier numéro rentré dans le tableau. Ce qui veut dire initialisation du userform après chaque scannage.

Oui je sais il rend fou mon programme mais la ça devient urgent je doit recontrôler des centaines voire des milliers de pièces car actuellement elle coche ça sur une feuille.

On vas y arriver

Bonjour le fil, bonjour le forum,

Le code modifié :

Private O As Worksheet
Private DL As Long
Dim TEST As Boolean

Private Sub UserForm_Initialize()

Set O = Worksheets(1)
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row
TextBox1.Text = O.Cells(DL, 2).Value
TextBox2.Text = O.Cells(DL, 3).Value
TextBox3.Text = O.Cells(DL, 3).Value
var_test = WorksheetFunction.CountIf(O.Range("C6:C1000"), TextBox3.Text)
TextBox5.Text = var_test
End Sub

Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim R As Range

If Me.TextBox4.Value = "" Then Exit Sub
If TEST = True Then Exit Sub
TEST = True
Set R = O.Columns(2).Find(Me.TextBox4.Value, , xlValues, xlWhole)
If R Is Nothing Then
    O.Cells(DL + 1, 1).Value = Now
    O.Cells(DL + 1, 2).Value = Me.TextBox4.Text
    O.Cells(DL + 1, 3).Value = Me.TextBox3.Text
Else
    MsgBox "Doublon detecté"
    Cancel = True
    Me.TextBox4.Value = ""
    TEST = False
End If
Unload Me
UserForm1.Show
End Sub

Private Sub CommandButton1_Click()
ActiveWorkbook.Close True
End Sub

Hello tout le monde,

C'est super Thautheme ta procédure exit, je voyais pas son fonctionnement comme ça, par contre le problème c'est que ça lance une validation à chaque sortie de la textbox après entrée et tabulation, perdre la fonction tabulation, ça peut être dommage dans ce formulaire je pense.

J'ai regardé un moment les événements et en adaptant ta solution à l'événement Keydown, quand la fille appuie et seulement appuie sur la touche entrée, elle valide le bouzin, ça me semble cohérent avec un travail de masse sur clavier.

Tiens astuce en pianotant, si appuis sur touche echapp, ça annule.

J'ai rajouté la procédure sauvegarde du fichier quand les données sont ok.

Voila l'idée à la place de Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean), vous en pensez quoi :

Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '<<<<<<<<<<<<< waard
If KeyCode = vbKeyReturn Then   '<<<<<<<<<<<<< waard

Dim R As Range
If Me.TextBox4.Value = "" Then Exit Sub
If TEST = True Then Exit Sub
TEST = True
Set R = O.Columns(2).Find(Me.TextBox4.Value, , xlValues, xlWhole)
If R Is Nothing Then
    O.Cells(DL + 1, 1).Value = Now
    O.Cells(DL + 1, 2).Value = Me.TextBox4.Text
    O.Cells(DL + 1, 3).Value = Me.TextBox3.Text
    ActiveWorkbook.Save '<<<<<<<<<<<<< waard
Else
    MsgBox "Doublon detecté"
    'Cancel = True  '<<<<<<<<<<<<< suppr waard
    Me.TextBox4.Value = ""
    TEST = False
    Unload Me '<<<<<<<<<<<<< waard
    Exit Sub '<<<<<<<<<<<<< waard
End If

Unload Me
UserForm1.Show

End If   '<<<<<<<<<<<<< waard
End Sub

Sinon divers :

1/ Un MCD c'est comme un plan d'architecture (modèle de données conceptuel)

2/ Dans le volet de dev vba, dans affichage, cafard, il y'a une fenêtre propriétés, à partir de là tu peux modifier si l'utilisateur peut entrer dans tel ou tel texbox ou l'ordre de tabulation...

Enabled = true/false si utilisateur peut accéder au contrôle

Tabindex = 0/1/2/3/4/... Ordre d’accès aux contrôles par touche tabulation

J'ai fait un édit, on avait oubliés le point 3.2, quand doublon il faut enlever le formulaire, j'ai doublé la procédure, chez moi j'ai un bug à la fermeture d'Excel.

Hello a vous tous.

Alors suspense................ Ca fonctionnnnnnnnnne, je n'ai plus de crash. Je n'ai pas pu tester avec le scann car un collègue me la déprogrammé donc je verrais cela mardi.

J'aimerai juste rajouter un truc. Pouvez-vous me dire pk il ne le prends pas en compte? C'est dans la textbox4 EXIT

Bizoo

38test-2.xlsm (290.38 Ko)

Re :

Alors pour commencer, le plus simple.

Si tu veux ouvrir l'userform1 à l'ouverture du fichier, utilise une procédure dans un module, ça évitera le bug.

Private Sub Workbook_Open()
'Lancement de la procédure Sub Control dans module 1
control

End Sub

Pour le reste, on va regardez, suspense qui va trouver la solution en 1er ?...

Rapidos di donc

Heuuuu je pige pas trop ton truc control. Workbook Open => Userform1.show c'est pas bon?


Heu rectif. C'est bon j'ai pigé

Et voila, en gros il fallait déclarer les variables de plage minimum et maxi pour la recherche cadre dans ta formule SI.

J'ai ajouté et modifié ça :

'Déclaration du type de variable des données pour calcul dans formule SI
Dim plagemin As Double
Dim plagemax As Double
'définition du montant des plages
plagemin = O.Range("B3").Value
plagemax = O.Range("B4").Value
'Formule si
If Me.TextBox4.Value >= plagemin And Me.TextBox4.Value <= plagemax And R Is Nothing Then

Et sinon code complet de la SUB :

Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim R As Range
Dim plagemin As Double
Dim plagemax As Double

If Me.TextBox4.Value = "" Then Exit Sub
If TEST = True Then Exit Sub
TEST = True
plagemin = O.Range("B3").Value
plagemax = O.Range("B4").Value
Set R = O.Columns(2).Find(Me.TextBox4.Value, , xlValues, xlWhole)

If Me.TextBox4.Value >= plagemin And Me.TextBox4.Value <= plagemax And R Is Nothing Then '<========= ici j'aimerai vérifier que lors de chaque scannage, celui-ci est compris entre range B3 et B4 que je renseignerai lors de la première ouverture du fichier
    O.Cells(DL + 1, 1).Value = Now
    O.Cells(DL + 1, 2).Value = Me.TextBox4.Text
    O.Cells(DL + 1, 3).Value = Me.TextBox3.Text
Else
    MsgBox "Doublon detecté ou num de série hors plage"
    Cancel = True
    Me.TextBox4.Value = ""
    TEST = False
End If
Unload Me
UserForm1.Show
End Sub

J'ai testé, ça semble Ok par rapport à ta recherche (sauf le format nombre qui tient pas, je ne sais pas pk, peut être un bug vista), tiens nous au courant Mercredi si t'a réussis à lancer ce job, c'est toujours sympa de savoir quand quelque chose marche bien quelque part.

Alors toi je sais pas si t'es un garçon ou une fille mais je t'aime. Ça fonctionne tip top.

Par contre peux tu juste m'expliquer les O dans plagemin = O.Range("B3").Value

J'espère que ça vas être bon mais ç’a a l'air bien parti. Actuellement les filles n'en peuvent plus de noter dans un cahier et niveau traca c'est pas top.

Les gens m'appellent "Dieu", sa a un sexe un Dieu ? Sinon Tristan dans la signature en bas du post, tu pense que c'est garçon ou fille ?

J'ai fais l'appli. Myrmidon Lettrage dans la rubrique téléchargement.

ttp://www.excel-pratique.com/fr/telechargements/outils-de-gestion/myrmidon-lettrage-no172.php

En fait Thautheme à créé une variable raccourcis O, qu'il définit comme feuille1 dans la SUB Private Sub UserForm_Initialize()

Set O = Worksheets(1)

ça évite de se taper des codes de 15 bornes de long, c'est à ça qu'on voit qu'il est malin

Code remplacé : Worksheets(1)

Du coup avec le recul je m'aperçois que la variable n'est pas définit dans la SUB Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Alors voilà le code de cette SUB avec le bout manquant (de toute façon, par défaut, c'est toujours feuil1, mais sécurité avant tout) :

Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim R As Range
Dim plagemin As Double
Dim plagemax As Double
Set O = Worksheets(1)

If Me.TextBox4.Value = "" Then Exit Sub
If TEST = True Then Exit Sub
TEST = True
plagemin = O.Range("B3").Value
plagemax = O.Range("B4").Value
Set R = O.Columns(2).Find(Me.TextBox4.Value, , xlValues, xlWhole)

If Me.TextBox4.Value >= plagemin And Me.TextBox4.Value <= plagemax And R Is Nothing Then '<========= ici j'aimerai vérifier que lors de chaque scannage, celui-ci est compris entre range B3 et B4 que je renseignerai lors de la première ouverture du fichier
    O.Cells(DL + 1, 1).Value = Now
    O.Cells(DL + 1, 2).Value = Me.TextBox4.Text
    O.Cells(DL + 1, 3).Value = Me.TextBox3.Text
Else
    MsgBox "Doublon detecté ou num de série hors plage"
    Cancel = True
    Me.TextBox4.Value = ""
    TEST = False
End If
Unload Me
UserForm1.Show
End Sub

Bon par rapport à ce que tu demandais, t'a l'air bien partis pour lancer avec succès ton projet, alors merde comme on dit

Allez bonne nuit

Bonne nuit à vous tous. Du coup vivement mardi lol

Non le week-end c'est appréciable aussi. Mangez pas trop de chocolat.

Je viens d'aller sur ton lien et direct j'ai vu ton image. La ligne de production sur laquelle je travaille s'appelle SPARTA

Voila je viens d'effectuer des modifs. Dites moi ce que vous en pensez. Et surtout me dire si il y a un prob dans ma programmation.

J'ai rajouté:

Lors du PREMIER scannage si textbox3 n'a pas été modifié (nombre au lieu de caisse) msg d'erreur demandant de modifier.

Lors du scannage si la quantité textbox5 = textbox8 msg disant container plein et reset du userform1

Lors du scannage si la quantité textbox6 = textbox7 msg disant série terminée et fermeture du userform1 (ça j'ai pas trouvé)

Lors du scannage si le numéro scanné n'est pas compris entre D1 inclus et D2 inclus, Msg disant appelle ton boss

Lors de l'initialisation de userform1 mettre à jour textbox 5 (nombre de scannage correspondant au container textbox3). Il redémarrera a 1 quand la fille changera la case container du prochain scannage (textbox3)

Lors de l'initialisation de userform1 mettre à jour textbox 6 (nombre de scannage TOTAL)

Lors de l'initialisation de userform1 afficher range D3 dans textbox8

Lors de l'initialisation de userform1 afficher range B3 dans textbox7

Toutes les données caractérisant ma série (B1,B2,B3,D1,D2,D3) sont attribuées par le userform2 lors de l'ouverture d'un nouveau fichier.

J'ai surement dû en oublier lol Mais la ça devient super bien complet pour mon utilisation ca vas vraiment leur simplifier la vie.

Bonne journée à vous

PS le code de déverrouillage de ma feuille est 3325 je pense que vous l'auriez vu dans le VBA

Re :

Attention Spartiate , voici 2/3 trucs que le cyclope m'a rapporté, si tu veux faire face aux perses pompes

Code d'avertissement vocal :


Un code pour lancer un message vocale sympa :

Sub gros_coup_de_stress_sans_justification()
'Comment lancer un message vocale pour faire un gros coup de stress le 1er avril 2016
Application.Speech.Speak ("Bordel!" & Application.UserName & "!" & "c'est ton boss!, ton ordi me rapporte trop d'erreur! viens à mon bureau immédiatement cocotte!")
End Sub

A. Code de contrôle :

1/ Controle saisie non numeric Private Sub TextBox3_KeyPress :

Pas mal, tu l'a trouvé chez developpez ? Chez moi ça beep pas, mais ça marche pour le reste, si tu veux que des chiffres 0123456789 tu à aussi isnumeric, ça interdit les points et les virgules par contre (pas besoin pour la textbox4 et l'userform2 ?).

'Pour obliger à ne saisir que des valeurs numeric : 0123456789
If Not IsNumeric(Me.TextBox3.Value) Then
MsgBox "Numéro non numérique ou contenant virgule ou point"
Exit Sub
End If

Par contre, comme tu à un événement de contrôle de saisie avec la textbox3, qui ne permet de ne saisir que des chiffres, ça rends inutile le code de contrôle dans la SUB : Private Sub TextBox4_Exit

Ce code de contrôle de textbox3 devient superflus :

If TextBox3.Text = "Caisse" Then
MsgBox "Numéro de caisse non attribué correctement. Veuillez Modifier le numéro de container du prochain scannage.", vbInformation
GoTo FIN
End If

2. Contrôle contenu textbox4

Pour l'instant dans la sub Private Sub TextBox4_Exit, tu contrôle s'il y'a bien du contenu, mais si tu devrais aussi contrôler s'il n'y qu'un espace en guise de numéro, par contre ça devient superflus, si tu pose un contrôle isnumeric, vu que ça bloque ce genre d'erreur :

Code existant :

If Me.TextBox4.Value = "" Then Exit Sub

Code à corriger (je peux entrer des espaces en guise de numéros, à faire aussi dans les autres textbox je suppose) :

If Me.TextBox4.Value = "" or Me.TextBox4.Value = " " Then Exit Sub

Et y'a aussi la recherche de caractères interdits à l'intérieur d'une chaine de texte ou de numéros :

Interdire un espace qui se baladerait comme ça 123 456 dans la textbox1 de l'userform2 (mais idem devient inutile je pense avec le controle numeric) :

If InStr(1, TextBox1.Value, " ", vbTextCompare) <> 0 Then
MsgBox "il y'a espace dans la textbox1 de l'userform2", vbCritical, "MESSAGE D'INFORMATION"
Cancel = True
GoTo ERREUR
End If

3. Suivant question : Lors du scannage si la quantité textbox6 = textbox7 msg disant série terminée et fermeture du userform1 (ça j'ai pas trouvé)

Si j'ai bien compris, il suffit juste de mettre une formule si de controle à l'initialisation de l'userform1, y'a bon ?

A placer à la fin de la sub userform1 : Private Sub UserForm_Initialize()

If TextBox6.Value >= TextBox7.Value Then
MsgBox "quantité textbox6 = textbox7 msg disant série terminée et fermeture du userform1"
Unload UserForm1
End
End If

B. Variables agiles pour rendre le calcul du tableur plus agile :

Par exemple, ta des codes qui fixe la limite de calcul du tableur sur des plages fixes, genre celle ci-dessous, si tu utilise une méthode plus agile qui prend en compte la dernière ligne pleine de ton tableur, le machin ne reste pas figé à C10005, mais se fixe au besoin au fur et à mesure, suivant la taille du tableau :

var_test = WorksheetFunction.CountIf(O.Range("C6:C10005"), TextBox3.Text)

Comme ça si tu est à C12006 le code continue à fonctionner Range("C6", Range("C6").End(xlDown))

var_test = WorksheetFunction.CountIf(O.Range("C6", Range("C6").End(xlDown)).Select, TextBox3.Text)

Au besoin, voir ma note de cours ci-jointe


C. Propriétés de textbox pouvant être fixés sans codes VBA dans fenêtres de propriété de textbox :

Tu peux fixer une longueur maxi, à la propriété maxlength


D. Mes questions d'alphabétatesteur :

1. Tes textbox de formulaire, prennent bien que des nombres ? Si oui de type 0123456789., ? Ou de type 0123456789 ?

Si 0123456789, tu n'a qu'a coller un contrôle IF isnumeric pour valider, tout ce qui n'est pas 0123456789 ne sera pas validé, pas besoin de s'occuper d'espace,...

2. As tu des tailles minimales à fixer dans tes numéros en guise de contrôle ? (Maxi à faire dans les propriétés de textbox, facile)

3. J'ai eu des soucis de fermeture d'Excel, après que le formulaire se ferme en auto (il est tard, mais il me semble qu'unload ne signifie pas fermer mais cacher, du coup, il continu à tourner en tâche de fonds et empêche la fermeture d'Excel), je ne sais pas si chez toi aussi, si c'est le cas au lieu de fermer les formulaires comme ça :

Unload UserForm1

Fais ça :

Unload UserForm1
End

Sauf ici c'est bon, il n'y a pas de soucis :

FIN:
    Unload Me
    UserForm1.Show

Bon au final je pensais passer 1h dessus, il est minuit, excuse moi si je ne corrige pas toutes les fautes, fatigué des yeux.

Moi ça me semble bon, le plus gros truc, c'est de transformer les contrôles saisie SI espace, vide, texte alors erreur > en controle SI PAS Numeric alors erreur, recommence.

Je pensais en mettre après chaque modifs de textbox dans l'userform2 (en reprenant l'événement Exit), mais vu comment t'a fait ça semble bien aussi, mais à voir en opération, je vois pas l'ampleur du boulot lié à l'utilisation de l'userform2, si c'est pour économiser 3-5 minutes sur une journée, ça ne vaut pas le coup de s'y pencher plus.

Pour ma part j'ai fais des tests, je ne vois pas quel genre d'erreurs je pourrais faire en plus, à toi de voir ce qu'en opération, le genre d'erreurs que vous pouvez avoir en l'utilisant en masse...

Après moi, par rapport à ce que tu nous à indiqué, ça me semble pouvoir être opérationnel pour Mardi, tu va pouvoir passer le week-end à faire de beaux userform avec les logos de la boite et des photos du personnel en mangeant des chocolats, cool .

Allez spartiate, vous serez peut être que 300, mais pourtant vous serez une multitude, ha ha

Hello

J'espère que tu as bien dormi. J'étais MDR en essayant ton truc vocal. En tout cas c'est pas mal.

Il y a juste quelques trucs que je ne pige pas. Si tu peut m'éclairer?

Me c'est quoi que ce truc? Et le If TEST= Tue car la ligne du dessous tu as aussi TEST=True

If Me.TextBox4.Value = "" Then Exit Sub
If TEST = True Then Exit Sub
TEST = True

Est-ce que j'ai besoin de déclarer les variables

plagemin = O.Range("D1").Value
plagemax = O.Range("D2").Value
contplein = WorksheetFunction.CountIf(O.Range("C6:C10005"), TextBox3.Text)
finserie = Application.WorksheetFunction.Count(O.Range("B6:B10005"))

avec celles-ci tout en haur?

Private O As Worksheet
Private DL As Long
Dim TEST As Boolean

J'ai peur que ca bugg si je déclare pas correctement les variables (ex type de variable)

Hello,

Oui j'aime le coup du message vocale et avec la formule IF et application.username, il est même possible de faire des blagues personnalisées, mettre un peu de fun dans le boulot ça améliore la productivité/sa rapproche les gens ou de faire des trucs plus sérieux, genre ne pas activer la protection feuille si c'est toi...

Bon sinon,

cafard a écrit :

Hello

Me c'est quoi que ce truc? Et le If TEST= Tue car la ligne du dessous tu as aussi TEST=True

If Me.TextBox4.Value = "" Then Exit Sub
If TEST = True Then Exit Sub
TEST = True

C'est un TEST pour remettre à jour les valeurs des textbox de l'userform1 après chaque validation réussis, si doublon, message doublon et pas de mise à jour et en même temps ça créé une boucle qui permet de revenir dans la textbox4.

Voilà le schéma du TEST

0. Déclaration variable générale TEST OUI/NON pour être utilisé dans tout l'userform1 Dim TEST As Boolean valeur par défaut Faux

>>1. 1er lancement - Quant sortie d'une quelconque manière de la textbox4 - Private Sub TextBox4_Exit

>>>>1.1 Contrôle si test t vrai, 1er lancement dit non - poursuite du code

>>>>1.2 Définition de Test comme étant vrai, afin de créer une porte de sortie à la boucle plus tard, histoire d'éviter un freezing

>>2. Si OK Pas de doublon alors enregistrement du numéro scanné

>>3. Unload Me lance en auto la SUB Private Sub UserForm_Activate(), puisque caché ou montrer l'userform, l'active

>>>>3.1 Mise à jour des Textbox

>>4. Retour en auto (c'est une boucle), dans la procédure Private Sub TextBox4_Exit - 2e lancement

>>>>1.1 Contrôle si test vrai, 2e lancement dit VRAI - arrêt du code, l'utilisateur rentre un 2e numéro

>>2. Variante SI Doublon, alors Test FAUX, pas de mise à jour, message d'erreur, puis remise à zéro de textbox4

>>>>2.1 on sort de la formule SI

>>>>2.2 l'userform1 disparait

>>>>2.3 puis réapparait (voir avis en bas)

>>>>2.4 fin de la sub Private Sub TextBox4_Exit, l'utilisateur est informé du doublon et reste sur l'userform1

Mon avis, c'est qu'en cas de doublon, si l'utilisateur doit revenir sur la page Excel autant prévoir la procédure de sortie dans la partie Sinon/Else ou alors si l'utilisateur doit rester sur l'userform1, alors de seulement sortir de la procédure de validation du numéro.

Code actuel

Else
   MsgBox "Doublon détecté ou numéro de série hors plage. Veuillez contacter votre Manager et ne plus rien sortir de la ligne.", vbCritical, "ATTENTION!!!!!"
   Cancel = True
   Me.TextBox4.Value = ""
   TEST = False
End If

Correction proposé pour sortir de l'userform1

Else
   MsgBox "Doublon détecté ou numéro de série hors plage. Veuillez contacter votre Manager et ne plus rien sortir de la ligne.", vbCritical, "ATTENTION!!!!!"
   Cancel = True
   Me.TextBox4.Value = ""
   TEST = False
    Unload Me 'Enlève l'userform1
   Exit Sub 'Sort de la Sub, si problème d'enregistrement ou pour partir d'excel remplacer exit sub par END
End If

Code proposé pour resté sur l'userform1

Else
   MsgBox "Doublon détecté ou numéro de série hors plage. Veuillez contacter votre Manager et ne plus rien sortir de la ligne.", vbCritical, "ATTENTION!!!!!"
   Cancel = True
   Me.TextBox4.Value = ""
   TEST = False
   Exit Sub 'Sort de la Sub, si problème d'enregistrement ou pour partir d'excel remplacer exit sub par END
End If

cafard a écrit :

Est-ce que j'ai besoin de déclarer les variables

plagemin = O.Range("D1").Value
plagemax = O.Range("D2").Value
contplein = WorksheetFunction.CountIf(O.Range("C6:C10005"), TextBox3.Text)
finserie = Application.WorksheetFunction.Count(O.Range("B6:B10005"))

avec celles-ci tout en haur?

Private O As Worksheet
Private DL As Long
Dim TEST As Boolean

J'ai peur que ca bugg si je déclare pas correctement les variables (ex type de variable)

J'ai l’impression que je dois faire un topo

0/ Les déclarations de variables permettent entre autre de limiter le poids de la mémoire utilisé par une donnée Excel, en évitant à Excel de stocker pour le traitement, un formulaire contenant tout un tas d'informations, comme la date en cours, l'utilisateur,... à chaque fois, dans ton cas, ton programme est très léger, au pire tu n'utilisera jamais plus que de quelques octets à la nanoseconde...

1/ Alors sinon tu a 2 types de variables, les variables générales qui doivent servir dans toutes les procédures d'un module/userform et les variables particulières qui ne serviront que dans une procédure.

2/ Il faut distinguer la déclaration et la définition, la définition ne se fait que dans une procédure.

3/ La déclaration permet de spécifier le type de données utilisé (si texte, date, numérique, vrai/faux,...) par défaut la valeur est variant (tout type de données) ce qui peut à la fois éviter de déclarer les variables ou causer des bugs, comme du genre de plagemini, qui sans spécification qu'il s'agit uniquement de nombre, laisse croire à Excel que cela peut être du texte et empêche le calcul dans la formule SI.

4/ Une variable générale peut être définie que dans une seule SUB (procédure) et gardera sa valeur acquise dans les SUB suivantes

ou être redéfinie plus tard dans la SUB ou dans une autre SUB, en fonction du besoin, en résumé c'est une variable commune à plusieurs SUB (un peu comme une Nationnalité dans un Etat Fédéral).

Par exemple, il serait possible lors de l'initialisation de l'userform1, de dire que TEST est vrai et lors de Textbox4_exit, rien ne se passerait, puisqu'au tout début de la procédure, elle te sort directe .

Déclaration de variable :

Dim TEST As Boolean

Définition de variable :

TEST = False

Si tu n'utilise pas de variable dans plus d'une procédure, ce n'est pas la peine de les déclarer en générale, le faire dans la procédure en cause c'est bon.

>> Pour TEST par exemple comme c'est une boucle qui tourne dans l'userform1 et qui sert d'interrupteur, si tu la colle uniquement dans la sub textbox4_exit, la boucle prend une déviation et lance une 2e boucle et bug... car elle se réinitialise à valeur Faux, au lieu de rester sur vrai et empêche la réouverture de l'userform1, car celui-ci n'a pas disparut, puisqu'il est toujours actif et il te dit impossible d'afficher l'userform, puisque celui-ci est déjà affiché....

Pour l'instant ces variables ne sont utilisées que dans une seule procédure, donc pas besoin de les coller en générale :

var_test >> voir 1

totemb >> voir 1

R <<< OK type de données déclarées

plagemin <<< OK type de données déclarées

plagemax <<< OK type de données déclarées

contplein >> voir 2

1. Tu ne fais rien de particulier avec ces variables, maintenant tu peux spécifier qu'il ne s'agit seulement que de données numeric et non de texte, date, ..., sauf si tu songe à y coller des données alphanumériques, donc dans ce cas le type variant actuel est bon, il ne sert à rien de toucher.

Dim totemb As Double
Dim var_test As Double

2. Là tu utilise la variable pour faire un calcul, sans, ça marche comme même, mais tu peux lui spécifier que c'est une variable numeric dans la SUB en cours, en dessous de la Dim plagemax As Double

Dim contplein As Double

Et ça tu peux y passer en variables générales

Dim finserie As Double

Sinon moi je n'ai pas eu de bug, tout marche, maintenant si tu créé d'autre variable, sache qu'à partir du moment où tu les utilises pour faire du calcul, il vaut mieux les spécifier comme étant des données numérique, ça évitera le bug plagemini ou si tu utilise des variable devant contenir un type de donnée extrêmement précis du genre VRAI/FAUX / Date / Texte.


Pour terminer tu l'a bien vu mon idée du post du 02 Avr 2015, 11:37, de ne valider les données de la textbox4 que si la touche entrer est appuyée ?


Bon j'ai encore passé 3h à faire un roman mais je ne voyais pas trop comment faire plus synthétique, sans connaitre ton niveau.

Rechercher des sujets similaires à "bug comprends pas"