XL 2016 Bouton "mettre à jour" depuis classeur externe

arian

XLDnaute Nouveau
Bonjour à tous,

Tout d'abord je vous prie de m'excuser si le sujet a déjà été abordé.

Je possède deux classeurs :

- Le premier est généré automatiquement plusieurs fois par mois depuis un logiciel tiers.

- Le deuxième est mon classeur, celui ou je récupère certaines colonnes du premier classeur, qui contient des tableaux s'incrémentant selon mes colonnes extraites.

J'ai adapté un code que j'ai trouvé sur un forum pour réaliser cette extraction, le voici :

Option Explicit

Dim f1 As Worksheet, plage As Range
Dim derln&, I&, col

Sub Récupérer()

On Error Resume Next
Set f1 = Workbooks("Classeur1").Sheets("Feuil1")
If Err > 0 Then
MsgBox "Vous devez ouvrir le fichier ''Classeur1.xlsx'' qui doit avoir une feuille 'Feuil1'.", 16
Exit Sub
End If

derln = f1.UsedRange.Rows.Count
For I = 1 To 13
col = Choose(I, "A", "C", "D", "G", "J", "K", "L", "M", "BK", "BL", "AH", "AI", "AE")
f1.Range(col & "1:" & col & f1.Range(col & Rows.Count).End(xlUp).Row).Copy Cells(2, I)
Next I

End Sub


Ce code fonctionne très bien, à condition de renommer le classeur en "Classeur1", que ma feuille ou je souhaite extraire les colonnes en "Feuil1", et que ce classeur reste ouvert. J'aurais souhaité faire la même chose sans devoir renommer mon classeur et ma feuille mais au moins ça fonctionne.

Ce que j'aimerais faire, c'est mettre à jour mon deuxième classeur, c'est à dire si le matricule de la colonne D de ma "Feuil1" de mon "Classeur1" existe déjà après mon extraction dans mon classeur2 (l'emplacement de ce matricule dans mon classeur2 est à la colonne C), alors ne rien faire. S'il n'existe pas, l'ajouter en bas de la liste de mon classeur avec toutes les autres colonnes demandés.

En gros, j'ai mon bouton "récupérer", j'aimerais avoir aussi un bouton "mettre à jour".

Je n'ai que très peu de connaissances en VBA, toute aide serait importante pour moi.

D'avance merci
 

youky(BJ)

XLDnaute Barbatruc
Bonjour à tous,
Voici une macro qui fonctionne depuis longtemps et tous les jours.
Le fichier source peut être ouvert ou fermé et cela sur toute version et nul besoin de quoi que ce soit.
A modifier dans la macro le chemin si pas en Thisworkbook.path et NomFichierSource.xls à adapter
Voir aussi Feuil1 qui est le codename et non le nom de l'onglet
VB:
Sub ouverture()
Application.ScreenUpdating = False
For Each Wb In Workbooks
  If Wb.Name = "NomFichierSource.xls" Then
    Workbooks(Wb.Name).Activate: k = 1
  End If
Next
If k = "" Then   'fichier pas ouvert
'à adapter si chemin est dans un autre dossier
chemfich = ThisWorkbook.Path & "\NomFichierSource.xls"
On Error Resume Next
Workbooks.Open chemfich
If Err <> 0 Then MsgBox "NomFichierSource.xls non trouvé": Exit Sub'pas trouvé
End If
ActiveWindow.WindowState = xlMinimized
ThisWorkbook.Activate
ActiveWindow.WindowState = xlMaximized
With Workbooks("NomFichierSource.xls").Sheets(1)'avec 1er onglet du fichier source
Feuil1.[A1:M10000].Clear
Feuil1.[A1:A10000].Value = .[A1:A10000].Value
Feuil1.[B1:B10000].Value = .[C1:C10000].Value
Feuil1.[C1:C10000].Value = .[D1:D10000].Value
Feuil1.[D1:D10000].Value = .[G1:G10000].Value
Feuil1.[E1:H10000].Value = .[J1:M10000].Value
Feuil1.[I1:I10000].Value = .[BK1:BK10000].Value
Feuil1.[J1:J10000].Value = .[BL1:BL10000].Value
Feuil1.[K1:K10000].Value = .[AH1:AH10000].Value
Feuil1.[L1:L10000].Value = .[AI1:AI10000].Value
Feuil1.[M1:M10000].Value = .[AE1:AE10000].Value
End With
Workbooks("NomFichierSource.xls").Close False
End Sub
 

