VBA Recherchev Table Matrice variable

RaphaelDD

XLDnaute Nouveau
Bonjour,

je travaille sur des rejets d'une application pour mon travail et je souhaiterai automatiser un traitement sur le fichier que j'extrais chaque semaine.

Je suis débutant en VBA j'ai commencé une macro qui fonctionne plutôt bien sauf sur l'action finale => une rechercheV

Sub Rejets()

Rows("1:1").Select
Selection.Delete Shift:=xlUp
Rows("1:1").Select
Selection.Delete Shift:=xlUp

'Apres avoir supprimé les deux premieres lignes du fichier qui ne me servent pas Excel m'ouvre le fichier injecté dans le logiciel
Workbooks.Open Filename:="C:\Documents and Settings\XXX\Desktop\XXXX.csv" 'Ouvre le premier classeur
Application.Run ("Ranger") 'Permet de transformer le CSv en xls (voit plus bas)
ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\uXXXX\Desktop\XXX.xls"
'je copie ensuite le fichier injecté dans mon classeur avec mes rejets
Cells.Select
Selection.Copy
Workbooks("rejets XXXX.xls").Activate
Sheets.Add.Name = "XXXX"
Sheets("XXXX").Select
ActiveSheet.Paste
Range("A1:A1").Select
Sheets("XXXX").Select
'je Selectionne dans la premiere colonne les cellules non vides
nblignes = WksFeuille.Range("a65536").End(xlUp).Row
WksFeuille.Range("a1:h" & nblignes & "").Select

' je veux ensuite étendre la selection sur les deux colonnes d'apres afin de nommer ma plage pour faire ensuite une rechercheV Comment puis je faire?



'Derlign = Range("'409321'!A65000").End(xlUp).Row ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-10],'409321'!R1C1:R[" & Derlign & "]C10,9,FALSE)" 'RechercheV plage variable


Sheets.Add.Name = "R001"
Sheets.Add.Name = "0209"
Sheets.Add.Name = "0326"
Sheets.Add.Name = "0327"
Sheets.Add.Name = "R015"

'Chaque onglet correspond à un code d'erreur je souhaiterai qu'il copie les lignes qui ont ce code dans le bon onglet. Une piste?
End Sub


Sub lancement()

Dim fileToOpen As Variant

fileToOpen = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
Workbooks.Open fileToOpen

If fileToOpen = False Then
MsgBox "Open " & fileToOpen
Else
Rejets
End If

End Sub

Sub Ranger() 'Traitement fichier au format CSV (point virgule)
NomFic = Application.GetOpenFilename(, , "programmes Presses")
If NomFic <> False Then
Workbooks.OpenText Filename:=NomFic, DataType:=1, Semicolon:=True, local:=True
End If
End Sub

Merci d'avance pour votre aide
 

Gorfael

XLDnaute Barbatruc
Re : VBA Recherchev Table Matrice variable

