Récupérer des ligne dans un autre classeur avec condition

Bonjour à tous, le forum,

Je me permets de vous écrire pour vous demander une aide sous vba.
Voila, j’ai une base qui se remplie constamment avec plein de références.
Seule une référence est importante pour moi.

En gros, j’ai deux fichiers excel, un qui me sert de base(mabase) et l’autre qui me sert de fichier réception(resultat).
Dans mon fichier excel Résultat, j’ai un bouton (synchroniser) qui me permet de récupérer les lignes qui correspondent à ma référence.

Mais je n’arrive pas. Quelqu’un saurait m’aider?
Vous en saurez plus en ouvrant les deux fichiers. Dans le excel résultat il y a un exemple.

Merci d’avance à vous.

Resultat.xlsm (25,1 Ko)

Voici ma base de données

MABASE.xlsx (2,0 Mo)

Bonjour,

Quand tu dis:
Bien sur j’aimerai qu’on ai pas besoin d’ouvrir le fichier base de données pour accéder à ses informations

On peut l’ouvrir par la macro pour prendre les infos et le refermer

ou

Ne pas l’ouvrir et récupérer les infos (là c’est plus la même)

La base mise à jour garde t’elle les anciennes valeurs, ou elle les conserve?

Bonjour,
C’est la journée des questions ^^.

“Synchro” veut dire quand tu cliques récupérer que les nouvelles données correspondantes ? ou compiler avec celle qui sont déjà présentes dans le fichier résultat ?
Ce fichier Base est remplacé ? ou complété chaque début de semaine ? Sa structure (nom des colonnes, position) ne change pas ?

