Afficher plage de données dans un userform

Bonjour !

M'étant mis au VBA depuis peu, je sèche un peu sur ce problème.

Le but du fichier est d'être utilisé en tant que base de données. Pour cela, Je suis passé par la création d'un userform utilisé comme "page" d'accueil. En effet, celui-ci permet de rajouté un modèle, en modifier, en supprimer, et plus tard à les comparer. Cependant, plutôt que d'utiliser un onglet pour afficher le nouveau modèle avant de le rajouter dans l'onglet "base de données", j'aimerai pouvoir l'afficher dans un userform, permettant ainsi de ne pas toucher directement au fichier Excel. Cette fenêtre affichant la plage de données doit permettre de modifier les valeurs.

Je bloque sur ce point ci. J'ai essayer de passer par des textbox, mais un modèle comporte plus de 100 lignes sur 6 colonnes, donc ça devient assez vite le bordel..

L'utilisation d'une listview ma parait compliqué vu mon niveau d'expérience à l'heure actuel ^^

Malheureusement le fichier est confidentiel, tant au niveau des données que sur le contenue des titres.

Je pourrai cependant passé un peu de temps à créer un fichier exemple si jamais je n'ai pas été très clair ( ce qui est surement le cas )

Merci d'avance pour l'aide !

Bonjour,

Regarde cet exemple : ListBox modifiable

Construit avec :

1 listbox

1 textbox

1 commandbutton

Pour 6 colonnes, cela remplace avantageusement un listview, en plus simple.

Bonjour et merci

J'avais déjà essayé avec les listbox oui, le problème était la quantité de ceux-ci, ce qui rendait cela presque illisible. Etant donné que j'utilise une matrice afin de remplir le tableau, intégrer les données recueillies dans le userform devenait compliqué aussi..

J'ai créer un fichier exemple avec ce que j'avais commencer à envisager. ( sans afficher dans un userform du coup )

411exemple-1.xlsm (203.12 Ko)

Bonjour,

Pas facile de te comprendre.

Tu sais certainement ou tu veux en venir, mais tes explications ne nous permettent guère de comprendre comment ton fichier va fonctionner

Bon.

Si j'ai compris le minimum, tu veux pouvoir ajouter/supprimer/modifier des "modèles", modèles enregistrés dans la feuille "Référentiel".

C'est cela?

Si oui, à quoi te sers la feuille "Données"?

Si l'on part sur ton idée première d'un UserForm, les feuilles "Ajout" et "Modifier" seront obsolètes.

Dis nous en davantage pour pouvoir créer une esquisse de projet.

Bonjour,

L'onglet "Données" me permet d'obtenir la liste déroulante dans le userform, afin de sélectionner un modèle déjà rajouté dans l'onglet "Référentiel". N'ayant pas trouvé le moyen de le faire sans, ou de sélectionner directement le contenue de la liste dans l'onglet "référentiel", ceci me permettais de contourner le problème. ( Je reste novice en VBA )

L'idée du fichier Excel est de pouvoir ajouter/supprimer ou modifier une base de données sans passer directement par le tableur. Lors de l'ouverture de celui-ci, le userform s'affiche et permet de sélectionner les actions à suivre, évitant alors toutes manipulations du fichier par l'utilisateur. Mon problème est l'affichage d'un "modèle" dans le userform, la quantité d'informations étant assez importante, surtout que celles-ci doivent pouvoir être modifiées avant de valider pour l'insérer dans la base de données.

Pas très clair, désolé d'avance !

On peut donc se passer des feuilles "Données", "Ajout" et "Modifier".

La seule feuille utile est la feuille "Référentiels" qui te sers de base de données.

On est d'accord?

Si oui, combien va tu avoir, à terme, de modèles dans ta feuille référentiels?

On est tout à fait d'accord !

Je ne peux donner d'informations précise la dessus ne le sachant pas moi même, mais à terme il n'y a pas de limite dans le nombre théorique de modèles que doit pouvoir contenir la base de données.

mais à terme il n'y a pas de limite dans le nombre théorique de modèles que doit pouvoir contenir la base de données.

Il faut à minima, une évaluation.

Une feuille Excel depuis 2007, comporte 16000 colonnes et 1 million de lignes.

La "matrice" d'un de tes modèle est de 6x200.

200, ça passe en colonnes, largement et tu pourras obtenir, à terme plusieurs dizaine (voir centaine) milliers de modèles sans changer de fichier.

Tu ne pourras en obtenir "que" 2600 et quelques en maintenant ta bdd dans le sens "colonnes" actuel.

Après renseignement, "environ 2600" modèles suffisent amplement.

Pour donner une idée, le nombre d'entré dans la BDD est d'environ 10/20 par an.

L'intérêt était surtout de pouvoir ressortir facilement les informations afin de comparer des modèles dans un ou plusieurs graphiques.

Ok.

