Microsoft 365 Alimenter un Textbox dans un Userform via une boucle

Bounty57

XLDnaute Nouveau
Bonjour,

Je suis nouveau sur le Forum et en plein développement d'une mini appli :). Je suis bloqué au stade de la boucle...je m'explique
En fait, j'ai créer un Userform qui est alimenté par la feuille DATA (que j'importe d'une base de données) par contre je dois incrémenter les équipements un à un dans la feuille GESTION car il est possible que j'en ai un ou plus (jusqu'à 30)
Afin d'être plus clair, je vous ai mis en fichier en PJ
Merci pour votre aide,
 

Pièces jointes

  • Projet.xlsm
    15.6 KB · Affichages: 10
Solution
Bonjour,

Voici une proposition.
Il vous faut repérer les valeurs fixes (celles communes à chaque ligne) et les variables et boucler sur celles-ci)

Quant à la confirmation, par msgbox si elle est nécéssaire la placer avant la création de la ligne en cours si vous en voulez une à chaque équipement ou avant la création de la première ligne.

Je fais l'effort de pondre des codes qui ne soient pas trop 'cabalistiques', alors je vous demanderai de faire l'effort de le comprendre et comprendre ce que vous faîtes, et pourquoi vous le faites.
Ne vous contentez pas de copier/coller.

