Création de tableau à partir d'une textbox et d'un autre tableau

Bonjour,

Je suis en début d'apprentissage de VBA, je cherche à :

  • Trouver dans un tableau des éléments à l'aide d'une textBox1 (l'élément peut être à plusieurs reprises dans le tableau)
  • Copier ce ou ces éléments dans un tableau sur une autre page
  • Copier certaines informations de la ligne de l'élément (les informations peuvent changés en fonction de la ligne) dans ce nouveau tableau

J'aurais vraiment besoin d'un coup de main si quelqu'un se sent d'attaque !

Merci

Bonjour,

je veux bien t'aider mais du coup il me faudrait plus d'éléments

Bonjour,

Je vous ai fait un exemple,

Je cherche à trouver les prénoms en double et les rentrer dans le tableau de la deuxième page

Le but est de copier uniquement certains éléments de la ligne du prénom

Je cherche à passer par un userform et une textbox

Merci !

61exemple.xlsm (20.66 Ko)

Re bonjour,

Je crois que tu as souci pour expliquer ce que tu souhaites, tu parles de données en double à faire ressortir sur ton tableau, je pense que tu parles plutôt de faire apparaitre les lignes pour lesquelles le prénom correspond au critère de recherche que tu mets dans ton formulaire. En fait tu veux quasiment faire un filtre avancé avec affichage du résultat ailleurs que sur la plage sur laquelle tu filtres.

D'ailleurs ce genre d'exercice peut se faire avec une Listbox dans le formulaire qui affiche uniquement les résultats qui remplissent le critière

Du coup tu veux faire le code par toi même je suppose, tu veux qu'on fasse pas-à-pas au fur et à mesure que tu as des questions?

Bonjour,

Je ne sais pas comment expliquer clairement

on va essayer par cas :

Cas 1 : le nom de la textebox n'est présente qu'une fois dans le tableau, alors la ligne qui contient le prénom est recopiée dans un tableau à part, mais je ne cherche pas à recopier la ligne entière mais que quelques éléments comme la ville ou le sport

Ex : Laure = 1 fois donc je recopie dans le tableau Laure, Paris, Foot

Cas2 : le prénom est présent plusieurs fois, je veux recopier dans un tableau les différentes lignes correspondantes au prénom avec les éléments de chaque ligne

Ex : Pierre = 2 fois = 2 lignes dans le tableau, avec à chaque fois la ville et le sport

Je suis obligée de le faire en VBA, et je n'ai aucune idée de quoi faire ou de quoi écrire :/

Je ne peux pas utiliser de liste box parce que le fichier source contient plusieurs centaines de référence

Bonjour

J'ai donc bien compris ce que tu veux faire:

Filtrer tes données pour ne faire apparaître que les lignes dont le prénom correspond à celui saisi, tes cas 1 et 2 sont pour moi identiques, tu vas parcourir toutes tes données et à chaque ligne dont le prénom correspond à celui cherché, tu copies la ligne dans le tableau de résultat.

En clair de ce que je vois il faut:

  • gérer un tableau de données à traiter dont le nombre de lignes est variable
  • parcourir toutes les lignes à la recherche de celles qui correspondent au critère de recherche
  • extraire dans un tableau de résultat certaines informations des lignes correspondantes

Je te conseille déjà de passer par des tableaux VBA à deux dimensions, tu pourras faire appel aux données de ces tableaux comme ceci: monTableau(ligne,colonne).

Il existe de nombreuses façons de rentrer des données dans un tableau, mais pour ton cas, le plus simple sera de faire quelque chose comme :

monTableau = Range(maPlageDeCellules)

ainsi les valeurs de chacunes de tes cellules dans ta plage seront enregistrées dans le tableau, ton tableau commencera par monTableau(1,1) avec la cellule en haut à gauche de ta plage de cellules.

Le mieux serait que tu expérimentes


Une solution pour le nombre de lignes variables, ce serait de faire:

monTableau = Range("a2","m50000")

Cette solution marche si ton nombre de lignes est toujours inférieur à 50 000, mais ce n'est pas optimisé car la plupart du temps tu enregistreras tout un tas de lignes vides...

Une autre solution bien meilleure, c'est d'obtenir le numéro de ligne de la dernière ligne remplie de ton tableau, on peut faire ça de la façon suivante:

ligFin = Range("a" & Rows.Count).End(xlUp).Row

Cette ligne de code va peut-être te parraître barbare au départ, je vais l'expliquer: sur Excel, tu peux rapidement arriver à la fin d'un tableau de données en partant de la cellule A1 et en faisant Ctrl + flèche du bas, ce qui en VBA donnera :

Range("A1").end(xldown)

Le truc c'est que si tu as une ligne vide dans ton tableau de données au niveau de la colonne A (ce qui peut arriver, on ne sait jamais), tu vas t'arrêter avant la réelle fin de ton tableau, ce que je fais de mon côté, c'est que je vais à la dernière ligne en colonne A, et que je remonte avec Ctrl + flèche du haut :

Range("A" & Rows.Count).End(xlUp)

Tu remarqueras que j'écris "A" & Rows.Count pour la référence, en fait tu as une partie fixe, la colonne A: "A", et une partie variable: Rows.Count qui renvoie le nombre de lignes dans la feuille du classeur (pour aller à la dernière ligne sans se soucier de son numéro c'est le top), pour assembler la partie fixe et la variable, j'utilise une concaténation avec : &

