Difficulté d'importation d'un autre tableur

Bonsoir à tous,

Je me permets de vous solliciter afin de m'aider dans la résolution d'un de mes problèmes sur Excel,

Alors que je me fais tranquillement la main sur VBA je rencontre un soucis sur un de mes dossiers client au boulot.

  • Je charge depuis mon fichier source (ÉTAT_FORUM) un autre tableur excel (OT_FORUM)
  • Dans ce classeur importé (OT_FORUM) je recherche dans la colonne H un repère équivalent à
  • un repére situé mon classeur ouvert (ÉTAT_FORUM) dans le feuillet (INVENTAIRE) dans la colonne M

-Si il trouve, il copie la valeur trouvé en colonne B et E qui sont situé sur la même ligne VERS la colonne D et E de la première ligne vide de mon feuillet (ÉTAT).

Jusqu'ici, cela marche à 75% mais :

premièrement, il ne me colle pas la valeur à la première ligne disponible mais à la même ligne que sa situation dans le fichier importé(OT_FORUM)?

deuxièmement j'aurais aimé que lorsqu'il me trouve une similitude depuis le classeur importé qu'il me copie égalemen,t la valeur qui se situe 3 lignes plus haut ainsi que la valeur situé toujours 3 lignes plus haute que la similitude mais en colonne V.

