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 :

Importer données dans fichier Excel via macro VBA [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Importer données dans fichier Excel via macro VBA
    Bonjour à tous,

    après avoir parcouru les forums, je franchis le pas et pose ma question car je n'y arrive décidément pas.

    Voici le problème :

    j'ai un fichier issue d'une requête (données issues d'un système d'information : données source.xls). Ce fichier contient une liste de demandes créées sur trois colonnes :

    - n° demande
    - date d'ouverture de la demande
    - destinataire demande

    Je cherche à lire les données contenues dans ce fichier et les importer dans un tableau Excel (tableau cible.xls) pour :

    - compter le nombre de demandes adressées à chaque destinataire
    - pour chaque destinataire, la date de la demande la plus ancienne

    Les deux fichiers sont joints.

    La difficulté que je rencontre est que le "nom" du destinataire est différent dans chacun des fichiers :

    EG00X dans le tableau cible contre "DPF - EG00X - 'nom département'".

    Il faut donc que la macro recherche la valeur "EG00X" dans la chaîne de caractère "DPF - EG00X - 'nom département'" pour ensuite affecter les bonnes valeurs.

    J'espère que mes propos sont clairs et vous remercient d'avance pour le temps que vous pourrez m'accorder !

    Jérémy
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    pour le comptage, tu peux utiliser une formule plutôt que VBA

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NB.SI(C2:C9;"*EG002*")
    Jérôme

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse rapide.

    Pour le comptage, effectivement nb.si fonctionnait très bien.

    Mais j'ai abandonné Excel car le fichier source est actualisé toutes les semaines (et pas de mise à jour sans que le fichier source ne soit ouvert...). De plus, le nombre de lignes évolue constamment en fonction du nombre de demandes.

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Dans ce cas, penches toi sur l'instruction Find de l'objet Range

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim rg As Range
     
    Set rg = Sheets("Données source").Range("C:C").Find(what:="EG002", lookat:=xlPart)
     
    If Not rg Is Nothing Then
        MsgBox rg.Address
    End If
    Jérôme

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    j'ai chargé votre code et la msgBox affiche "$C$2" alors que je souhaiterai que la macro compte le nombre de fois qu'apparaît "EG002" dans la colonne C et inscrive cette valeur dans le tableau cible.

    Je souhaitais passer par une boucle afin de coller les valeurs dans le tableau cible (voir ci-dessous) mais je ne sais pas comment traduire le fait que mes données source doivent "contenir" le nom indiqué dans le tableau cible.

    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
    For i = 2 To 97 (il s'agit des lignes de mon tableau cible)
     
    somme = 0 (le compteur est défini)
     
    For j = 2 To dernière ligne (il s'agit des lignes de mes données source)
     
    If Sheets("Données source").Cells(j, 3).Value "contient" Sheets("Tableau cible").Cells(i, 1).Value Then
     
    somme = somme + 1
     
    End If
     
    Next j
     
    Sheets("Tableau cible").Cells(i, 2).Value = somme
     
    Next i
    Merci

  6. #6
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    Voici une solution utilisant une collection.
    La collection permet d’avoir une liste de destinataires sans doublon.
    A partir de cette collection, on effectue le comptage des demandes et le relevé de la date la plus ancienne.
    On recherche ensuite le destinataire dans le tableau cible et on renseigne le cumul et la date.
    Le code ne prévoit pas l’ouverture des fichiers. Avant de lancer la procédure, les 2 classeurs doivent donc être ouverts.
    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
    39
    40
    41
    42
    43
    44
    45
    Option Explicit
    Sub Creer_Liste_SansDoublons()
    Dim WsSource As Worksheet, WsCible As Worksheet
    Dim PlageS As Range, PlageC As Range, Cel As Range, c As Range, d As Range
    Dim Collec As Collection
    Dim DerLig As Long, i As Long, Compteur As Long
    Dim Nom As String, firstAddress As String
    Dim DateOuv As Date
        Set WsSource = Workbooks("Données source.xls").Worksheets("Données source")
        Set WsCible = Workbooks("Tableau cible.xls").Worksheets("Tableau cible")
        Set Collec = New Collection
        On Error Resume Next
        Set PlageS = WsSource.Range("C2:C" & WsSource.Range("C" & WsSource.Rows.Count).End(xlUp).Row)
        For Each Cel In PlageS
            Nom = Trim(Split(Cel, "-")(1))
            If Nom <> "" Then Collec.Add Nom, CStr(Nom)
        Next Cel
        On Error GoTo 0
        For i = 1 To Collec.Count
            Compteur = 0
            DateOuv = Date
            Set c = PlageS.Find(Collec.Item(i), LookIn:=xlValues, Lookat:=xlPart)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    If c.Offset(0, -1) < DateOuv Then DateOuv = c.Offset(0, -1)
                    Compteur = Compteur + 1
                    Set c = PlageS.FindNext(c)
                Loop While Not c Is Nothing And c.Address <> firstAddress
                Set PlageC = WsCible.Range("A2:A" & WsCible.Range("A" & WsCible.Rows.Count).End(xlUp).Row)
                Set d = PlageC.Find(Collec.Item(i), LookIn:=xlValues, Lookat:=xlWhole)
                    If Not c Is Nothing Then
                        d.Offset(0, 1) = Compteur
                        d.Offset(0, 2) = DateOuv
                    End If
            End If
            Set PlageC = Nothing
            Set d = Nothing
            Set c = Nothing
        Next i
        Set PlageS = Nothing
        Set Collec = Nothing
        Set WsSource = Nothing
        Set WsCible = Nothing
    End Sub
    Cordialement.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,

    merci, c'est absolument parfait !

    Par rapport à votre code, j'ai juste eu à ajouter une action d'ouverture / fermeture du fichier source pour éviter d'avoir à l'ouvrir manuellement...

    Jérémy

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

Discussions similaires

  1. [XL-2007] importer données de fichiers csv via macro
    Par paul311 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/09/2012, 17h53
  2. Réponses: 5
    Dernier message: 27/05/2008, 18h43
  3. Transfert de données Word vers Excel via macro
    Par Pascalou2008 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/03/2008, 22h02
  4. [C#] importation d'un fichier Excel via un webform
    Par kroukse dans le forum ASP.NET
    Réponses: 6
    Dernier message: 08/10/2007, 16h48
  5. Entré de données dans fichier excel avec Form VB6
    Par avyrex dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 17/05/2007, 14h08

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