IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

données automatiques dans userform


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 30
    Par défaut données automatiques dans userform
    bonjour,
    je voudrais dans mon usf"clients" que lorsque je clique sur ma combobox "société" et que je choisis un client, toutes les données de mon client(enregistrées sur ma feuille excel"clients")s'affichent (société,adresse,nom du contact, etc...)dans mon userform
    Je voudrais également quand j'ouvre l'usf "clients" et que je clique sur "bons"(qui m'ouvre l'usf"bons"), ca s'enregistre avec le nom du client dans un tableau excel(que je puisse par la suite faire une recherche par client, savoir ce qu'il a ramené comme matériel.
    Dans l'usf"bons" mes données vont aller sur un tableau excell
    les designations sont (ecran, ordinateur, disque dur, etc)sachant que chaque ligne de mon usf"bons" correspond à une palette, donc je peux avoir plusieurs et meme designation, je voudrais que dans mon tableau excell si par exemple j'ai 10 ecrans 100kg et 20 ecrans 200kg, dans mon tableau ca soit marqué sous ecran,10et 20, ou 30 (je ne sais pas comment construire mon tableau excel pour que ce soit faisable.
    Je tiens à préciser que je débute en vba, et j'ai réussi à faire tous mes usf qui marchent, c'est un bon début.

    Mais là j'ai vraiment besoin de votre aide car je coince
    Je vous joints des copies de mes usf. J'aurais bien voulu mettre en pièce jointe mon fichier complet mais il fait 952kocompressé donc impossible

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    Un classeur avec des idées...
    http://www.developpez.net/forums/d73...m/#post4281448
    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 30
    Par défaut
    bonjour LeForestier,
    j'ai récupéré un bout de code
    d'après toi est ce qu'il peut marcher pour ce que je veux faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dim recherche as range
    ...
    Set clnomsociete = Cells.Find(What:="clnomsociete", After:=ActiveCell, LookIn:=xlFormulas, _
            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)
    on error resume next
    adresse.text=clnomsociete.offset(0,1)
    adresse1.text=clnomsocite.offset(0,2)
    ...
     
    on error goto 0
    Merci à toi

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 30
    Par défaut enregistrement données usf dans tableau excel
    Bonjour,

    je voudrais quand j'enregistre les données de mon usf les données aillent directement dans mon tableau.
    J'ai réussi avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Commandvalider_Click()
    Sheets("clients").Activate
    Societeconverti = Application.WorksheetFunction.Proper(Me.clnomsociete.Text)
    Villeconverti = Application.WorksheetFunction.Proper(Me.ComboBoxville.Text)
    Contactconverti = Application.WorksheetFunction.Proper(Me.Combocontact.Text)
    Range("A65536").End(xlUp).Offset(1, 0).Value = clnomsociete.Value
    Range("B65536").End(xlUp).Offset(1, 0).Value = adresse.Value
    Range("C65536").End(xlUp).Offset(1, 0).Value = adress1.Value
    Range("D65536").End(xlUp).Offset(1, 0).Value = ComboBoxcp.Value
    Range("E65536").End(xlUp).Offset(1, 0).Value = ComboBoxville.Value
    Range("F65536").End(xlUp).Offset(1, 0).Value = Combotitre.Value
    Range("G65536").End(xlUp).Offset(1, 0).Value = Combocontact.Value
    Range("H65536").End(xlUp).Offset(1, 0).Value = TextBoxtel.Value
    Range("I65536").End(xlUp).Offset(1, 0).Value = TextBoxport.Value
    Range("J65536").End(xlUp).Offset(1, 0).Value = TextBoxfax.Value
    Range("K65536").End(xlUp).Offset(1, 0).Value = TextBoxmail.Value
    Range("L65536").End(xlUp).Offset(1, 0).Value = TextBoxsiteweb.Value
    Unload Me
    End Sub
    Mais je voudrais que mes données s'enregistre sans tenir compte des blancs
    c'est à dire que si je rentre
    gifi
    rue de reims
    59200
    tourcoing
    (je ne rentre pas de n°tel) ca s'enregistre sur la ligne 1
    gifi1
    rue de rennes
    tourcoing
    0303030303, que ca s'enregistre sur la ligne 2 (car avec le code que j'ai, le téléphone va être mis sur la ligne 1(tel) vu que ma première entrée, j'ai pas mis de tél
    donc je voudrais que mes entrées soint enregistréees l'une en desous de l'autre sans tenir compte des blancs
    est ce que c'est possible, qu'est ce que je dois changer dans mon code?
    et je voudrais également savoir comment faire pour rentrer mes données sans doublons (c'est à dire que si je rentre un client qui est déjà sur ma liste et que je change des données, il ne m'enregistre pas une ligne mais me remplace les nouvelles données)

    merci à tous de m'aider.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 70

    Informations forums :
    Inscription : Février 2009
    Messages : 36
    Par défaut
    Bonjour,

    Pour éviter d'écrire à la fin de chaque colonne, il suffit de ne disposer que d'une seule référence.

    Dans ta base de données, il doit y avoir une donnée obligatoire.

    C'est sur cette donnée qu'il faut rechercher le numéro de ligne active, et le charger dans une variable.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nLignes=Range("A65536").End(xlUp).Offset(1, 0).row+1
    Pour rechercher un enregistrement existant, il faut adopter quelques principes des bases de données:

    Puisque tu doit avoir une donnée obligatoire, fais en sorte qu'elle soit unique:
    Le principe de l'unicité fait que chaque enregistrement doit être identifiable par un seul et unique élément comme un code client, une référence, un matricule...

    Il te suffit ensuite de faire une recherche popur savoir si la référence existe ou pas.

    Si elle existe tu connaîtras le numéro de ligne active, sinon le numéro de ligne active sera la première ligne vide à la fin de la plage de recherche.

    Pour rechercher la référence, utilise le code de la méthode Find

    Find, méthode

    Méthode Find telle qu'elle s'applique à l'objet Range.

    Cette méthode recherche une information spécifique dans une plage et renvoie un objet Range qui représente la première cellule où cette information apparaît. Cette méthode renvoie la valeur Nothing si l'information n'est pas trouvée. N'affecte ni la sélection ni la cellule active.

    Exemple
    Cet exemple montre comment rechercher si le texte contenu dans la variabe sTexteCherche existe dans les cellules de la plage A1:A500 dans la feuille de calcul Worksheet 1.
    Si le texte existe, la fonction retourne le N° de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function LigneRechercher(sTexteCherche as string) As Integer
    Dim c as object
    With Worksheets(1).Range("a1:a500")
        Set c = .Find(sTexteCherche , lookin:=xlValues)
        If Not c Is Nothing Then
            LigneRechercher=c.row
        End If
    End With
    End Function

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 30
    Par défaut
    Bonjour Gégé 29

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nLignes=Range("A65536").End(xlUp).Offset(1, 0).row+1
    Le code que tu me donnes, je dois le mettre où dans mon code et qu'est ce que je dois supprimer?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Commandvalider_Click()
    Sheets("clients").Activate
    Societeconverti = Application.WorksheetFunction.Proper(Me.clnomsociete.Text)
    Villeconverti = Application.WorksheetFunction.Proper(Me.ComboBoxville.Text)
    Contactconverti = Application.WorksheetFunction.Proper(Me.Combocontact.Text)
    Range("A65536").End(xlUp).Offset(1, 0).Value = clnomsociete.Value
    Range("B65536").End(xlUp).Offset(1, 0).Value = adresse.Value
    Range("C65536").End(xlUp).Offset(1, 0).Value = adress1.Value
    Range("D65536").End(xlUp).Offset(1, 0).Value = ComboBoxcp.Value
    Range("E65536").End(xlUp).Offset(1, 0).Value = ComboBoxville.Value
    Range("F65536").End(xlUp).Offset(1, 0).Value = Combotitre.Value
    Range("G65536").End(xlUp).Offset(1, 0).Value = Combocontact.Value
    Range("H65536").End(xlUp).Offset(1, 0).Value = TextBoxtel.Value
    Range("I65536").End(xlUp).Offset(1, 0).Value = TextBoxport.Value
    Range("J65536").End(xlUp).Offset(1, 0).Value = TextBoxfax.Value
    Range("K65536").End(xlUp).Offset(1, 0).Value = TextBoxmail.Value
    Range("L65536").End(xlUp).Offset(1, 0).Value = TextBoxsiteweb.Value
    Unload Me
    End Sub
    merci à toi en attendant

  7. #7
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 70

    Informations forums :
    Inscription : Février 2009
    Messages : 36
    Par défaut Version modifiée
    La modification ci-dessous devrait fonctionner.

    Comme je te l'ai dis précédemment, je suppose que "Ma référence" respecte les règles de l'unicité.
    Je suppose également que la référence est située colonne A et que la plage de données commence ligne 2.
    Je suppose également que le nombre d'enregistrements ne dépassera pas 32 767. Dans le cas contraire, il suffit de déclarer la variable iLigne en Long.

    Si ces supposition ne correspondent pas à ton projet, il te suffit d'adapter le code ci-dessous aux données réelles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Private Sub Commandvalider_Click()
     
    Dim iLigne as integer
     
    Sheets("clients").Activate
    Societeconverti = Application.WorksheetFunction.Proper(Me.clnomsociete.Text)
    Villeconverti = Application.WorksheetFunction.Proper(Me.ComboBoxville.Text)
    Contactconverti = Application.WorksheetFunction.Proper(Me.Combocontact.Text)
     
    iLigne = LigneRechercher("Ma référence")
     
    Range("A" & iLigne )= clnomsociete.Value
    Range("B" & iLigne )=  adresse.Value
    Range("C" & iLigne )= adress1.Value
    Range("D" & iLigne )= ComboBoxcp.Value
    Range("E" & iLigne )=  ComboBoxville.Value
    Range("F" & iLigne )=  Combotitre.Value
    Range("G" & iLigne )= Combocontact.Value
    Range("H" & iLigne )= TextBoxtel.Value
    Range("I" & iLigne )= TextBoxport.Value
    Range("J" & iLigne )= TextBoxfax.Value
    Range("K" & iLigne )=  TextBoxmail.Value
    Range("L" & iLigne )= TextBoxsiteweb.Value
    Unload Me
    End Sub
     
    Function LigneRechercher(sTexteCherche as string) As Integer
    Dim c as object
    With Worksheets(1).Range("a1:a65536")
        Set c = .Find(sTexteCherche , lookin:=xlValues)
        If Not c Is Nothing Then
            LigneRechercher=c.row
        Else
            LigneRechercher=Range("A65536").End(xlUp).Offset(1, 0).Row+1
        End If
    End With
    End Function

  8. #8
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour

    Comme le dit Gégé29, ton soucis est à la base une réflexion sur une base de données simple.
    Déjà en premier apparaît l’intérêt de se conformer aux préconisations du forum, à savoir mettre en balise son N° de version…

    En effet si tu es sous 2000 à 2003, tu as 256 colonnes sur 65536 lignes, d’où la réflexion suivante : je risque d’avoir plus de 256 clients ou plus de 256 items par clients ? (en 2007 ça change...)

    Généralement ça te conduira au cas 2 et à placer le nom de tes clients en colonne B par exemple la A étant réservée, comme l’explique Gégé au N° Id du client (unique).

    Ensuite, il est pratique de donner à toutes les en-têtes de tes colonnes un nom, ce qui te permettra de remplir ta cellule cible avec des choses du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    txtTelEntrep = Cells(MaRéférence.Row, Range("telent").Column)
     
    ‘ou en inverse 
     
    Cells(MaRéférence.Row, Range("telent").Column) = txtTelEntrep
    MaRéférence étant la cellule identifiante du client voulu et telent le Nom de l’en-tête de colonne Tél Entreprise de ma base.

    L’intérêt du nommage par rapport aux Offset est que c’est bien plus clair à relire et sans souci en cas d’insertion de nouvelles colonnes etc…

    Et de base quand tu écris les données de ton USF, tu écris tout, vides ou non chaque case ayant une destination personnelle.

    pour le N° ID unique, il suffit de faire un moteur (fonction) appliqué à chaque création client.

    cordialement,

    Didier

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 30
    Par défaut
    rebonjour gégé29,

    c'est impec le code que tu m'as donné, mais quand j'enregistre le client, ca se fait impec. Quand j'enregistre un autre client , dans mon tableau excel, il me saute une ligne à chaque fois.

    Par contre, pour modifier un client déjà rentré, ca fonctionne pas. Sachant que je cherche mon client à partir d'une combobox (clnomsociete). Le client est enregistré comme une nouvelle entrée.
    Je te joints des images de mes usf pour que tu te rendes mieux compte .
    Et comment faut-il que je fasse que lorsque je cible un client, toutes les données rentrées précédemment dans mon tableau apparaisse directement dans mon usf client.
    Merci de ton aide car je suis débutante en vba et j'essaie de me dépatouiller comme je peux

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 30
    Par défaut [excel 2003]reproblème ouverture usf
    Bonjour,
    quand j'ouvre mon menu général et que je clique sur "clients" le debogueur me marque range_global a échoué
    pouvez vous m'aider avec les codes et les fichiers images de mes usf que j'ai mis dans la discussion d'avant

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 30
    Par défaut
    merci leforestier, j'ai fait les modifs et ça marche impec.
    Je vais peaufiner encore mon application et j'aurai sûrement besoin encore d'aide comme c'est mon premier vba, je suis loin d'être une experte et tous les conseils que l'on m'a donné jusque là m'ont beaucoup servi.
    Donc en attendant je remercie
    le forestier
    lynx92260
    Gégé29
    et les autres

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Saisie de données automatique dans une cellule
    Par yfchauer dans le forum Excel
    Réponses: 3
    Dernier message: 02/01/2013, 06h24
  2. [XL-2010] Filtre automatique dans userform
    Par duplaly dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 20/07/2011, 00h42
  3. [AC-2007] entrer des données automatiquement dans table
    Par JAG747 dans le forum Modélisation
    Réponses: 12
    Dernier message: 26/12/2010, 18h27
  4. Réponses: 3
    Dernier message: 30/09/2010, 13h06
  5. [Cookies] insertion de données automatique dans formulaire
    Par chouchouboy dans le forum Langage
    Réponses: 8
    Dernier message: 09/06/2006, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo