Codeur amateur demandant de l'aide, encore une fois :-)

J'ai le code ci-dessous qui fonctionne bien, il obtient une variable dans une liste déroulante de validation et exécute la commande automatiquement parce que je et en utilisant le Private Sub Worksheet_Change(ByVal Target As Range). Le problème que j'ai est que parfois l'utilisateur tape dans la boîte plutôt que de la sélectionner.

J'ai un

erreur d'exécution 91

Car il ne peut pas trouver la valeur saisie par l'utilisateur.

Comment puis-je détecter cette erreur et créer un message contextuel pour leur dire qu'ils doivent choisir dans la liste déroulante? Et aussi comme il rompt le code, il définit mon Application.EnableEvents sur False car il ne termine pas le code de la section ByVal Target As Range qui se réinitialise à True.

Comment puis-je réinitialiser le Application.EnableEvents à True en cas de rupture de code?

Sub Copy_From_Borrower_DBase()
    Dim myVal As String
    Dim sourceRng As Range
    myVal = Sheets("Main").Range("F2").Value ' dropdown list
    Set sourceRng = Worksheets("Borrower Database").Range("5:5").Find(What:=myVal, LookAt:=xlWhole) 'locate column where to copy from
    Worksheets("Main").Range("F5").Value = Worksheets("Borrower Database").Cells(5, sourceRng.Column).Value 'Borrower Name
    Worksheets("Main").Range("G6").Value = Worksheets("Borrower Database").Cells(6, sourceRng.Column).Value 'Income
End Sub
2
MEC 20 nov. 2018 à 16:13

3 réponses

Meilleure réponse

Vérifiez d'abord que la plage ne renvoie rien (ce qui signifie que le terme n'a pas été trouvé). L'utilisation de With est essentiellement cosmétique, mais je pense que le code est quelque peu rangé.

Sub Copy_From_Borrower_DBase()

Dim myVal As String
Dim sourceRng As Range
myVal = Sheets("Main").Range("F2").Value ' dropdown list

With Worksheets("Borrower Database")
    Set sourceRng = .Range("5:5").Find(What:=myVal, LookAt:=xlWhole)
    If Not sourceRng Is Nothing Then
        Worksheets("Main").Range("F5").Value = .Cells(5, sourceRng.Column).Value 'Borrower Name"
        Worksheets("Main").Range("G6").Value = .Cells(6, sourceRng.Column).Value 'Income"
    Else
        MsgBox "whatever"
    End If
End With

End Sub
4
SJR 20 nov. 2018 à 13:24

Pour répondre à la question sur la gestion des erreurs:

Public Sub MyProcedure()
    Application.EnableEvents = False

    On Error Goto ENABLE_EVENTS 'if any error occurs after this line events get enabled.

    'stuff where an error could occur

ENABLE_EVENTS:
    Application.EnableEvents = True
    If Err.Number <> 0 Then
        MsgBox "an error occurred"
    End If
End Sub

Pour plus d'informations sur la gestion des erreurs: Gestion des erreurs VBA - Un guide complet.

2
Pᴇʜ 20 nov. 2018 à 14:27

J'essaierais d'abord de résoudre le problème en ne permettant pas qu'il y ait un problème, si cela échoue, je m'inquiète de la gestion des erreurs.

Puisque vous appelez déjà Worksheet_Change et que vous utilisez la validation des données, cela vérifie la valeur de la cellule de validation. S'il contient une valeur, votre code s'exécutera. S'il est vide, ce ne sera pas le cas. La validation des données efface la cellule si quelqu'un y tape, donc peu importe ce qu'il tape au moment où il atteint Worksheet_Change, il doit s'agir d'une chaîne vide.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$F$2" Then         ' Your Dropdown Validation Cell
        If Not Target.Value = "" Then
            Call Copy_From_Borrower_DBase
        End If
    End If
End Sub
0
JosephC 20 nov. 2018 à 18:56