Recherche VBA pour remplir Excel
Bonjour le forum,
Voila j'ai un petit soucis sur un code VBA
Sur un USF j'ai un bouton, j'aimerai lorsqu'on click sur le bouton plusieurs chose se produise
1 - faire une recherche dans le tableau Data Voir si la valeur de la Textbox (T1) correspond a une des valeurs de la colonne B du tableau Data, Si elle existe remplace les données des colonnes C D E par les valeurs de T2 T3 T4 , Si elle n'existe pas Remplir les colonnes B C D E du tableau Data avec les textbox T1 T2 T3 T4 après la dernière ligne du tableau non vide.
2 - ouvrir un fichier excel nommé Résultat ( sa c'est OK)
3 - faire une recherche dans le tableau Résultat Voir si la valeur de la Textbox (T1) correspond a une des valeurs de la colonne C du tableau Résultat, Si elle existe remplace les données des colonnes A B D E par les valeurs de T0 T2 T3 T4 , Si elle n'existe pas Remplir les colonnes A B C D E du tableau Data avec les textbox T0 T1 T2 T3 T4 après la dernière ligne du tableau non vide.
je le résume ici de manière simplifié pour éviter d'avoir tout ce qu'il doit prendre en compte je pose juste ce qui me pose problème, les points 1 et 3 ...
Si quelqu'un a une solution car je n'avance plus et il me manque que cela pour finir mon usf
merci bien
je joint un fichier
Bonjour,
Private Sub CommandButton1_Click()
Dim cRef As Range, clé(1 To 4), i%
For i = 1 To 4
With Controls("T" & i)
If .Value <> "" Then
clé(i) = .Value
Else
MsgBox "Compléter la saisie !", vbExclamation, "Saisie incomplète"
.SetFocus
Exit Sub
End If
End With
Next i
Set cRef = Worksheets("Data").Range("B6"): i = 0
With cRef
Do While .Cells(i, 1) <> ""
If .Cells(i, 1) = clé(1) Then Exit Do
i = i + 1
Loop
.Cells(i, 1).Resize(, 4).Value = clé
End With
With Workbooks.Open(ThisWorkbook.Path & "\Résultat test.xlsx")
Set cRef = Worksheets("Résultat").Range("C8"): i = 0
End With
With cRef
Do While .Cells(i, 1) <> ""
If .Cells(i, 1) = clé(1) Then Exit Do
i = i + 1
Loop
.Cells(i, 1).Resize(, 4).Value = clé
If IsDate(T0.Value) Then .Cells(i, 0) = CDate(T0.Value)
End With
End SubRectification d'office de l'erreur d'énoncé en 3...
On a supposé que le classeur Résultat test était dans le même dossier que le classeur test clé.
Cordialement.
edit : Il serait judicieux d'ajuster l'ordre de tabulation à l'ordre de TextBox...
Merci je vais tester et essayer de comprendre
OK pour les deux fichiers rangés au même endroit
Par contre j'ai du mal à comprendre ...
Et quand je le teste il y a une erreur Set cRef = Worksheets("Data").Range("B6"): i = 0
Pas vu que tu avais déjà réagi... Je replace mon edit :
edit : Il serait judicieux d'ajuster l'ordre de tabulation à l'ordre de TextBox...
Pour modifier l'ordre de tabulation, clic droit dans un emplacement vide du Userform et Ordre de tabulation.
Cordialement.
Par contre j'ai du mal à comprendre, peux me détailler le code stp
Et quand je le teste il y a une erreur Set cRef = Worksheets("Data").Range("B6"): i = 0
Enfaite je ne peux pas écrire deux fois la même valeur dans la T1 il ne remplace pas les valeurs dans résultats et me met erreur
OKay je vais voir pour l'ordre de tabulation d'habitude je le fais mais la c'est pas le fichier complet c'est juste un test
Merci
Re,
Le code que j'ai fourni répond à tes spécifications... mais il conviendrait de savoir comment tu testes, car ce code demeure incomplet :
- pas de proc. de lancement du Userform,
- pas de fermeture du Userform,
- pas d'enregistrement du classeur Résultat, ni de fermeture...
Mais en tout cas je ne vois pas pourquoi il y aurait une erreur sur la ligne que tu indiques :
Set cRef = Worksheets("Data").Range("B6")Affectation d'une référence de cellule à une variable objet (typée Range) : rien de transcendant !
Quel serait donc le numéro d'erreur survenant sur cette ligne ?
Et je n'ai aucune erreur en intervenant plusieurs fois sur les mêmes valeurs d'identification, les valeurs se modifient dans les deux fichiers...
La proc. ne se pose pas de question, si elle trouve l'identifiant elle remplace les 4 valeurs par celles issues des TextBox !
Cordialement.
Okay effectivement je pense qu'il manque l'enregistrement et la fermeture du fichier pour que cela fonctionne bien.
je vais essayer de l'adapter a mon cahier des charges et je reviendrai vers toi si je n'y parviens pas.
Bien cordialement
et encore merci
Bonjour,
j'ai un soucis avec le code que tu m'as transmis car j'ai oublié de te dire que j'avais 5 valeurs dans le premier tableau et j'en ai 10 dans le second comment procéder pour qu'il me prenne que les 5 dans le premier et les 10 pour le second ?
de plus comment faire pour enregistrer d'abord le second fichier et le fermer puis enregistrer le premier sans le fermer pour revenir a zéro ?
Merci
cordialement,
Bonjour,
Sérions les questions...
1) Il te faut un bouton ou un autre dispositif de lancement du Userform... Où le mettre ? C'est à toi de voir, ton modèle ne comportait qu'une feuille mais ton fichier original en a sans doute d'autres...
Le code pour ouvrir se limitant à une ligne ne pose pas de problème particulier. (UserForm1.Show)
2) Un bouton de fermeture est nécessaire sur le Userform, d'une part parce qu'il faut pouvoir le fermer après usage, et d'autre part il convient que l'utilisateur ait toujours la possibilité d'abandonner l'opération en cours sans rien faire...
Coder ce bouton ne pose aussi guère de problème. (Unload Me)
2bis) Parallèlement, il te faut décider si à l'issue d'une opération tu fermes le Userform ou si tu gardes la possibilité de réaliser une nouvelle opération.
Dans le 1er cas, une ligne Unload Me concluera ta procédure de validation par la fermeture...
Dans le 2nd, il convient de réinitialiser les TextBox (éliminer leur contenu) pour qu'une nouvelle opération puisse intervenir...
Ce sera alors soit l'appel d'une procédure annexe, soit le même code en fin de validation : une boucle qui ramène la valeur de chaque TextBox à "".
3) La question du second classeur : plusieurs choix sont possibles, mais si l'on laisse la possibilité d'enchaîner plusieurs opérations, ma préférence irait à ne pas le fermer à la suite de chacune...
Au lieu d'ouvrir systématiquement le classeur :
...
On Error GoTo OuvrirWbk
With Workbooks("Résultat test.xlsx")
Set cRef = .Range("C8"): i = 0
End With
On Error GoTo 0
...
Exit Sub
OuvrirWbk:
Workbooks.Open (ThisWorkbook.Path & "\Résultat test.xlsx")
Resume
End SubLors de l'appel du classeur pour initialiser cRef, s'il n'est pas ouvert, une erreur se produit : la gestion de cette erreur renvoie à une commande d'ouverture du classeur, suivie d'un retour sur la ligne d'erreur qui peut alors s'exécuter sans erreur...
4) En ce qui concerne 5 ou 10... je ne vois pas ce qu'il en est : ton Userform comporte 5 TextBox, parmi eux 4 (T1 à T4) contiennent des valeurs reprises dans les deux classeurs sur 4 cellules consécutives en ligne (T1 servant d'identifiant de la ligne pour la rechercher si elle existe...)
On pouvait ainsi, comme fait, récupérer ces 4 valeurs dans un tableau et affecter le tableau à chacun des classeurs en une seule fois...
La dernière TextBox T0 contenant une date à n'affecter que dans le second classeur...
Je ne vois donc pas quel passage de 5 à 10 serait à opérer...
Cordialement.
Je te joins le fichier complet pour que cela soit plus simple a comprendre car je dois mal m'exprimer
Je joins également le fichier résultat
bien cordialement,
Je n'ai pas le temps de regarder en détail maintenant... (à suivre) mais ma première réflexion est que 3 Userforms quasi identiques, il y en a 2 de trop !
Cordialement.
Okay mais je ne voyais pas comment faire autrement mais du coup tu ne réponds pas a ma question de comment adapter le code que tu m'as donné
Je ne suis pas un pro de Vba donc je fais comme je pense c'est tout.
Merci de ton aide.