En clair en faisant:

Range("a" & Rows.Count).End(xlUp)

Je pars de la dernière ligne en colonne A (qui généralement est vide), et je pars vers le haut pour m'arrêter sur la première cellule remplie de ton tableau en colonne A, j'utilise ensuite .Row pour obtenir son numéro de ligne.

Je répondrai aux points suivants un peu plus tard pour ne pas t'envoyer trop d'informations d'un coup, je te conseille d'abord d'expérimenter un peu ça

Bonjour,

Merci pour les infos, j'ai un peu essayé et j'ai compris le principe.

Mais du coup est-ce que je relis ligFin à monTableau ?

Et pour la suite ?

Merci du temps que tu as pris pour rendre ça clair

Re!

Oui il faut lier ligfin à ton tableau en faisant:

monTableau = Range("a2","m" & ligfin)

Pour la suite je t'en parlerai plus tard, mais pour les boucles tu pourras utiliser lbound() et ubound() pour connaître la dimension de ton tableau

Voici un petit lien qui pourra t'aider: https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/lbound-function

Comme ça tu auras déjà: enregistrement du tableau de départ, et parcourir ce tableau, ensuite il y aura une condition If et l'export des données de la ligne dans un nouveau tableau

Bonjour,

Mon dieu je suis perdue xD

Bon du coup si je comprends bien, là c'est juste pour dimensionner un tableau

Mais pourquoi mettre "m" ?

Et à quoi va me servir ce tableau ?

Merci

Pas de souci je vais expliquer

En fait tu veux parcourir toute ta base de données, ton tableau, pour voir quelles lignes ont le prénom que tu recherche afin de les mettre en résultat, je te propose de passer par des tableaux VBA pour accélérer le code, du coup je t'ai donné un exemple pour enregistrer un tableau de taille variable (ta base de données) afin de le parcourir par la suite, l'exemple:

Sub test()
ligFin = Range("a" & rows.count).end(xlup).row 'pour avoir le numéro de la dernière ligne remplie de ta base de données
monTableau = Range("a2","m" & ligFin) 'pour enregitrer toutes les cellules entre a2 et m50 par exemple dans un tableau VBA
End Sub

Ce code te permet d'enregitrer un tableau allant de la colonne A à la colonne M, dont le nombre de lignes peut varier, ça te permettra ensuite de le parcourir en VBA (pour aller plus vite qu'en parcourant directement sur la feuille de calcul), un exemple pour le parcourir:

Sub test()
ligFin = Range("a" & rows.count).end(xlup).row
monTableau = Range("a2","m" & ligFin)

For i = lbound(monTableau,1) to ubound(monTableau,1)
    msgbox monTableau(i,1) 'pour afficher tous les prénoms
Next i
End Sub

Est-ce que c'est déjà un peu plus clair pour toi?

Ici il s'agit juste d'éviter de parcourir toute la feuille de calcul en passant plutôt par un tableau VBA qui contiendra toutes les valeurs de ta base de données

Je peux te proposer autre chose sinon, on reste sur quelque chose de simple pour commencer, et on voit plus tard pour passer par des tableaux VBA, qu'en penses-tu? ça te permettrait de déjà mieux comprendre et mieux suivre je pense... Les tableaux VBA c'est un peu lourd pour commencer l'apprentissage VBA je me dis

Re !

Donc si je comprends bien, là avec ton code j'ai enregistré toutes les valeurs du tableau, et ça va me permettre de le parcourir ?

J'ai bien les prénoms qui apparaissent sur la message box de l'autre page au fur et à mesure.

Comment je peux faire maintenant pour chercher précisément un nom avec mon textbox ?

Merci beaucoup !

De rien

Va pour la solution VBA alors