Oublie pas de préciser ta version Excel et si tu travail sur Mac ou Windows (manipulation de fichiers pas pareil".

Hu :flushed: avec toutes ces questions j’espère qu’il reviendra.

La base mise à jour conserve les anciennes valeurs déjà présente.
Il est même possible qu’il y ait des informations en double. C’est pourquoi ma condition(pour éviter des doublons) est que la cellule du temps ne soit pas vide.

Quand l’utilisateur finit de remplir le fichier base, il le ferme. Et juste après moi j’ouvre mon fichier résultat pour obtenir mes informations. Laquelle des deux solutions(que tu me proposes) semble répondre parfaitement avec mon problème? Si je dois choisir je prendrai:Ne pas l’ouvrir et récupérer les infos. Tant qu’il récupère toutes les infos

WildDigiSoft,
je suis sur excel2016
En effet la structure de la base ne change jamais.
Synchro pour une sorte de rafraîchissement. C’est a dire il remet ma liste à jour (dans le fichier résultat).
Ça répond à ta question?
Merci

Re,

Pour moi au plus simple,

Quand le fichier BASE est rempli (mais même s’il n’est pas rempli avec les Nelles données),
un appui sur le bouton

  • 1 il ouvre la base
  • 2 il prend les données et les copies/colles
  • 3 referme la base

D’accord Mimimathy,
Je prends en compte ta solution. D’ailleurs elle me semble meilleur au niveau programme

Ok, sur Excel 2016 tu as PowerPivot intégré. Tu peux importer des données d’un classeur fermé dans résultat.
Il fera en arrière plan la requête SQL correspondante.
L’avantage est que tu peux modifier le modèle de données facilement, et la fréquence d’actualisation est paramétrable.

  1. Depuis ton fichier résultat–>Menu Données pour créer la requête
  2. Selectionne le fichier (Clique sur modifier pour supprimer les colonnes inutiles,filtrer les dates null,…)
    soluce1
  3. Clique sur le bouton “Fermer et charger” pour creer la connection et charger les données
  4. Tu te retrouve dans un tableau excel avec une requête dont tu peux réediter le modèle, sinon modifier la fréquence d’actualisation (très mal fait a mon avis cette partie je te met donc un image )

Re,
Les classeur MABASE et Resultat doivent être dans le même dossier, sinon modifier le chemin dans la macro

La macro:

Sub Transfert()
    Dim WbkS As Workbook, WbkD As Workbook
    Dim Dl%, i%, j%
    Set WbkD = ThisWorkbook 'Ce classeur
    Range("A2:F65000").ClearContents  'Efface les anciennes données
    Workbooks.Open ThisWorkbook.Path & "\MABASE.xlsx" 'Ouvre MABASE
    Set WbkS = ActiveWorkbook 'Classeur MABASE
    Dl = Range("c" & Rows.Count).End(xlUp).Row 'Derniere ligne MABASE
    j = 2
    For i = 4 To Dl 'Boucle
      If WbkS.Sheets("BASE PRODUCT").Cells(i, 3).Value = "305-048" And IsNumeric(WbkS.Sheets("BASE PRODUCT").Cells(i, 18).Value) Then
        WbkD.Sheets("DONNEES").Cells(j, 1) = WbkS.Sheets("BASE PRODUCT").Cells(i, 3)  'Code article
        WbkD.Sheets("DONNEES").Cells(j, 2) = WbkS.Sheets("BASE PRODUCT").Cells(i, 5)  'Reference
        WbkD.Sheets("DONNEES").Cells(j, 3) = WbkS.Sheets("BASE PRODUCT").Cells(i, 6)  'N° OP
        WbkD.Sheets("DONNEES").Cells(j, 4) = WbkS.Sheets("BASE PRODUCT").Cells(i, 12) 'Date imputation
        WbkD.Sheets("DONNEES").Cells(j, 5) = WbkS.Sheets("BASE PRODUCT").Cells(i, 18) 'Temps
        WbkD.Sheets("DONNEES").Cells(j, 6) = WbkS.Sheets("BASE PRODUCT").Cells(i, 22) 'Semaine
        j = j + 1
      End If
    Next i
    ActiveWorkbook.Close 'Ferme MABASE
End Sub

le classeur:
Resultat.xlsm (25,5 Ko)

2 J'aimes

Salut Mimimathy, bonjour le forum,

J’ai adapté ton code à ma base de données.
Le programme fonctionne correctement.
Un petit bémol, dans ma base j’atteins des ligne allant jusqu’à 30 000(A30000).
Dl = Range(“c” & Rows.Count).End(xlUp).Row ne fonctionne pas. Il marque que la fonction Row ne convient pas. J’ai alors mis ceci:
Dl = 30000
Là c’est bon, ça passe nickel sauf que pour Dl = 40000 il me mets dépassement de capacité. Tu aurais une idée sur comment gérer ça ou c’est normal?

Bonjour @Thychick,
Salut @Mimimathy,

@Thychick, garde le code de @Mimimathy et change cette ligne dans le code.

Dim Dl%, i%, j%

Par cette ligne.

Dim Dl$, i%, j%

@Mimimathy est en train de répondre, je vais donc voir si j’avais raison.

Cordialement.

Bonjour

Remet la macro comme à l’initial et replace cette ligne

Dim Dl%, i%, j%

par celle ci

Dim Dl&, i&, j&

cela permet de passer au-dessus de 32767 lignes en allant jusqu’à 2147483647 :wink:

1 J'aime

Salut @Mimimathy,

Eh ben voilà, je me suis encore trompé en utilisant le symbole texte en place et lieu du symbole numérique “Long”.

Je n’ais pas le niveau, faut que je me fasse une raison :upside_down_face:

Cordialement.

1 J'aime

Salut MDO
Tu as peut-être fait l’erreur de déclaration de variable, mais tu as quand même trouvé le “Schmilblick” du BUG
comme quoi tu n’est pas si mauvais que tu le penses, et tu l’aurais trouvé assez vite :grinning:

2 J'aimes

Merci Mimimathy, merci MDO,
En effet en changeant juste la définition des variables, il dépasse les 60000 lignes.
Merci les pros.
Je programme sur C# mais vba c’est vraiment meilleur.

Re,

Par contre si tu dépasse les 65000 lignes, modifie la ligne

Range("A2:F65000").ClearContents 'Efface les anciennes données

par

Range("A2:F1048576").ClearContents 'Efface les anciennes données

Oui je l’avais déjà modifié ça.