Bien conscient que c'est du boulot, je vous en remercie d'avance pour l'aide que vous m'apporterez (ainsi que les explications afin de m'améliorer pour le futur)

PS : j'ai joins les 2 fichiers !

edit : j'ai oublié mais le feuillet (INVENTAIRE) contient environ 1600 lignes et le fichier importé (OT_FORUM) également, il est donc possible qu'il y ai une solution plus optimisé et adéquate pour mon codage.

11ot-forum.zip (10.38 Ko)
11etat-forum-v11.xlsm (47.92 Ko)

Bonjour,

Comme très souvent ce genre d'exposé et de fichier très simplifié pose plus de question qu'il ne précise la problématique.

- Trois lignes plus haut dans ETAT il n'y a rien...

En revanche 2 lignes plus haut on peut trouver N° OT et statut : C'est ça que tu veux récupérer ?

On imagine bien que c'est ça que tu veux récupérer mais tu ne dis rien de l'endroit ou tu veux coller ces informations.

Aussi avant de faire une macro inutile je te suggère de faire une feuille modèle qui montre le résultat escompté.

Merci.

A+

Bonjour,

Je dois dire que j'ai eu un peu de mal entre tes explications sinueuses et tes noms de variables qui représentent un vrai cauchemar pour moi J'adore lorsqu'un nom de variable ne dépasse pas 3 caractères ! Alors imagine...

Je me suis tâté pour modifier tous tes noms, mais cela me compliquait un peu plus, alors j'ai laissé et j'en ai rajouté, (et enlevé une aussi).

J'espère avoir bien pris les bonnes à chaque fois dans les lignes de commande...

Sub MAJSTREAM()
    Dim j As Long, LgDer As Long, i As Long
    Dim Cel As Range, Fichier, StreamSuivi, StreamInv As String
    Dim ColRepereSuivi As Integer, ColStreamINVENTAIRE As Integer, ColRepereINVENTAIRE As Integer
    Dim ColRepereStream As Integer, LgSuivi As Integer, ColZoneINVENTAIRE As Integer
    Dim WbExt As Workbook, WsExt As Worksheet, WsMain As Worksheet, WsINVENTAIRE As Worksheet
    With ThisWorkbook
        .Sheets("ETAT").Unprotect
        Set WsMain = .Sheets("ETAT")
        Set WsINVENTAIRE = .Sheets("INVENTAIRE")
    End With
    ColRepereSuivi = 4
    ColStreamINVENTAIRE = 13
    ColRepereINVENTAIRE = 2
    ColRepereStream = 8
    ColZoneINVENTAIRE = 5
    LgDer = WsINVENTAIRE.Cells(Rows.Count, ColStreamINVENTAIRE).End(xlUp).Row
    LgSuivi = WsMain.Cells(Rows.Count, ColRepereSuivi).End(xlUp).Row + 1
    Fichier = Application.GetOpenFilename("Excel Workbook (*.xls),*.xls")
    If Fichier = False Then Exit Sub
    Application.ScreenUpdating = False
    Set WbExt = Workbooks.Open(Fichier)
    Set WsExt = WbExt.Sheets("Sheet1")
    With WsINVENTAIRE
        For j = 2 To LgDer
            StreamInv = .Cells(j, ColStreamINVENTAIRE)
            Set Cel = WsExt.Columns(ColRepereStream).Find(StreamInv, lookat:=xlWhole)
            If Not Cel Is Nothing Then
                StreamSuivi = Array(.Cells(j, ColRepereINVENTAIRE), .Cells(j, ColZoneINVENTAIRE))
                WsMain.Cells(LgSuivi, ColRepereSuivi).Resize(, 2).Value = StreamSuivi
                LgSuivi = LgSuivi + 1
            End If
        Next j
    End With
    WbExt.Close False
    WsMain.Protect
  End Sub

Cordialement

bonjour

salut galopin, MFerrand

il semble qu'on a voulu imiter ce qui se fait avec un papier et un crayon

mon conseil : pas de recopie en dur. Pas de VBA.

ton système semble utiliser 2 tables de base :

  • inventaire : mettre des titres et non des n° en ligne 1 : OBLIGATOIRE pour faire du bon Excel, puis "mettre sous forme de tableau"
  • interventions : à mettre aussi en colonnes. Un intervention = 1 ligne ! Simple et rapide et efficace et durable.

entre ces 2 tables tu peux récupérer des données avec des RECHERCHEV() fonction que tu DOIS apprendre

ensuite tu imprimes tes OT avec une fusion dans Word

pas de VBA

aucune formule à part les RECHERCHEV

un système de ce genre te durera 20 ans. Sur tous les Windows, les iOS

et même sous OOBase.

Re, Salut Galopin, jmd !

Petite précision, j'ai évité de me pencher sur la philosophie de ton opération et l'organisation de tes fichiers, mais il faut tout de même indiquer que ton titre est trompeur ! Tu n'importes rien ! Tu reproduis deux données d'une feuille à une autre du même classeur sous condition qu'une référence existe dans le second classeur...

Cordialement.

Bonjour,

[Ferrand] Un peu d'accord avec toi, mais nous n'avons pas compris la même chose !

Il ne se passe rien quand on exécute ta macro ?

Bon j'ai quand même un peu gratté sur le sujet en attendant que notre ami termine sa grasse matinée...

Bon je suis resté un peu dans le même esprit pour pas trop dérouter notre ami, mais c'est sur que si je m'étais écouté j'aurai pas fait comme ça...

Bon j'ai quand même revu un peu le nom des variables... Parce que j'ai pas que ça à faire ! C'est dimanche hein...

Sub MAJSTREAM()
Dim iR&, iLR&, iLRS&, iLRC&, i&  '& =  As Long
Dim iC1%, iC2%, iC3%, iC4%          '% =  As Integer
Dim iCR1%, iCR2%, iCRech%, arg$     '$ = as String
Dim rng As Range, Fichier
Dim WbS As Workbook
Dim WsS As Worksheet, WsC As Worksheet, WsINV As Worksheet

  Sheets("ETAT").Unprotect ""
  Set WsC = Sheets("ETAT")
  Set WsINV = Sheets("INVENTAIRE")
  iC1 = 4
  iC2 = 5
  iC3 = 6
  iC4 = 7
    iCRef = 13
    iCRech = 8
    iCR1 = 2
    iCR2 = 5

  Fichier = Application.GetOpenFilename("Excel Workbook (*.xls),*.xls")
  If Fichier = False Then Exit Sub
  Application.ScreenUpdating = False

  Set WbS = Workbooks.Open(Filename:=Fichier)
  Set WsS = WbS.Sheets("Sheet1")

  iLR = WsINV.[A1].CurrentRegion.Rows.Count
  iLRS = WsS.[A1].CurrentRegion.Rows.Count
  iLRC = WsC.[A1].CurrentRegion.Rows.Count + 1  'la ligne ou on écrira

  For iR = 2 To iLR
    arg = WsINV.Cells(iR, iCRef)
    Set rng = WsS.Cells.Find(what:=arg, LookIn:=xlValues, lookat:=xlWhole)
    If Not rng Is Nothing Then
        i = rng.Row
        WsC.Cells(iLRC, iC1).Value = WsINV.Cells(iR, iCR1)
        WsC.Cells(iLRC, iC2).Value = WsINV.Cells(iR, iCR2)
        WsC.Cells(iLRC, iC3).Value = WsS.Cells(i - 3, iCRech)
        WsC.Cells(iLRC, iC4).Value = WsS.Cells(i - 2, 22)
        iLRC = iLRC + 1
      End If

  Next iR
  WbS.Close

  End Sub

Convention de nommage des variables :

R= Row

LR = LastRow

C = Column (ou Cible selon le contexte)

S = Source

Mébon il subsiste les difficultés de compréhension que je signalais plus haut (sans même parler de la cellule fusionnée à R-3, bref quelques retouches s'imposeront peut être...

A+

Salut Galopin !

Je t'avoue que je n'avais pas testé... J'ai donc pris le temps de reprendre les fichiers pour tester : c'est Find qui n'opère pas ! Sans doute à cause de la fusion de cellule, car en cherchant sur l'ensemble de la feuille ça fonctionne.

Je n'ai pas eu le temps de tester en défusionnant... Dans la foulée du test concluant, j'ai redétruit les fichiers... Je n'ai pas non plus l'intention de passer mon dimanche là-dessus !

Cordialement.

Bonjour à tous,

Merci à tous pour vos réponses et surtout pour avoir pris le temps d'analyser ma demande.

Par contre, pour la grasse matinée c'est surtout que je sortais du boulot à 06h00, mes excuses

J'identifie bien vos problèmes de compréhension auquel je vais tenter d'y répondre :

Pour les variables à plus de 3 caractères je suis également désolé, c'est surtout pour que je me perde pas dans tout ça ...

Pour les cellules fusionnées dans le tableau importé, je ne pourrais rien y faire, ceci étant une extraction d'un nouveau progiciel national d'EDF ... (mon code fonctionnait très bien avec notre ancien progiciel mais comme on aime démonter les choses qui fonctionnent ...).

Maintenant dans la finalité souhaitée de la macro :

1) elle balaye la colonne M (13) de mon feuillet inventaire pour chercher une référence égale dans la colonne H (8) du fichier extérieur que j'ai précédemment chargé

2) si elle trouve une référence égale alors

