J'ai essayé de rechercher une solution à mon problème XLookup via VBA mais je n'en ai pas trouvé. J'ai cet ensemble de données ci-dessous:

Data Set

Dans l'ensemble de données, si une cellule de la plage C2: C6 est vide, je souhaite utiliser cette formule =IF(ISBLANK(B2),"",XLOOKUP(B2,A:A,IF(ISBLANK(D:D),"",D:D))) dans ces cellules. Où le numéro de ligne de B2 est variable en fonction de la ligne, nous mettons cette formule via VBA.

Si une cellule de la plage C2: C6 a une valeur, je souhaite utiliser cette valeur sans aucune formule. Et si quelqu'un supprime la valeur et que la cellule devient vide, VBA ajoutera la formule ci-dessus à cette cellule.

Actuellement dans la capture d'écran ci-dessus, toutes les cellules de la plage C2: C6 ont la formule ci-dessus.

J'espère que j'ai eu du sens. Si ce n'est pas faisable, ça va. Je peux toujours utiliser une colonne d'aide. Mais je pense que VBA serait un moyen plus propre pour mon tableau de bord.

Merci d'avance.

-1
ram singh 3 sept. 2020 à 15:52

2 réponses

Meilleure réponse

Dans le module de classe de la feuille, mettez ce code

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim rCell As Range
    
    For Each rCell In Me.Range("C2:C6").Cells
        If IsEmpty(rCell.Value) Then
            Application.EnableEvents = False
            rCell.FormulaR1C1 = "=IF(ISBLANK(RC[-1]),"""",xlookup(RC[-1],C[-2],IF(ISBLANK(C[1]),"""",C[1])))"
            Application.EnableEvents = True
        End If
    Next rCell
    
End Sub

Cela fonctionnera chaque fois que quelque chose sur la feuille change. Cela ne peut pas ralentir les choses, donc vous ne voulez pas essayer d'en faire trop dans l'événement Change. Il ne tire pas sur le calcul, cependant.

0
Dick Kusleika 11 sept. 2020 à 10:57

Celui-ci semble fonctionner pour n'importe quel ensemble de données. Merci à tous pour l'aide:

Private Sub InsertFormula()

Dim mwRng As Range
    Set mwRng = Range("C2:C250")
    Dim d As Range
    For Each d In mwRng
        If d.Value = "" Then
      d.Formula = "=IF(RC[-1]="""",""-"",INDEX(C[1],MATCH(RC[-1],C[-2],0)))"
    End If
Next d

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("C2:C250")) Is Nothing Then
        Application.EnableEvents = False
        Call InsertFormula
        Application.EnableEvents = True
    End If
End Sub
-1
ram singh 7 sept. 2020 à 13:19