Salut RaphaelDD et le forum
Utilise les balises de code (icone # en mode avancé), ce sera plus lisible
Pas sûr de comprendre.
Quel est le but de ta RechercheV ? Puisque tu travailles en VBA, pourquoi ne pas continuer ?
'Derlign = Range("'409321'!A65000").End(xlUp).Row ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-10],'409321'!R1C1:R[" & Derlign & "]C10,9,FALSE)" 'RechercheV plage variable
Qu'est-ce que c'est supposé faire ?
A+
 

RaphaelDD

XLDnaute Nouveau
Re : VBA Recherchev Table Matrice variable

Merci d'avoir jeté un coup d'oeil.

En fait dans mon fichier de rejets je n'ai que des matricules. Mes 2 recherchev doivent servir a afficher les noms et prenoms de mes collaborateurs.

Mon probleme est que la longueur de ma selection "Table Matrice" est variable. Je pensais sélectionner la première colonne jusqu'a la derniere cellule non vide. Etendre ma selection au deux suivantes puis Nommer la plage.

Ensuite faire ma recherche V dans cette plage.
Mes Matricules dans le fichier de rejet sont dans la colonne C
Et dans le fichier de chargement j'ai dans l'ordre matricule, Nom, prénom

J'espere etre comprehensible :)

Voici le fichier contenant ma Macro:
Free - Envoyez vos documents


Merci encore
 

RaphaelDD

XLDnaute Nouveau
Re : VBA Recherchev Table Matrice variable

En fait je suis coincé sur cette partie du code.
Je dois créer ma plage, la nommer puis intégrer le nom de la plage dans ma rechercheV

Code:
'Sheets("CODO").Select
    'nblignes = WksFeuille.Range("a65536").End(xlUp).Row
    'WksFeuille.Range("a1:h" & nblignes & "").Select
    
 
    
    'ActiveWorkbook.Names.Add Name:="Selection", RefersToR1C1:= _
        "=CODO!R2C1:R48C1"'Nommer une plage
        
        'Derlign = Range("'409321'!A65000").End(xlUp).Row ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-10],'409321'!R1C1:R[" & Derlign & "]C10,9,FALSE)" 'RechercheV plage variable

Avez vous des liens détaillant le fonctionnement des recherchev en VBA ?
 

Gorfael

XLDnaute Barbatruc
Re : VBA Recherchev Table Matrice variable

Salut RaphaelDD et le forum
Toujours diffile de dépanner sans un exemple parlant de qu'on doit arriver à faire
Je suis noyé dans les select de ton code.
La première étape consiste toujours à faire un algorithme : savoir ce que doit faire la macro. En mettant celui-ci sur "papier", le but est de clarifier ce qu'il doit faire et d'éviter de se disperser.
Ce que je crois comprendre de ta macro :
1 - On supprime les 2 premières lignes du fichier F1
2 - on ouvre le fichier CSV pour le transformer en fichier Excel F2
3 - on copie les cellules de la feuille active de F2 dans une nouvelle feuille (CODO) de F1
À partir de là, c'est plus...nébuleux
4 - on nomme une plage A2:A48 : "Selection"
5 - on met en A1 la formule en format L1C1 :
"=VLOOKUP(RC[-10],'409321'!R1C1:R[" & Derlign & "]C10,9,FALSE)"

Je ne crois pas que le 4 et le 5 soit justes :
4 - nommer une plage, d'un mot réservé à Excel est une connerie
5 - pas sûr que ce soit une formule pour A1
- la dernière zone supposée sélectionnée étant :
WksFeuille.Range("a1:h" & nblignes & "").Select
WksFeuille : nom informatique d'une feuille ????
& "" : ne sert à rien
Même en admettant, "VLOOKUP(RC[-10]..."
H= colonne 8 => 8-10=-2 => erreur automatique d'excel

Autrement dit... explique en français ce que tu veux réellement
Définis réellement une plage en mettant des valeurs au 4 coins, ta formule directement dans la bonne cellule et en coloriant ces 4 cellules qu'on puisse se repérer facilement et on te fera un code.
Parce que là je ne comprends rien
A+
 

RaphaelDD

XLDnaute Nouveau
Re : VBA Recherchev Table Matrice variable

Merci pour ta réponse !

Ok je vais essayer d'etre plus clair.
(A partir du point 4, j'ai fait des copier-collés de ce que j'ai trouvé sur internet car je ne sais pas paramétrer les recherchesV sous VBA)

Donc :

Du point 1 à 3 tu as tout compris.
1 - On supprime les 2 premières lignes du fichier F1
J'ajoute juste cette ligne de code (qui n'est pas dans le code initial que je vous ai soumis) pour nommer l'onglet
Code:
Sheets.Add.Name = "Rejets"
2 - on ouvre le fichier CSV pour le transformer en fichier Excel F2
3 - on copie les cellules de la feuille active de F2 dans une nouvelle feuille (CODO) de F1
4- Sélectionner les 3 premières colonnes (jusqu'à la dernière cellule non vide) de la feuille active "CODO" du F1

5- Nommer la plage sélectionnée sous un nom "Plage1" (par exemple)

6- A partir de G2 jusqu'à la fin de la colonne de l'onglet "Rejets" on fait une premiere recherchev pour afficher le prenom
Code:
=RECHERCHEV(C4;plage1;2;FAUX)

7- Ensuite a partir de H2 jusqu'à la fin On fait une deuxiéme rechercheV pour afficher le nom.
Code:
=RECHERCHEV(C4;plage1;3;FAUX))

8 Création des onglets "R001", "0209", "0326", "0327", "0327", "R015"

9 Copier les lignes de l'onglet rejets dans les onglets correspondants
ex: Copier les lignes contenant le code rejet "R001" en colonne E de l'onglet "rejets" dans l'onglet R001

Voila en esperant avoir été plus comprehensible.
 

RaphaelDD

XLDnaute Nouveau
Re : VBA Recherchev Table Matrice variable

En fait j'ai besoin d'aide à partir du point 4
-Comment sélectionner les 3 premieres colonnes de l'onglet "CODO" jusqu'à la derniere cellule non vide.

j'ai trouvé cela (ca me selectionne tout le tableau mais je n'ai besoin que des 3 premières colonnes)

Code:
ActiveSheet.Range("A1").CurrentRegion.Select

- Comment nommer ensuite cette sélection ?
Avec l'enregistreur de macro j'ai trouvé (en faisant une sélection fictive):

Code:
Range("A1:C6").Select
    ActiveWorkbook.Names.Add Name:="plage1", RefersToR1C1:="=codo![B]R1C1:R6C3[/B]"

Comment faire pour que la plage sélectionée soit nommée?
 

RaphaelDD

XLDnaute Nouveau
Re : VBA Recherchev Table Matrice variable

Bon bah j'ai reussi tout seul. Pour ceux qui sont interessés et sans réponse comme moi ....

Voici la méthode que j'ai trouvé pour faire une recherchev sur une colonne avec une table matrice variable.

Définir une plage de cellule puis la nommer (ici "maplage")

Code:
Sub Plage()

Dim maplage As Range
Set maplage = Range("A2").CurrentRegion
ActiveWorkbook.Names.Add Name:="Plage1", RefersTo:=maplage


Puis Placer sa formule excel dans la cellule que l'on veut et utiliser autofill pour la déployer sur toute la colonne (jusquà la dernière cellule nom vide de la colonne d'avant).
Je fais ensuite un copier coller des valeurs pour ne plus avoir la formule.

Code:
Range("G2") = "=VLOOKUP(C2,Plage1,2,0)"

 Range("G2").AutoFill Destination:=Range("G2:G" & Range("F65536").End(xlUp).Row)
    
Columns("G:G").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("G1").Select
    Application.CutCopyMode = False


Il me reste juste à trouver le moyen de copier coller les lignes contenant mes codes erreurs 0501, 0305 (dans ma Colonne E, onglet Rejets) dans le bon onglet (0301, 0305, 1501 ect).
 

Discussions similaires

Statistiques des forums

Discussions
312 229
Messages
2 086 426
Membres
103 206
dernier inscrit
diambote