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.
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
Je me suis tâté pour modifier tous tes noms, mais cela me compliquait un peu plus, alors
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 SubCordialement
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 !
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 SubConvention 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é...
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...
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 ...
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 SubA+