3)Dans la référence trouvé sur le fichier chargé, elle sélectionne la valeur se situant dans la même colonne et situé 3 cellules au dessus de la référence trouvé (N°OT) ainsi que la référence (STATUT) situé toujours 14 cellules à droite et 3 cellules plus hautes que la référence trouvé.

4)elle colle ces 2 valeurs (N°OT) et (STATUT) dans la première ligne disponible dans le feuillet SUIVI de mon classeur respectivement dans les colonnes A (1) pour le N°OT et dans la colonne I (9) pour le STATUT.

5)Cette même référence égale trouvé ans cette ligne du feuillet inventaire, elle sélectionne les valeurs présentes en colonne B (2), en colonne D (4), colonne E (5) et colonne K (11) pour les coller respectivement dans :

la même et première ligne disponible du feuillet ETAT en colonne D (4), colonne G (7), colonne E(5), colonne J(10)

Dites moi simplement ce qui vous permettrait de mieux comprendre et je l'appliquerais.

Ceci dit après avoir essayé le code proposé par Galopin01, cela marche parfaitement, je pense pouvoir l'adapter à la disposition souhaitée (n'ayant pas été très clair dans ma première demande).

Encore merci pour vos réponses.

Si Galopin a mieux compris que moi ce que tu voulais, tant mieux pour toi...

Bonne continuation.

Ce qui permettrai de mieux comprendre c'est de voir le résultat attendu dans une feuille ETAT(Démo) parce que maintenant c'est de plus en plus le m... !

En attendant que tu me fournisses un fichier qui me fournisse un visu plus convaincant que tes explications.

Je te donne une version corrigée avec "CeQueJaiCompris"

Sub MAJSTREAM()
Dim iR&, iLR&, iLRS&, iLRC&, i&  '& =  As Long
Dim iC1%, iC2%, iC3%, iC4%          '% =  As Integer
Dim iCR1%, iCR2%, iCRech%, arg$     '$ = as String
Dim rng As Range, Fichier
Dim WbS As Workbook
Dim WsS As Worksheet, WsC As Worksheet, WsINV As Worksheet

  Sheets("ETAT").Unprotect ""
  Set WsC = Sheets("ETAT")
  Set WsINV = Sheets("INVENTAIRE")
    iC1 = 1
    iC2 = 9
    iC3 = 2
    iC4 = 4
    iC5 = 5
    iC6 = 11

    iCRef = 13
    iCR3 = 4
    iCR4 = 7
    iCR5 = 5
    iCR6 = 10
  Fichier = Application.GetOpenFilename("Excel Workbook (*.xls),*.xls")
  If Fichier = False Then Exit Sub
  Application.ScreenUpdating = False

  Set WbS = Workbooks.Open(Filename:=Fichier)
  Set WsS = WbS.Sheets("Sheet1")

  iLR = WsINV.[A1].CurrentRegion.Rows.Count
  iLRS = WsS.[A1].CurrentRegion.Rows.Count
  iLRC = WsC.[A1].CurrentRegion.Rows.Count + 1  'la ligne ou on écrira

  For iR = 2 To iLR
    arg = WsINV.Cells(iR, iCRef)
    Set rng = WsS.Cells.Find(what:=arg, LookIn:=xlValues, lookat:=xlWhole)
    If Not rng Is Nothing Then
        i = rng.Row

        WsC.Cells(iLRC, iC1) = WsS.Cells(i - 3, 8)
        WsC.Cells(iLRC, iC2) = WsS.Cells(i - 2, 22)
        WsC.Cells(iLRC, iC3) = WsINV.Cells(iR, iCR3)
        WsC.Cells(iLRC, iC4) = WsINV.Cells(iR, iCR4)
        WsC.Cells(iLRC, iC5) = WsINV.Cells(iR, iCR5)
        WsC.Cells(iLRC, iC6) = WsINV.Cells(iR, iCR6)
        iLRC = iLRC + 1
      End If

  Next iR
  WbS.Close

  End Sub

A+

Rechercher des sujets similaires à "difficulte importation tableur"