Chercher dans une feuille si l'élément d'une listbox est présent
Bonjour,
J'ai deux fichiers différents. Mes macro sont présent dans un seul fichier A, et vont chercher des informations dans le second B. Aucun souci pour aller chercher les données.
Cependant, j'aimerai maintenant complété le deuxième fichier B. Seulement voilà, mon fichier B est composé de 3 feuilles qui n'ont pas la même structure. Donc je doit faire des manip différentes pour chaque feuilles. Ce n'est pas ça qui me pose le plus de problème je pense.
Ensuite à chaque fois l'élément recherché (présent dans la deuxième colonne d'une listbox) n'est présent que dans une feuille.
J'utilise donc le code suivant :
Dim Lig As Long
Call ouvre_materiel_externe
For i = 0 To n
If ListBox1.Selected(i) And Application.CountIf(CS.Worksheets("HYDREKA").Columns(d), ListBox1.List(i, 0)) > 0 And Application.CountIf(CS.Worksheets("HYDREKA").Columns(c), ComboBox2.Value) > 0 And Application.CountIf(CS.Worksheets("HYDREKA").Columns(f), ListBox1.List(i, 1) > 0) Then
Lig = Application.Match(ListBox1.List(i, 0), .Columns(d), 0)
.Cells(Lig, 17) = TextBox6.Value
ElseIf ListBox1.Selected(i) And Application.CountIf(CS.Worksheets("IJINUS").Columns(c), ListBox1.List(i, 0)) > 0 And Application.CountIf(CS.Worksheets("IJINUS").Columns(b), ComboBox2.Value) > 0 And Application.CountIf(CS.Worksheets("IJINUS").Columns(e), ListBox1.List(i, 1) > 0) Then
Lig = Application.Match(ListBox1.List(i, 0), .Columns(c), 0)
.Cells(Lig, 16) = TextBox6.Value
ElseIf ListBox1.Selected(i) And Application.CountIf(CS.Worksheets("AUTRES LOUEURS").Columns(c), ListBox1.List(i, 0)) > 0 And Application.CountIf(CS.Worksheets("IJINUS").Columns(b), ComboBox2.Value) > 0 And Application.CountIf(CS.Worksheets("IJINUS").Columns(e), ListBox1.List(i, 1) > 0) Then
Lig = Application.Match(ListBox1.List(i, 0), .Columns(c), 0)
.Cells(Lig, 16) = TextBox6.Value
End If
NextJ'ai une erreur d'éxécution 1004 : Erreur définie par l'application ou par l'objet
J'ai mis quelques espions pour essayer de comprendre, et voilà le résultat :
Donc il semblerait que le souci soit au niveau de CS.Worksheets("HYDREKA").Columns(d)
Pourtant, CS est bien défini dans ouvre_materiel_externe
Sub ouvre_materiel_externe()
Dim Chemin As String
Fichier = "Gestion loc materiel externe 21_LSA.xlsx"
Chemin = ThisWorkbook.Path & "\Loc externe\"
Workbooks.Open Chemin & Fichier
Set CS = Workbooks(Fichier)
ThisWorkbook.Activate
End SubSi il y a besoin d'éclaircir un peu le contexte n'hésitez pas !
Si quelqu'un trouve le souci, je suis preneuse !
Merci bien !
Bonjour
Sans fichier....Il vous manque les guillemets -->
(CS.Worksheets("HYDREKA").Columns("d")ou
(CS.Worksheets("HYDREKA").Columns(4)Bonjour !
Les guillemets n'y changent rien ...
Je mets les fichiers en pièces jointes.
Le souci se pose dans le fichier A, au niveau de l'useform2, dans "CommandButton1_Click().
Fichier A :
Fichier B
Les guillemets n'y changent rien ..
Sauf qu'il faut aussi corriger plus loin car il y a en d'autres qui manquent de la code valider. Il faut les mettre partout
Essayez déjà cela
Edit : en regardant dans le code sur cette ligne, il y a une erreur sur cette ligne je pense. juste avant le THEN le > 0 à la fin doit être après la parenthèse. Comme ceci :
If ListBox1.Selected(i) And Application.CountIf(CS.Worksheets("HYDREKA").Columns("d"), ListBox1.List(i, 0)) > 0 And Application.CountIf(CS.Worksheets("HYDREKA").Columns("c"), ComboBox2.Value) > 0 And Application.CountIf(CS.Worksheets("HYDREKA").Columns("f"), ListBox1.List(i, 1))> 0 Thenje pense que le controle sur la colonne F est inutile puisque votre numéro de série est unique. Cela pourrait simplifier le code sur cette ligne comme ceci :
If ListBox1.Selected(i) And Application.CountIf(CS.Worksheets("HYDREKA").Columns("d"), ListBox1.List(i, 0)) > 0 And Application.CountIf(CS.Worksheets("HYDREKA").Columns("c"), ComboBox2.Value) > 0 thenBonjour !
Oui effectivement, la ligne étant tellement longue que je n'avais pas vu les autres ... Merci !
Oui j'ai également remarqué qu'il y avait un souci de parenthèse à la fin de chaque ligne ! merci aussi !
je pense que le controle sur la colonne F est inutile puisque votre numéro de série est unique. Cela pourrait simplifier le code sur cette ligne comme ceci :
Oui c'est une bonne remarque, cependant ce n'est pas tout à fait le vrai. Car certain matériels externes n'ont pas de numéros de série, c'est rare, mais ça existe, et d'autres ont seulement "-" comme numéros de série. Donc le contrôle sur la colonne f peut servir dans ces cas là !
Finalement le code suivant fonctionne parfaitement :
If CheckBox3.Value = True Then
Call ouvre_materiel_externe
For i = 0 To n
With CS.Worksheets("HYDREKA")
If ListBox1.Selected(i) And Application.CountIf(.Columns("d"), ListBox1.List(i, 0)) > 0 And Application.CountIf(.Columns("c"), ComboBox2.Value) > 0 And Application.CountIf(.Columns("f"), ListBox1.List(i, 1)) > 0 Then
For Each cel In .Range("C3:C" & .Range("C" & .Rows.Count).End(xlUp).Row)
If cel.Value = ComboBox2.Value Then
If ListBox1.List(i, 0) = cel(1, 2) Then
cel(1, 15) = TextBox6.Value
End If
End If
Next
End If
End With
With CS.Worksheets("IJINUS")
If ListBox1.Selected(i) And Application.CountIf(.Columns("c"), ListBox1.List(i, 0)) > 0 And Application.CountIf(.Columns("b"), ComboBox2.Value) > 0 And Application.CountIf(.Columns("e"), ListBox1.List(i, 1)) > 0 Then
For Each cel In .Range("B3:B" & .Range("B" & .Rows.Count).End(xlUp).Row)
If cel.Value = ComboBox2.Value Then
If ListBox1.List(i, 0) = cel(1, 2) Then
cel(1, 15) = TextBox6.Value
End If
End If
Next
End If
End With
With CS.Worksheets("AUTRES LOUEURS")
If ListBox1.Selected(i) And Application.CountIf(.Columns("c"), ListBox1.List(i, 0)) > 0 And Application.CountIf(.Columns("b"), ComboBox2.Value) > 0 And Application.CountIf(.Columns("e"), ListBox1.List(i, 1)) > 0 Then
For Each cel In .Range("B3:B" & .Range("B" & .Rows.Count).End(xlUp).Row)
If cel.Value = ComboBox2.Value Then
If ListBox1.List(i, 0) = cel(1, 2) Then
cel(1, 15) = TextBox6.Value
End If
End If
Next
End If
End With
Next
End If
CS.Save 'enregistre le fichier
CS.Close False 'fermeture du fichier Gestion-Loc sans enregistrantMerci beaucoup pour l'aide !
Bonne journée