Sub CONTACT()
Dim i As Long
Dim DL As Long
DL = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To DL
ThisWorkbook.ActiveSheet.Cells(i, 14) = Application.VLookup(ThisWorkbook.ActiveSheet.Cells(i, 1).Value, Workbooks("K:\AFFRETEMENT EN COURS\2015\SEPTEMBRE 2015\affretement SEPTEMBRE 2015.xls").Sheets(1).Range("T:W"), 1, False)
Next i
End Sub
Excel me dit : "L'indice n'appartient pas à la sélection et me surligne :
ThisWorkbook.ActiveSheet.Cells(i, 14) = Application.VLookup(ThisWorkbook.ActiveSheet.Cells(i, 1).Value, Workbooks("K:\AFFRETEMENT EN COURS\2015\SEPTEMBRE 2015\affretement SEPTEMBRE 2015.xls").Sheets(1).Range("T:W"), 1, False)
Après un petit test, j'arrive à faire marcher la macro. Seulement voilà, il faut qu'il n'y ait que 2 colonnes dans la plage de recherche, que les données soient triées et qu'en colonne 1 j'ai la donnée à rechercher et dans la colonne 2 la valeur a faire apparaître....
Du coup ma demande va sûrement être beaucoup plus complexe. Serait-il possible de créer un fichier excel temporaire sous un nom que je lui donne, dans lequel je met les colonnes comme il faut pour que la recherchev marche, que la recherchev se fasse grâce à la macro et que le fichier excel temporaire disparaisse ensuite?
Re-Bonjour,
Si DL doit compter la colonne B de Feuil1, alors tu as une erreur Colonne 1 au lieu de 2
DL = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Aussi vérifiez nom de fichier
affretement SEPTEMBRE 2015.xls
affretement-SEPTEMBRE-2015.xls
Ce n'est pas pas identique
Sub GetRates()
Dim i As Long, DL As Long, NumOT As String, lig As Long, N As Byte
DL = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To DL
NumOT = ThisWorkbook.ActiveSheet.Cells(i, 2)
N = Application.CountIf(Workbooks("affretement-SEPTEMBRE-2015.xls").Worksheets("NATIONAL").Range("W:W"), NumOT)
If N = 1 Then
With Workbooks("affretement-SEPTEMBRE-2015.xls").Worksheets("NATIONAL")
lig = 1
lig = .Columns("W").Find(NumOT, .Cells(lig, "W"), , xlWhole).Row
ThisWorkbook.ActiveSheet.Cells(i, 14) = .Cells(lig, "T")
End With
Else
'code si pas present ou doublons
End If
Next i
End Sub
Merci beaucoup. Je ne peux pas tester le fichier original pour voir si ça marche, un utilisateur étant en train de l'utiliser actuellement pour la matinée. Dès que je peux tester, je vous le dis (en début d'après-midi). Merci beaucoup pour l'aide en tout cas. Et pour avoir pensé au CountIf.
Après test, effectivement ça marche dans mon fichier original :)
Par contre, j'ai voulu répéter l'opération sur la feuille EXPORT du fichier base.
Voici mon code :
Sub GetRates()
Dim i As Long, DL As Long, NumOT As String, lig As Long, N As Byte
DL = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To DL
NumOT = ThisWorkbook.ActiveSheet.Cells(i, 2)
N = Application.CountIf(Workbooks("affretement SEPTEMBRE 2015.xls").Worksheets("NATIONAL").Range("W:W"), NumOT)
If N = 1 Then
With Workbooks("affretement SEPTEMBRE 2015.xls").Worksheets("NATIONAL")
lig = 1
lig = .Columns("W").Find(NumOT, .Cells(lig, "W"), , xlWhole).Row
ThisWorkbook.ActiveSheet.Cells(i, 14) = .Cells(lig, "T")
End With
End If
N2 = Application.CountIf(Workbooks("affretement SEPTEMBRE 2015.xls").Worksheets("EXPORT").Range("W:W"), NumOT)
If N = 1 Then
With Workbooks("affretement SEPTEMBRE 2015.xls").Worksheets("EXPORT")
lig = 1
lig = .Columns("W").Find(NumOT, .Cells(lig, "W"), , xlWhole).Row
ThisWorkbook.ActiveSheet.Cells(i, 14) = .Cells(lig, "T")
End With
End If
Next i
End Sub
Mais j'ai un soucis :"Variable Objet ou variable de bloc With non définie sur :
lig = .Columns("W").Find(NumOT, .Cells(lig, "W"), , xlWhole).Row
Et si je passe ma souris au dessus, ça me dit xlWhole = 1.
Une autre petite question peut-être un peu complexe...
Le fichier "base" sur lequel est faite la recherche est amené à changer. En effet, vous vous doutez bien qu'en Octobre, le nom du fichier sera "affretement en cours OCTOBRE 2015". Donc en fait, j'aurais voulu avoir un nom de fichier variable en fonction du mois choisi par l'utilisateur. Ca j'aurais pu le faire.
Là où ca se complique, c'est que j'aurais voulu avoir un bouton "changer de mois" ou "changer d'année" pour que l'utilisateur intervienne lui même directement pour changer le code VBA automatiquement et définitivement (on ne reviendra jamais en arrière). Pensez vous que cela est possible?
Pour info, le code a été pour l'instant modifié ainsi :
Sub CONTACTS()
Dim Wk As Workbook, x As String, i As Long, DL As Long, NumOT As String, lig As Long, N As Byte, Mois As String, Année As String
Mois = InputBox("Entrer le mois d'affretement en majuscules (Ex : JANVIER)")
If Mois = "" Then Exit Sub
Annee = InputBox("Entrer l'année d'affrètement (Ex : 2015)")
x = "affretement" & " " & Mois & " " & Annee
On Error Resume Next
Set Wk = Workbooks(x & ".xls")
If Err <> 0 Then
Workbooks.Open Filename:="K:\AFFRETEMENT EN COURS\" & Annee & "\" & Mois & " " & Annee & "\" & x & ".xls"
End If
DL = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To DL
NumOT = ThisWorkbook.ActiveSheet.Cells(i, 2)
N = Application.CountIf(Workbooks("affretement SEPTEMBRE 2015.xls").Worksheets("NATIONAL").Range("W:W"), NumOT)
If N = 1 Then
With Workbooks("affretement" & " " & Mois & " " & Annee & ".xls").Worksheets("NATIONAL")
lig = 1
lig = .Columns("W").Find(NumOT, .Cells(lig, "W"), , xlWhole).Row
ThisWorkbook.ActiveSheet.Cells(i, 14) = .Cells(lig, "T")
End With
End If
Next i
Workbooks("POINTAGE FINAL.xlsm").Activate
End Sub
Ce qui permet de vérifier si la base est ouverte, sinon le code l'ouvre au départ. J'ai aussi intégré la notion de "nom de fichier variable". Mais bon, pour l'instant je passe par des InputBox systématiques qui demandent le mois et l'année. Pas du tout optimal sachant que le travail est fait tous les jours. Donc il n'y a besoin de changer qu'à certaines occasions.
Pensez-vous qu'il soit possible de laisser le code tel quel tout le temps jusqu'à ce que l'utilisateur ait besoin d'un changement de mois ou d'année, auquel cas le code pourrait s'adapter pour que le nom du fichier à l'intérieur suive.
Par contre, j'ai voulu répéter l'opération sur la feuille EXPORT du fichier base. Ben, dans le fichier base que j'ai, y a pas d'onglet export
Une autre petite question peut-être un peu complexe... si c'est mois en cours et annee en cours, il suffit de partir de la date du jour et prendre le mois et l'annee pour ouvrir le bon fichier
Sub CONTACTS()
Dim Wk As Workbook, Nom_Fichier As String, i As Long, DL As Long, NumOT As String, lig As Long, N As Byte, Mois As String, Année As String
Lmois = Array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre")
Mois = Lmois(Month(Now))
Annee = Year(Now)
Nom_Fichier = "affretement" & " " & Mois & " " & Annee & ".xls"
On Error Resume Next
Set Wk = Workbooks(Nom_Fichier)
If Err <> 0 Then
Workbooks.Open Filename:="K:\AFFRETEMENT EN COURS\" & Annee & "\" & Mois & " " & Annee & "\" & Nom_Fichier
End If
DL = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To DL
NumOT = ThisWorkbook.ActiveSheet.Cells(i, 2)
N = Application.CountIf(Workbooks(Nom_Fichier).Worksheets("NATIONAL").Range("W:W"), NumOT)
If N = 1 Then
With Workbooks(Nom_Fichier).Worksheets("NATIONAL")
lig = 1
lig = .Columns("W").Find(NumOT, .Cells(lig, "W"), , xlWhole).Row
ThisWorkbook.ActiveSheet.Cells(i, 14) = .Cells(lig, "T")
End With
End If
Next i
Workbooks("POINTAGE FINAL.xlsm").Activate
End Sub
@PlacageGranby : Tout est tellement mal organisé dans l'architecture des dossiers qu'il vaut vraiment mieux ouvrir directement le fichier.
@f894009 : Effectivement, il n'y avait pas de feuille EXPORT, mais elle se comporte exactement pareil, avec les mêmes colonnes. N'y a-t-il pas moyen de répéter l'opération sur la feuille EXPORT?
Ce n'est pas le mois en cours ni l'année en cours. En fait ça dépend. Du coup j'ai fait un UserForm avec 2 ComboBox. Mais voilà je n'ai jamais utilisé ce genre d'outils. Du coup une fois que j'ai fait mes choix dans les 2 cases (année et mois) comment faire pour qu'en cliquant sur OK, mon code s'exécute en récupérant les valeurs des combobox?
Il est possible de choisir dynamiquement le fichier
Dim Fichier As Variant
'Affiche la boîte de dialogue "Ouvrir"
Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
C'est relativement élégant pour un utilisateur pour qu'il puisse choisir lui même le fichier.
On peut aussi filtrer pour seulement utiliser les fichiers "affretement" et choisir un répertoire par défaut.
Public Sub CommandButton1_Click()
MOIS_BOX = ComboBox1.Value
ANNEE_BOX = ComboBox2.Value
Application.Run ("CONTACTS")
End Sub
Private Sub UserForm_Initialize()
With Me.ComboBox1
.AddItem "JANVIER"
.AddItem "FEVRIER"
.AddItem "MARS"
.AddItem "AVRIL"
.AddItem "MAI"
.AddItem "JUIN"
.AddItem "JUILLET"
.AddItem "AOUT"
.AddItem "SEPTEMBRE"
.AddItem "OCTOBRE"
.AddItem "NOVEMBRE"
.AddItem "DECEMBRE"
End With
With Me.ComboBox2
.AddItem "2015"
.AddItem "2016"
.AddItem "2017"
.AddItem "2018"
.AddItem "2019"
.AddItem "2020"
.AddItem "2021"
.AddItem "2022"
.AddItem "2023"
.AddItem "2024"
.AddItem "2025"
.AddItem "2026"
.AddItem "2027"
.AddItem "2028"
.AddItem "2029"
.AddItem "2030"
End With
End Sub
Ma macro :
Public Sub CONTACTS()
Dim Wk As Workbook, x As String, i As Long, DL As Long, NumOT As String, lig As Long, N As Byte, Mois As String, Année As String
Mois = MOIS_BOX
Annee = ANNEE_BOX
x = "affretement" & " " & Mois & " " & Annee
On Error Resume Next
Set Wk = Workbooks(x & ".xls")
If Err <> 0 Then
Workbooks.Open Filename:="K:\AFFRETEMENT EN COURS\" & Annee & "\" & Mois & " " & Annee & "\" & x & ".xls"
End If
DL = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To DL
NumOT = ThisWorkbook.ActiveSheet.Cells(i, 2)
N = Application.CountIf(Workbooks("affretement SEPTEMBRE 2015.xls").Worksheets("NATIONAL").Range("W:W"), NumOT)
If N = 1 Then
With Workbooks("affretement" & " " & Mois & " " & Annee & ".xls").Worksheets("NATIONAL")
lig = 1
lig = .Columns("W").Find(NumOT, .Cells(lig, "W"), , xlWhole).Row
ThisWorkbook.ActiveSheet.Cells(i, 14) = .Cells(lig, "T")
End With
End If
Next i
Workbooks("POINTAGE FINAL.xlsm").Activate
End Sub
Le code ne trouve pas le fichier parce qu'il considère les ComboBox comme vide. Ce n'est pas comme ça qu'on récupère les données qui s'y trouvent?
Eh ben voilà... Ca marche. Merci beaucoup. Et concernant l'autre feuille "EXPORT", vous savez pourquoi je ne peux pas faire ma recherche? Je peux vous joindre le fichier si besoin.
Avez-vous declare dans un module les variables MOIS_BOX et ANNEE_BOX Public, de facon a pouvoir les utiliser dans tout le code
Pour l'utilisation sur deux onglets, faire attention aux variables N et N2
croisement de reponse!!
Pour l'utilisation sur deux onglets, faire attention aux variables N et N2
Merci infiniment, mon problème est résolu.
Bonne soirée.
Rohlala je vous fais perdre du temps pour rien Pas du tout, ca nous arrive aussi de ne pas voir l'evidence