VB:
Sub Ajout_equipement()
    Dim Dest As Range
    Dim lo As ListObject
    Dim i As Integer, nbLignes As Integer
    '
    ' Tableau (listobject) destination...

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour et bienvenue sur le forum.
En fait, j'ai créer un Userform qui est alimenté par la feuille DATA (que j'importe d'une base de données) par contre je dois incrémenter les équipements un à un dans la feuille GESTION car il est possible que j'en ai un ou plus (jusqu'à 30)
Le useform de votre exemple est pour le moment alimenté par rien. Pas une ligne de code dans votre fichier.
Qu'est-ce que vous appelez 'incrémenter' ?

Si c'est reproduire votre tableau de la feuille GESTION à partir des données de la feuille DATA alors voici deux solutions qui le feront.

Une par macro (fichier .xlsm) l'autre (fichier .xlsx) par PowerQuery inclus dans votre version d'excel et qui pourrait très bien faire la chose directement à partir de votre base de données.

Cordialement

P.S. comme le dit la charte du forum, que vous avez certainement lue, il est important d'expliciter précisément son besoin dans le post de la discussion et son titre. Que ceux qui voudraient vous répondre n'aient ni à téléchargé ni ouvrir votre fichier pour voir de quoi il retourne.
 

Pièces jointes

  • Projet.xlsm
    28.7 KB · Affichages: 8
  • Projet-PowerQuery.xlsx
    28.7 KB · Affichages: 2

Bounty57

XLDnaute Nouveau
Bonjour et bienvenue sur le forum.

Le useform de votre exemple est pour le moment alimenté par rien. Pas une ligne de code dans votre fichier.
Qu'est-ce que vous appelez 'incrémenter' ?

Si c'est reproduire votre tableau de la feuille GESTION à partir des données de la feuille DATA alors voici deux solutions qui le feront.

Une par macro (fichier .xlsm) l'autre (fichier .xlsx) par PowerQuery inclus dans votre version d'excel et qui pourrait très bien faire la chose directement à partir de votre base de données.

Cordialement

P.S. comme le dit la charte du forum, que vous avez certainement lue, il est important d'expliciter précisément son besoin dans le post de la discussion et son titre. Que ceux qui voudraient vous répondre n'aient ni à téléchargé ni ouvrir votre fichier pour voir de quoi il retourne.
Bonjour et merci beaucoup Hasco pour votre solution que je vais adapter dans mon projet.
Pour la prochaine fois j'essayerai d'être plus précis et en effet je n'ai pas souhaiter mettre le projet complet car trop de choses...
Bonne journée,
 

Bounty57

XLDnaute Nouveau
Bonjour et bienvenu sur Excel Downloads
Si j'ai bien compris... ci joint ma solution

A+ François
Bonjour Fanfan et merci pour votre retour. C'est bien ce que je cherchais sauf que je souhaitais que les équipements s'incrémentent seuls dans l'Userform avec des confirmations de création par Messagebox comme par exemple : "Voulez-vous ajouter l'équipement" jusqu'à l'arrivée sur une cellule vide pour afficher un Messagebox "Il n'y à plus d'équipements à ajouter".
Par contre, je vais m'appuyer sur votre retour également pour peaufiner mon projet.
Bonne journée,
 

Bounty57

XLDnaute Nouveau
Bonjour et bienvenue sur le forum.

Le useform de votre exemple est pour le moment alimenté par rien. Pas une ligne de code dans votre fichier.
Qu'est-ce que vous appelez 'incrémenter' ?

Si c'est reproduire votre tableau de la feuille GESTION à partir des données de la feuille DATA alors voici deux solutions qui le feront.

Une par macro (fichier .xlsm) l'autre (fichier .xlsx) par PowerQuery inclus dans votre version d'excel et qui pourrait très bien faire la chose directement à partir de votre base de données.

Cordialement

P.S. comme le dit la charte du forum, que vous avez certainement lue, il est important d'expliciter précisément son besoin dans le post de la discussion et son titre. Que ceux qui voudraient vous répondre n'aient ni à téléchargé ni ouvrir votre fichier pour voir de quoi il retourne.
Bonjour Hasco,
Je n'ai malheureusement pas réussi à mettre en œuvre votre solution qui pourtant me paraissait très bien.
Je vais essayer d'être clair cette fois dans ma demande.
1. Tout d'abord, j'importe une partie d'une BDD Access dans une feuille que je nomme "Import" (ce point fonctionne). Il y a plus de données que j'ai besoin...mais ce n'est pas grave! J'ai besoin en tout de 14 données qui sont de part et d'autre de la feuille
2. Les 14 données doivent être maintenant copier sur la dernière ligne du tableau de la feuille "Projet en cours"
3. Si plusieurs équipements dans le projet alors seulement le numéro et la localisation de l'équipement doivent changer sur la ligne suivante

J'ai annexé le fichier avec en exemple la feuille "Projet en cours" préremplie et la feuille "Import" avec les cellule en "vert" qui doivent remplir le tableau "Projet en cours"

Merci d'avance pour votre aide précieuse et à votre disposition si question

Bounty57
 

Pièces jointes

  • Essai_Import.xlsm
    42.8 KB · Affichages: 2

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans votre classeur, aucune des solutions proposées par @fanfan38 ou moi-même n'est présente.
Vous ne dites pas quelle solution vous avez choisie. Je vous en ai proposé 2. Je veux bien amélioré celle que vous aurez choisie, mais recommencer, non.

Pourquoi ne pas faire cet import justement avec powerquery qui vous préparerait le travail. Le reste ne serait que copier/coller de données. ?

Cordialement
 
Dernière édition:

Bounty57

XLDnaute Nouveau
Bonjour,

Dans votre classeur, aucune des solutions proposées par @fanfan38 ou moi-même n'est présente.
Vous ne dites pas quelle solution vous avez choisie. Je vous en ai proposé 2. Je veux bien amélioré celle que vous aurez choisie, mais recommencer, non.

Pourquoi ne pas faire cet import justement avec powerquery qui vous préparerait le travail. Le reste ne serait que copier/coller de données. ?

Cordialement
Bonsoir,
J'étais parti sur votre solution Excel (et non pas avec Powerquery) mais je n'ai pas réussi à faire, je pense qu'il ne manque pas grand chose (une boucle peut-être ?)
Bref, j'ai mis le module VBA afin que vous puissiez voir où ça bloque ! Je n'arrive pas à mettre plus d'un équipements. En effet, j'arrive bien à basculer l'équipement N°1 avec sa localisation mais je n'arrive pas à basculer l'équipement N°2 --> jusqu'à ce que la cellule de l'équipement soit vide.
Bonne soirée,
 

Pièces jointes

  • Essai_Import_2.xlsm
    49.5 KB · Affichages: 1

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Voici une proposition.
Il vous faut repérer les valeurs fixes (celles communes à chaque ligne) et les variables et boucler sur celles-ci)

Quant à la confirmation, par msgbox si elle est nécéssaire la placer avant la création de la ligne en cours si vous en voulez une à chaque équipement ou avant la création de la première ligne.

Je fais l'effort de pondre des codes qui ne soient pas trop 'cabalistiques', alors je vous demanderai de faire l'effort de le comprendre et comprendre ce que vous faîtes, et pourquoi vous le faites.
Ne vous contentez pas de copier/coller.

