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
    '
  Wend

Si 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

Le voilà

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
Banzai64 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
    '
  Wend

Si 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 Sub

Bonjour

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 !!!!

Rechercher des sujets similaires à "worsheetfunction"