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 :

Mise à jour d'un fichier TARGET excel depuis un autre SOURCE


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    NC
    Inscrit en
    Janvier 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Points : 51
    Points
    51
    Par défaut Mise à jour d'un fichier TARGET excel depuis un autre SOURCE
    Bonjour,

    Soit un fichier SOURCE (onglet So)
    Code Designation Data1 Data2
    A 1 z g
    B 2 e h
    C 3 r j

    Soit un fichier TARGET (onglet Ta)
    Code Designation Data1 Data2 Data3
    A 1 z f 1
    B 0 b f 1


    Je souhaite faire une mise à jour de TARGET en référence avec Code pour obtenir:
    Code Designation Data1 Data2 Data3
    A 1 z g 1
    B 2 e h 1
    C 3 r j 1

    On remarquera que Data3 est figé à 1, une ligne est crée dans TARGET et les colonnes sont mises à jour avec les données de SOURCE.
    Avez-vous une idée pour créer cette macro ?

    Voila à quoi je pense:

    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
    Private Sub Worksheet_Activate()
    Dim i As Integer, j As Integer
     
    Application.ScreenUpdating = False
     
    With Sheets("SOURCE")
        For i = 3 To .Range("A1048576").End(xlUp).Row
            For j = 3 To Range("A1048576").End(xlUp).Row
                If Range("A" & j) = .Range("A" & i)  Then
                       Range("B" & j) = .Range("B" & i)
                       Range("C" & j) = .Range("C" & i)
                       Range("D" & j) = .Range("D" & i)
                       Range("E" & j) = 1
                End If
            Next j
        Next i
    End With
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je n'ai pas testé le code mais ça devrait être plus rapide:
    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
    Option Explicit
     
    Private Sub Worksheet_Activate()
     
      Dim i As Integer
      Dim rngC As Range
     
      Application.ScreenUpdating = False
     
      With Worksheets("SOURCE")
        For i = 3 To .Range("A" & .Rows.Count).End(xlUp).Row
     
          Set rngC = Columns(1).Find(.Cells(i, 1), , , xlWhole)
          If Not rngC Is Nothing Then
            Cells(rngC.Row, 2) = .Cells(i, 2)
            Cells(rngC.Row, 3) = .Cells(i, 3)
            Cells(rngC.Row, 4) = .Cells(i, 4)
            Cells(rngC.Row, 5) = 1
          End If
     
        Next i
      End With
     
    End Sub

  3. #3
    Invité
    Invité(e)
    Par défaut
    Et au cas ou plusieurs lignes du fichier 'TARGET' sont identiques:
    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
    Option Explicit
     
    Private Sub Worksheet_Activate()
     
      Dim i As Integer
      Dim rngC As Range
      Dim strAdd As String
     
      Application.ScreenUpdating = False
     
      With Worksheets("SOURCE")
        For i = 3 To .Range("A" & .Rows.Count).End(xlUp).Row
     
          Set rngC = Columns(1).Find(.Cells(i, 1), , , xlWhole)
          If Not rngC Is Nothing Then
     
            strAdd = rngC.Address
            Do
              Cells(rngC.Row, 2) = .Cells(i, 2)
              Cells(rngC.Row, 3) = .Cells(i, 3)
              Cells(rngC.Row, 4) = .Cells(i, 4)
              Cells(rngC.Row, 5) = 1
              Set rngC = Columns(1).FindNext(rngC)
            Loop While rngC.Address <> strAdd
     
          End If
     
        Next i
      End With
     
    End Sub

  4. #4
    Membre du Club
    Homme Profil pro
    NC
    Inscrit en
    Janvier 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Points : 51
    Points
    51
    Par défaut
    Pour le poste suivant, je me base sur la dernière macro:

    Pour rappel TARGET et SOURCE sont les noms de fichiers
    L'onglet de TARGET est So
    L'onglet de SOURCE est Ta

    J'ai l'erreur 9 à la ligne 11

    Je ne vois pas comment prendre les données de SOURCE pour la mise à jour dans TARGET. On devrait activé les onglets ??

    Et merci de s'y être intéressé.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Il faut remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Worksheets("SOURCE")
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Workbooks("NOM DU CLASSEUR").Worksheets("Ta")
    Avec le bon nom du classeur.

    Ce code fonctionne si la macro est lancée avec la feuille "So" de sélectionnée.

  6. #6
    Membre du Club
    Homme Profil pro
    NC
    Inscrit en
    Janvier 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Points : 51
    Points
    51
    Par défaut
    Si je rajoute une variable temp et en mode debug pas à pas

    Je modifie la boucle en ajoutant cette variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
             temp=.Cells(i,2)
              Cells(rngC.Row, 2) = .Cells(i, 2)
              Cells(rngC.Row, 3) = .Cells(i, 3)
              Cells(rngC.Row, 4) = .Cells(i, 4)
              Cells(rngC.Row, 5) = 1
    Sur le fichier Target l'écriture en colonne 5 de 1 se fait correctement, alors que temp affiche aucune chaine de caractère sur toute la boucle.
    Je n'arrive pas à extraire les données de Source.

  7. #7
    Membre du Club
    Homme Profil pro
    NC
    Inscrit en
    Janvier 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Points : 51
    Points
    51
    Par défaut
    Finalement la macro fonctionne pour la mise à jour.

    Mais la ligne C 3 r j 1 n'est pas créée.

    Voici le code:

    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
    Option Explicit
     
    Private Sub Worksheet_Activate()
     
      Dim i As Integer
      Dim rngC As Range
      Dim strAdd As String
     
     
     
      Application.ScreenUpdating = False
     
    With Workbooks("Source.xlsm").Worksheets("So")
        For i = 2 To .Range("A" & .Rows.Count).End(xlUp).Row
     
          Set rngC = Columns(1).Find(.Cells(i, 1), , , xlWhole)
          If Not rngC Is Nothing Then
     
            strAdd = rngC.Address
            Do
     
              Cells(rngC.Row, 2) = .Cells(i, 2)
              Cells(rngC.Row, 3) = .Cells(i, 3)
              Cells(rngC.Row, 4) = .Cells(i, 4)
              Cells(rngC.Row, 5) = 1
              Set rngC = Columns(1).FindNext(rngC)
            Loop While rngC.Address <> strAdd
     
          End If
     
        Next i
      End With
     
    End Sub

  8. #8
    Invité
    Invité(e)
    Par défaut
    La macro n'est pas prévue pour ajouter des lignes. Elle met à jour les lignes existantes par rapport au fichier source.

    Chercher si des lignes existent dans le fichier 'source' mais pas dans le fichier 'target' n'est pas implémenté dans cette macro.

  9. #9
    Membre du Club
    Homme Profil pro
    NC
    Inscrit en
    Janvier 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Points : 51
    Points
    51
    Par défaut
    Merci, finalement j'ai trouvé.

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

Discussions similaires

  1. mise à jour BD par fichier joint excel
    Par magicstar dans le forum Bases de données
    Réponses: 9
    Dernier message: 30/03/2009, 12h25
  2. Réponses: 5
    Dernier message: 24/10/2008, 11h43
  3. Mise à jour d'un fichier excel par un autre
    Par Homer091 dans le forum Excel
    Réponses: 3
    Dernier message: 13/06/2008, 15h45
  4. [Excel] Mise à jour d'un fichier
    Par Orasana dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/07/2007, 15h52
  5. mise à jour d'un fichier excel à partir d'un textbox
    Par hachdotnet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/03/2007, 16h59

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