Je m'y met et te fais une proposition d'ici ??? peu?


Questions complémentaires :

  • tes modèles ont toujours le même nombre de lignes?
  • 101?
  • As quoi te servent les titres de lignes?
  • sont-ce toujours les mêmes pour tous les modèles?
  • Idem pour les entêtes de colonne. Toujours les mêmes?

Malheureusement je n'ai pu obtenir qu'un seul fichier comportant un modèle, je suis donc dans l'inconnu aussi.

Je suis donc parti sur le principe suivant :

Sur les fichiers que l'on m'envoi :

  • Les lignes sont les mêmes(normalement, je ne peux le confirmer), mais leur position peuvent changer. (par exemple, même nombre de titre de ligne, mais des fois des ligne vide apparaissent, il n'y à alors pas 101 lignes mais 120)
  • les colonnes ne sont jamais au même endroit, mais leurs titres sont identiques entre chaque modèles. (enfin j'espère aussi)

Sur mon fichier:

  • le titre des lignes me permet de savoir à quoi correspond le processus de fabrication. Ils seront toujours dans le même ordre et sur les 101 lignes.
  • Le titre des colonnes me permet d'indiquer le coût, la surface, l'unité, ou autres. De même, je les conserve dans le même ordre et sur 6 colonnes.

Merci beaucoup pour l'aide, je reste disponible pour d'autres informations.

Pour le délai, je ne me permettrai pas d'imposer de date !

Ps: au passage j'ai essayé de faire un bout de code qui permet de tenter de récupérer les informations automatiquement, bien sur il n'est pas optimisé, et ne fonctionne uniquement que sur le fichier que l'on ma fourni :/

[code]

Dim TrouveColonne As Range, PlageDeRechercheHorizontale As Range, TrouveValeur_V As Range, PlageDeRecherche_V As Range

Dim Valeur_Cherchee_H As String, AdresseTrouvee_H As String, Valeur_Cherchee_V As String

Dim NomLigne(97, 1), Matrice(97, 6)

Dim i As Integer, j As Integer, k As Integer

ThisWorkbook.Sheets("Référentiel").Activate

For k = 1 To 97

NomLigne(k, 1) = Cells(2 + k, 1).Value

Next

' ______ Recherche de la bonne colonne dans le fichier synthèse

Workbooks(Nom_QDCP).Sheets("synthese").Activate

Valeur_Cherchee_H = Modele.Value

Set PlageDeRechercheHorizontale = ActiveSheet.Rows("1:10")

Set TrouveColonne = PlageDeRechercheHorizontale.Cells.Find(what:=Valeur_Cherchee_H, LookAt:=xlWhole)

If TrouveColonne Is Nothing Then

AdresseTrouvee_H = Valeur_Cherchee_H & " n'est pas présent dans " & PlageDeRechercheHorizontale.Address

Else

AdresseTrouvee_H = TrouveColonne.Address

End If

' ______ Remplissage du tableau

Set PlageDeRecherche_V = ActiveSheet.Columns(3)

For i = 1 To 97

Valeur_Cherchee_V = NomLigne(i, 1)

Set TrouveValeur_V = PlageDeRecherche_V.Cells.Find(what:=Valeur_Cherchee_V, LookAt:=xlWhole)

For j = 1 To 6

On Error Resume Next

Matrice(i, j) = Cells(TrouveValeur_V.Row, TrouveColonne.Column + j - 1).Value

Next

Next

' ______________________ On copie les valeurs dans l'onglet référentiel

ThisWorkbook.Sheets("Ajout").Activate

For i = 1 To 97

For j = 1 To 6

Cells(2 + i, 1 + j) = Matrice(i, j)

Next

Next

Range("B1") = Modele.Value

[/[code]

Pour l'instant, je suis partie là-dessus :

- 3 boutons dans le "Menu Références" :

> AJOUTER => importe la référence voulue depuis le fichier que tu auras reçu

> MODIFIER => modifie une référence déjà présente dans la feuille "Référentiels"

> SUPPRIMER => supprime une référence déjà présente dans la feuille "Référentiels"

- 1 listbox pour l'affichage, modifiable pour...les modifications!

Le gros problème qui va se poser à nous, sera la structure du fichier que tu reçois.

Dans l'idéal, il devra respecter les noms des titres de ligne, des titres de colonne, mais aussi du nom de la feuille (Sheets("synthese")). Leurs emplacements importe guère, on peut les rechercher par macro. Mais s'ils ne sont pas clairement intitulés de la même manière, la macro ne pourra rien faire et donc il y aura tout un travail manuel supplémentaire avant l'import. Je vais prévoir donc des tests sur les noms. Si un seul nom est différent, la macro ne le trouvera pas dans le classeur que tu as reçu et donc refusera simplement l'import.

OK?

Oui je vois très bien, et me suis pausé la même question. Si le titre des les lignes ne sont pas identiques entre chaque fichier, la macro risque de m'envoyer voir ailleurs gentiment. Je vais tenter d'obtenir d'autres exemples, afin de pouvoir donner un peu plus de précisions.

J'avais pensé palier au problème en demandant à l'utilisateur d'aller sélectionner directement la feuille et la plage de données dans le classeur. (Mais ceci ne règlerai pas le problème des titres)

PS: Apparemment les titres (lignes et colonnes) sont sensé rester identiques, seul des options de filtrage peuvent varier d'un classeur à l'autre.

Bon.

Voici un premier jet.

Il ne comprend pas la procédure d'import des fichiers.

Il comprend par contre la totalité de tes demandes.

Pour faire réapparaitre l'UserForm, double clic en feuille "Référentiels" dans la cellule A1.

Il te faut maintenant tester, retester et tester à nouveau.

Reviens m'énumérer tous les bugs.

136alex-p.xlsm (187.29 Ko)

Merci bcp !

je vais me pencher dessus et tester, je viendrai faire un retour dès que possible.

Ca fonctionne bien, mise à part le rajout d'un modèle, la procédure bloque sur ce point :

Sheets(FEUILLE_MODELE).Range("B1:G101").Copy .Range(.Cells(1, Col))

Deuxième "problème": lors de la suppression d'un modèle, le nom du modèle reste dans la liste alors qu'il n'éxite plus. Relancer le userform actualise la liste, mais pas avant.

Bonjour,

J'avais bien dit qu'il y aurait des bugs...

Voici le nouveau fichier corrigé.

J'ai également ajouté une demande de confirmation de suppression. On ne sait jamais.

249alex-p.xlsm (194.72 Ko)

Merci encore !!

Je vais pouvoir essayer de finir avec cette bonne base.

En tout cas vive la rapidité du forum !

Il restait un point à traiter, l'import des données.

Une fois que tu auras écrit ce code, montre le nous, ça peut intéresser d'autres internautes.

J'ai commencé la macro pour l'import des données.

Il fonctionne, mais bien sur n'est pas du tout optimisé (ceci dit avec un mois d'apprentissage seul je n'ai pas pu faire mieux )

Sub Recherche_Valeurs()

Dim Fichier As Boolean
Dim TrouveColonne As Range, TrouveValeur_V As Range, trouvecol As Range
Dim Valeur_Cherchee_H As String, AdresseTrouvee_H As String, Valeur_Cherchee_V As String, NomFichier As String, Modele As String
Dim i As Integer, j As Integer, k As Integer, Adressecol As Integer
Dim NomLigne(97, 1), Matrice(97, 6)

Application.ScreenUpdating = False

Modele = "Titre modèle"
Fichier = Application.Dialogs(xlDialogOpen).Show(fich)

If Fichier = False Then
    Exit Sub
End If

NomFichier = ActiveWorkbook.Name

' ---------- Nom de la variable de chaque ligne du tableau
ThisWorkbook.Sheets("Référentiel").Activate
For k = 1 To 97
    NomLigne(k, 1) = Cells(2 + k, 1).Value
Next

' ______ Recherche la colonne du modèle dans le fichier
Workbooks(NomFichier).Sheets("synthese").Activate
Valeur_Cherchee_H = Modele

Set TrouveColonne = ActiveSheet.Rows("1:10").Cells.Find(what:=Valeur_Cherchee_H, LookAt:=xlWhole)
    If TrouveColonne Is Nothing Then
        MsgBox ("Information non trouvé")
        Exit Sub
    Else
        AdresseTrouvee_H = TrouveColonne.Address
    End If

'---------- Recherche de la colonne des titres de ligne

Set trouvecol = ActiveSheet.Rows("1:50").Cells.Find(what:="titre 1ere colonne", LookAt:=xlWhole)
If trouvecol Is Nothing Then
        MsgBox ("Information non trouvée")
        Exit Sub
    Else
        Adressecol = trouvecol.Column
    End If

' ---- Remplissage du tableau
 For i = 1 To 97
        Valeur_Cherchee_V = NomLigne(i, 1)
        Set TrouveValeur_V = ActiveSheet.Columns(Adressecol).Cells.Find(what:=Valeur_Cherchee_V, LookAt:=xlWhole)
            For j = 1 To 6
               On Error Resume Next

                Matrice(i, j) = Cells(TrouveValeur_V.Row, TrouveColonne.Column + j - 1).Value
            Next
Next

' ------- On copie les valeurs dans l'onglet
ThisWorkbook.Sheets("Ajout").Activate
For i = 1 To 97
    For j = 1 To 6
        Cells(2 + i, 1 + j) = Matrice(i, j)
    Next
Next
Range("B1") = Modele 'titre du modèle en en-tête

Application.ScreenUpdating = True

End Sub
Rechercher des sujets similaires à "afficher plage donnees userform"