VB:
Sub Ajout_equipement()
    Dim Dest As Range
    Dim lo As ListObject
    Dim i As Integer, nbLignes As Integer
    '
    ' Tableau (listobject) destination des données
    Set lo = ThisWorkbook.Sheets("Projet en cours").ListObjects(1)
    '
    ' Travail à partir de la feuille Import
    With Sheets("Import")
        '
        nbLignes = .Range("B58").CurrentRegion.Rows.Count
        '
        For i = 1 To nbLignes
            ' si l'équipement est non vide (colonne b de la ligne en cours)
            ' alors créer une nouvelle ligne dans le tableau destination
            If Not IsEmpty(.Cells(57 + i, 2)) Then
                ' Si la ligne d'insertion du tableau est affichée
                 If Not lo.InsertRowRange Is Nothing Then
                    ' alors la prendre comme destination
                    Set Dest = lo.InsertRowRange()
                 Else
                    ' sinon ajouter une ligne en bas du tableau
                    ' et la prendre pour destination
                    Set Dest = lo.ListRows.Add(AlwaysInsert:=True).Range
                 End If
                'Projet (cellules fixes)
                Dest(1, 1) = .Range("F9")
                Dest(1, 2) = .Range("B4")
                Dest(1, 3) = .Range("B7")
                Dest(1, 4) = .Range("B8")
                Dest(1, 5) = .Range("B10")
                Dest(1, 6) = .Range("B11")
                'Client (cellules fixes)
                Dest(1, 18) = .Range("B17")
                Dest(1, 19) = .Range("B83")
                Dest(1, 20) = .Range("B84")
                Dest(1, 21) = .Range("B85")
                Dest(1, 22) = .Range("B86")
                'Conducteur Travaux (cellule fixe)
                Dest(1, 11) = .Range("B56")
                'Equipements & localisation (cellules relative à la ligne)
                Dest(1, 7) = .Cells(57 + i, 2)
                Dest(1, 8) = .Cells(57 + i, 5)
            End If
        Next
    End With
End Sub

Les cellules fixes pourraient êtres mises avant la boucle dans un tableau de valeurs en mémoire pour gagner un peu de temps, mais ici, cela ne vaut pas la peine pour le moment.


Cordialement
 

Pièces jointes

  • Bounty57_Import_2.xlsm
    55.7 KB · Affichages: 6

Bounty57

XLDnaute Nouveau
Bonjour,

Voici une proposition.
Il vous faut repérer les valeurs fixes (celles communes à chaque ligne) et les variables et boucler sur celles-ci)

Quant à la confirmation, par msgbox si elle est nécéssaire la placer avant la création de la ligne en cours si vous en voulez une à chaque équipement ou avant la création de la première ligne.

Je fais l'effort de pondre des codes qui ne soient pas trop 'cabalistiques', alors je vous demanderai de faire l'effort de le comprendre et comprendre ce que vous faîtes, et pourquoi vous le faites.
Ne vous contentez pas de copier/coller.

VB:
Sub Ajout_equipement()
    Dim Dest As Range
    Dim lo As ListObject
    Dim i As Integer, nbLignes As Integer
    '
    ' Tableau (listobject) destination des données
    Set lo = ThisWorkbook.Sheets("Projet en cours").ListObjects(1)
    '
    ' Travail à partir de la feuille Import
    With Sheets("Import")
        '
        nbLignes = .Range("B58").CurrentRegion.Rows.Count
        '
        For i = 1 To nbLignes
            ' si l'équipement est non vide (colonne b de la ligne en cours)
            ' alors créer une nouvelle ligne dans le tableau destination
            If Not IsEmpty(.Cells(57 + i, 2)) Then
                ' Si la ligne d'insertion du tableau est affichée
                 If Not lo.InsertRowRange Is Nothing Then
                    ' alors la prendre comme destination
                    Set Dest = lo.InsertRowRange()
                 Else
                    ' sinon ajouter une ligne en bas du tableau
                    ' et la prendre pour destination
                    Set Dest = lo.ListRows.Add(AlwaysInsert:=True).Range
                 End If
                'Projet (cellules fixes)
                Dest(1, 1) = .Range("F9")
                Dest(1, 2) = .Range("B4")
                Dest(1, 3) = .Range("B7")
                Dest(1, 4) = .Range("B8")
                Dest(1, 5) = .Range("B10")
                Dest(1, 6) = .Range("B11")
                'Client (cellules fixes)
                Dest(1, 18) = .Range("B17")
                Dest(1, 19) = .Range("B83")
                Dest(1, 20) = .Range("B84")
                Dest(1, 21) = .Range("B85")
                Dest(1, 22) = .Range("B86")
                'Conducteur Travaux (cellule fixe)
                Dest(1, 11) = .Range("B56")
                'Equipements & localisation (cellules relative à la ligne)
                Dest(1, 7) = .Cells(57 + i, 2)
                Dest(1, 8) = .Cells(57 + i, 5)
            End If
        Next
    End With
End Sub

Les cellules fixes pourraient êtres mises avant la boucle dans un tableau de valeurs en mémoire pour gagner un peu de temps, mais ici, cela ne vaut pas la peine pour le moment.


Cordialement
Bonsoir Hasco,
Cette fois, c'est bien ce que je recherchais...c'est parfait, je lai adapté et ça fonctionne à merveille :)
Merci encore et bon week-end
 

Discussions similaires

Statistiques des forums

Discussions
312 088
Messages
2 085 200
Membres
102 816
dernier inscrit
bolivier