Pour chercher la valeur de la TextBox, il suffit de tester si le prénom en colonne 1, ligne i, correspond bien au prénom cherché dans ta TextBox. Il faut pour cela utiliser If Then ... End If et faire appel à la valeur de la TextBox1 (c'est son nom si tu regardes ses propriétés).

Pour faire appel à la valeur de ta TextBox1, il suffit d'écrire... TextBox1, ou TextBox1.Value si tu veux être 100% sûre de renvoyer sa valeur et non le contrôle, mais normalement ça devrait appeler sa valeur en mettant juste TextBox1, tu peux même l'enregistrer dans une variable prédéfinie pour être sûre:

Dim prenom as String
prenom = TextBox1

pour tester:

If monTableau(i,1) = prenom Then
   'export dans un tableau résultat qui sera l'objet de nouvelles explications
End If

Pour le moment tu peux te contenter de faire un msgbox affichant le numéro de ligne dans le tableau:

If monTableau(i,1) = prenom Then
   msgbox i
End If

Voilà pour cette partie

Re!

C'est bon ça marche, j'ai du juste ajouté un MsgBox i + 1 pour que ça m'indique la bonne ligne, mais ça m'indique le numéro de chaque ligne du prénom recherché même s'il y en a plusieurs ! C'est cool !

Hâte de comprendre la suite

Merci !

Re,

oui de cette façon tu as la ligne par rapport à la feuille, avec juste i, tu as la ligne dans le tableau VBA

pour la suite, il faut que tu exportes le résultat dans un nouveau tableau que tu exporteras d'un coup pour afficher les résultats (certains membres fonctionneront peut-être différemment, je dois t'avouer que pour cette partie, je doute un peu sur ce qu'il y a de plus rapide...).

Alors pour ce tableau, le plus gros souci que tu vas avoir, c'est de savoir le nombre de lignes qu'il va devoir faire en dimensions, je ne l'ai pas abordé jusqu'ici, mais le premier tableau que tu remplis avec ta plage de cellule, tu ne précises pas ses dimensions, VBA s'en charge pour ça colle pile poil à ta plage.

Sauf que pour ce tableau là, on a pas de plage de cellules à mettre pour le dimensionner, il faut faire ça à la main...

Pour dimensionner un tableau, tu peux le faire au début du programme quand tu l'initialises:

dim tableau(1 to 20, 1 to 4)

Cette déclaration est très différente de:

dim tableau(20,4)

qui est équivalente à :

dim tableau(0 to 20, 0 to 4)

Quand tu ne précises pas par quel numéro commence ta ligne ou ta colonne, VBA met 0 par défaut, ce n'est pas le cas avec l'enregistrement d'une plage de cellules où tout commence à 1 (J'espère ne pas te perdre dans mes explications )

Le souci c'est que pour faire ça il faut connaître la dimension du tableau avant même que la macro tourne, c'est pratique uniquement si le tableau n'est pas amener à changer, elle ne nous ira pas

Une autre solution, c'est d'utiliser l'instruction ReDim Preserve tableau(1 to nblig, 1 to nbcol), elle prend volontier des variables en information

Je te passe la documentation dessus, ce sera mieux expliqué que si c'est moi qui le fais https://docs.microsoft.com/fr-fr/dotnet/visual-basic/language-reference/statements/redim-statement

Tu peux donc redimensionner avec des variables ton tableau, deux solutions s'offrent alors à toi:

  • Compter le nombre de lignes que le tableau devra contenir avant de le dimensionner, peut se faire avec un NB.SI ou en parcourant le tableau en incrémentant de 1 une variable à chaque prénom trouvé
  • Redimensionner le tableau au fur et à mesure que l'on ajoute des données

Il n'y a pas vraiment de méthode meilleure que l'autre d'après moi, les 2 fonctionnent, on peut donc utiliser la première qui est plus simple que la deuxième (qui demande de faire un tableau où colonnes et lignes sont inversées), après je pense que la deuxième est un peu plus rapide, mais là c'est de l'optimisation et je ne suis pas sûr de moi...

Il te reste donc à créer une variable compteur qui sera égale à 0 au début du programme et qui augmentera de 1 à chaque ligne correspondante. Pour parcourir tous le tableau et tester la première colonne, tu sais déjà faire, il te restera ensuite à utiliser:

ReDim tableau(1 to nbLig, 1 to 5)

si ton tableau final tien bien 5 colonnes, attention à gérer le cas où tu n'aurais aucun prénom, tu peux faire un test:

If nbLig > 0 Then

Pour exporter ton tableau, on verra après

J'ai compris les différentes solutions, mais si je choisis d'utiliser