arian

XLDnaute Nouveau
Bonsoir Roblochon,
Exact mais pas besoin de se prendre la tête à actualiser et plus rapide.
Bien sur passer en macro par le workbook_open que je n'ai pas signalé.
Bruno


Bonjour,

Merci beaucoup pour votre réponse. Le code fonctionne.

Toutefois, je n'ai pas l'impression qu'il vérifie avec les matricules si les données sont extraites sont déjà présentes ?

J'aurais une nouvelle question à vous poser. Dans mon classeur source, à la colonne K, sont enregistré des noms, et à la colonne BI des dates.

Est ce qu'il est possible d'en plus de filtrer avec le matricule, de pouvoir filtrer les données extraites en fonction d'un Nom, et/ou d'une date ? Par exemple : extraire uniquement les données dont le matricule n'est pas déjà présent, qui corresponde au nom "François Dupont" datant de 2019 et 2020.

Je me rend compte que ce fichier source contient des données qui remontent jusqu'en 2005. Il extrait donc des milliers de lignes dont je n'ai pas pas besoin.

A nouveau je vous remercie
 

youky(BJ)

XLDnaute Barbatruc
Bonjour,
Tout dépend de ce que l'on fait ensuite avec cette base.
Si ca gène pas on laisse sinon appliquer un fitre aprés coup
Sans voir de fichier difficile d'imaginer.

Roblochon, désolé d'avoir été brusque. . .
Souvent les fichiers créés par les logiciels restent sur les serveurs et perso n'y ayant pas accès
c'est difficile de faire les requêtes sinon Power est simple.
Bruno
 

arian

XLDnaute Nouveau
Bonjour,
Tout dépend de ce que l'on fait ensuite avec cette base.
Si ca gène pas on laisse sinon appliquer un fitre aprés coup
Sans voir de fichier difficile d'imaginer.

Roblochon, désolé d'avoir été brusque. . .
Souvent les fichiers créés par les logiciels restent sur les serveurs et perso n'y ayant pas accès
c'est difficile de faire les requêtes sinon Power est simple.
Bruno


Cette base importé dans mon fichier contient des dates, des chiffres, des noms d'affaires qui incrémentent ensuite des tableaux ligne par ligne.

Par exemple, ma cellule V1 s'incrémente en fonction de la valeur extraite depuis mon fichier source et qui se situe dans mon fichier de destination dans la cellule O1.

Ma cellule V2 s'incrémente en fonction de la valeur extraite depuis mon fichier source et qui se situe dans mon fichier de destination dans la cellule O2.

J'aimerais donc pouvoir mettre à jour ma base en extrayant les nouvelles données et qu'elles se placent en bas de ma liste, car si une valeur extraite s'incrémente entre deux lignes déjà extraites, cela décalerait tous mes tableaux de mon fichier.

J'espère que être clair dans mes propos.

Pour effectuer cela, j'avais pensé à vérifier avec le matricule, (qui est unique à chaque ligne), mais cela ne serait pas suffisant puisque l'extraction prendrait en compte les affaires datant de plusieurs années qui ne sont pas présente dans mon fichier de destination.

En bref : Depuis mon fichier de destination j'extrais plusieurs colonnes dont la colonne D contenant le matricule que je souhaite vérifier et qui est placé dans la colonne B dans mon fichier de destination. J'extrais également la colonne BK (au format date) dans la colonne I de mon fichier de destination.

Il me faudrait pouvoir choisir quelles années je souhaite extraire, mais aussi vérfier si le matricule n'est pas déjà présent dans mon fichier de destination.

En vous remerciant encore pour l'aide que vous m'avez déjà apporté
 

Discussions similaires

Statistiques des forums

Discussions
312 167
Messages
2 085 901
Membres
103 027
dernier inscrit
Dridi Ahmed