WorsheetFunction et IF
Bonjour à toutes et tous,
J'ai écrit ces quelques lignes de codes :
Range("F2").Select
Semaine = Range("F2").Value
Sheets(Semaine).Select
'Détermination de la plage de données
BDD = "Basededonnées" & Semaine
Range("A1").CurrentRegion.Select
ActiveWorkbook.Names.Add Name:=BDD, RefersToR1C1:=Selection
'
Sheets("DEBUT").Select
Nbr_ligne = 1
While Cells(Nbr_ligne, 1) <> "Fin"
'
If Cells(Nbr_ligne, 1) = "R" Then
'
With Sheets("DEBUT")
.Range(Cells(Nbr_ligne, 3), Cells(Nbr_ligne, 3)).Value = WorksheetFunction.VLookup(.Range(Cells(Nbr_ligne, 2), Cells(Nbr_ligne, 2)).Value, Sheets(Semaine).Range(BDD), 5, False)
End With
'
Nbr_ligne = Nbr_ligne + 1
Else
'
Nbr_ligne = Nbr_ligne + 1
'
End If
'
Wend
Dans chaque onglet (Semaine) se trouve une base de donnée (BDD). Et je cherche dans ces bases de données des informations dans l'onglet DEBUT.
Le problème est que si la recherche n'aboutie pas la macro plante.
Je voudrais donc introduire un si erreur j'ai donc écrit :
With Sheets("DEBUT")
.Range(Cells(Nbr_ligne, 3), Cells(Nbr_ligne, 3)).Value = WorksheetFunction.If(IsError(VLookup(.Range(Cells(Nbr_ligne, 2), Cells(Nbr_ligne, 2)).Value, Sheets(Semaine).Range(BDD), 5, False), "Ok", "Ko"))
End With
Et là la macro plante à VLookup en disant que la fonction n'existe pas ????
Une idée quelqu'un ??
Merci d'avance
Bonjour
Passe par une variable intermédiaire
Je n'ai pas cherché à simplifier
Dim Resultat
Range("F2").Select
Semaine = Range("F2").Value
Sheets(Semaine).Select
'Détermination de la plage de données
BDD = "Basededonnées" & Semaine
Range("A1").CurrentRegion.Select
ActiveWorkbook.Names.Add Name:=BDD, RefersToR1C1:=Selection
'
Sheets("DEBUT").Select
Nbr_ligne = 1
While Cells(Nbr_ligne, 1) <> "Fin"
'
If Cells(Nbr_ligne, 1) = "R" Then
'
With Sheets("DEBUT")
'.Range(Cells(Nbr_ligne, 3), Cells(Nbr_ligne, 3)).Value = WorksheetFunction.VLookup(.Range(Cells(Nbr_ligne, 2), Cells(Nbr_ligne, 2)).Value, Sheets(Semaine).Range(BDD), 5, False)
Resultat = WorksheetFunction.VLookup(.Range(Cells(Nbr_ligne, 2), Cells(Nbr_ligne, 2)).Value, Sheets(Semaine).Range(BDD), 5, False)
If Not IsError(Resultat) Then
.Range(Cells(Nbr_ligne, 3), Cells(Nbr_ligne, 3)).Value = Resultat
End If
End With
'
Nbr_ligne = Nbr_ligne + 1
Else
'
Nbr_ligne = Nbr_ligne + 1
'
End If
'
WendSi pas ça
Bonjour
Merci de ta réponse, mais désolé cela ne fonctionne pas....Ca plante au même endroit
Bonjour
Joins ton fichier
Bonjour,
Peut être une solution en utilisant le gestionnaire d'erreur VBA.
While Cells(Nbr_ligne, 1) <> "Fin"
If Cells(Nbr_ligne, 1) = "R" Then
With Sheets("DEBUT")
On Error Resume Next
.Cells(Nbr_ligne, 3).Value = WorksheetFunction.VLookup(.Cells(Nbr_ligne, 2).Value, Sheets(Semaine).Range(BDD), 5, False)
On Error Goto 0
End With
Nbr_ligne = Nbr_ligne + 1
Else
Nbr_ligne = Nbr_ligne + 1
End If
WendBanzai64 a écrit :Bonjour
Passe par une variable intermédiaire
Je n'ai pas cherché à simplifier
Dim Resultat Range("F2").Select Semaine = Range("F2").Value Sheets(Semaine).Select 'Détermination de la plage de données BDD = "Basededonnées" & Semaine Range("A1").CurrentRegion.Select ActiveWorkbook.Names.Add Name:=BDD, RefersToR1C1:=Selection ' Sheets("DEBUT").Select Nbr_ligne = 1 While Cells(Nbr_ligne, 1) <> "Fin" ' If Cells(Nbr_ligne, 1) = "R" Then ' With Sheets("DEBUT") '.Range(Cells(Nbr_ligne, 3), Cells(Nbr_ligne, 3)).Value = WorksheetFunction.VLookup(.Range(Cells(Nbr_ligne, 2), Cells(Nbr_ligne, 2)).Value, Sheets(Semaine).Range(BDD), 5, False) Resultat = WorksheetFunction.VLookup(.Range(Cells(Nbr_ligne, 2), Cells(Nbr_ligne, 2)).Value, Sheets(Semaine).Range(BDD), 5, False) If Not IsError(Resultat) Then .Range(Cells(Nbr_ligne, 3), Cells(Nbr_ligne, 3)).Value = Resultat End If End With ' Nbr_ligne = Nbr_ligne + 1 Else ' Nbr_ligne = Nbr_ligne + 1 ' End If ' WendSi pas ça
Je te joins le fichier (1er envoi pas marché)
Bonjour
A tester
Sub macro9()
Dim Resultat
Dim BDD As String
Dim Nbr_Ligne As Long
'Détermination de la plage de données
BDD = "Basededonnées" & Range("F2")
ActiveWorkbook.Names.Add Name:=BDD, RefersToR1C1:=Sheets(Range("F2").Value).Range("A1").CurrentRegion
Nbr_Ligne = 1
With Sheets("DEBUT")
While .Cells(Nbr_Ligne, 1) <> "Fin"
If .Cells(Nbr_Ligne, 1) = "R" Then
Resultat = Application.VLookup(.Range("B" & Nbr_Ligne), Sheets(Range("F2").Value).Range(BDD), 5, False)
If Not IsError(Resultat) Then
.Range("C" & Nbr_Ligne) = Resultat
End If
End If
Nbr_Ligne = Nbr_Ligne + 1
Wend
End With
End SubBonjour
Merci pour ta réponse, mais (malheureusement), la macro plante sur cette ligne :
ActiveWorkbook.Names.Add Name:=BDD, RefersToR1C1:=Sheets(Range("F2").Value).Range("A1").CurrentRegion
En disant : "l'indice n'appartient pas à la sélection.....".....
pijaku a écrit :Bonjour,
Peut être une solution en utilisant le gestionnaire d'erreur VBA.
While Cells(Nbr_ligne, 1) <> "Fin" If Cells(Nbr_ligne, 1) = "R" Then With Sheets("DEBUT") On Error Resume Next .Cells(Nbr_ligne, 3).Value = WorksheetFunction.VLookup(.Cells(Nbr_ligne, 2).Value, Sheets(Semaine).Range(BDD), 5, False) On Error Goto 0 End With Nbr_ligne = Nbr_ligne + 1 Else Nbr_ligne = Nbr_ligne + 1 End If Wend
Cette solution fonctionne
Merci !!!!