ReDim tableau(1 to nbLig, 1 to 5)

Je dois définir nbLig.Value = 0 ?

Et tableau aussi ?

Je crois que je comprends le principe mais pas trop ce qu'il faut taper

Quelque choses comme ça ?

Et comment nbLig s'incrémente ?

Re,

Pas exactement, courage

En clair cette partie du code ressemblera à :

dim tableau
dim nbLig
nbLig = 0 'tu ne mets pas nbLig.value car il s'agit ici d'une simple variable, pas d'un objet ayant plein de propriétés

For i = lbound(monTableau,1) to ubound(monTableau,1)
    If monTableau(i,1) = prenom Then
        nbLig = nbLig + 1
    End If
Next i

If nbLig > 0 Then
    ReDim tableau(1 to nbLig, 1 to 5)
    'la suite du code
End If

Si tu sens que tu as du mal avec VBA, je te conseille les cours disponibles sur le site: https://www.excel-pratique.com/fr/vba.php

Tu verras ainsi les bases de la programmation VBA et tu pourras ainsi aborder plus facilement mes explications

Est-ce que ça ressemble à ça du coup ?

Private Sub CommandButton1_Click()

Dim prenom As String

prenom = TextBox1

Dim tableau

Dim nbLig

nbLig = 0

ligFin = Worksheets("Base").Range("a" & Rows.Count).End(xlUp).Row

monTableau = Worksheets("Base").Range("a2", "m" & ligFin)

For i = LBound(monTableau, 1) To UBound(monTableau, 1)

If monTableau(i, 1) = prenom Then

MsgBox i + 1

End If

For i = LBound(monTableau, 1) To UBound(monTableau, 1)

If monTableau(i, 1) = prenom Then

nbLig = nbLig + 1

End If

Next i

If nbLig > 0 Then

ReDim tableau(1 To nbLig, 1 To 5)

'la suite du code

End If

Next i

Unload UserForm1

End Sub

Presque, ça ressemblera plus à:

Private Sub CommandButton1_Click()
Dim prenom As String
Dim tableau, monTableau
Dim nbLig

'initialisations
prenom = TextBox1
nbLig = 0
ligFin = Worksheets("Base").Range("a" & Rows.Count).End(xlUp).Row
monTableau = Worksheets("Base").Range("a2", "e" & ligFin) 'ton tableau va jusqu'à la colonne e
'pas jusqu'à la colonne M

For i = LBound(monTableau, 1) To UBound(monTableau, 1)
    If monTableau(i, 1) = prenom Then
        nbLig = nbLig + 1
    End If
Next i

If nbLig > 0 Then
    ReDim tableau(1 To nbLig, 1 To 5)
    'la suite du code
End If
Unload UserForm1
End Sub

Les déclarations de variables sont à mettre en début de programme, j'ai rajouté un commentaire pour marquer le début de l'initialisation des variables, mettre quelques commentaires pour "marquer" les points clés du programme permet une meilleur compréhension de celui-ci, et ça permet aussi de mieux s'y retrouver

Ok j'ai tout compris, c'est top !

Juste une mini question, si je veux aller jusqu'à la colonne "AK", j'ai juste besoin de remplacer par "AK" à la place de E ?

Donc si je résume, on a lu toutes les valeurs du tableau initiale et on a créé un tableau pour y accueillir les différentes valeurs que l'on cherche de la textbox

Comme fait-on pour le remplir ensuite ?

Mille merci !

Bonjour,

pour tes questions:

si je veux aller jusqu'à la colonne "AK", j'ai juste besoin de remplacer par "AK" à la place de E ?

Oui il suffit de remplacer E par AK


Donc si je résume, on a lu toutes les valeurs du tableau initiale et on a créé un tableau pour y accueillir les différentes valeurs que l'on cherche de la textbox

C'est ça, on a enregistré les cellules dans un tableau, on parcouru ce tableau pour dimensionner celui qui va accueillir les valeurs, on l'a dimensionné avec ReDim


Comme fait-on pour le remplir ensuite ?

Pour remplir la suite tu devrais avoir une petite idée de comment procéder

Tu vas devoir à nouveau parcourir ton premier tableau, vérifier que le prénom correspond, puis si c'est le cas, copier les valeurs dans le tableau résultat tu peux renommer les tableaux si tu veux qu'ils soient plus explicites, par exemple: tabDep et tabFin

Il faudra par contre savoir à quelle ligne de ton tableau résultat tu dois copier les valeurs, je te laisse réfléchir à comment procéder

Rechercher des sujets similaires à "creation tableau partir textbox"