2016-11-22 2 views
0

Je suis nouveau à VBA et n'ai que récemment développé mes compétences Excel.En utilisant le code VBA pour copier la valeur spécifique d'une cellule lorsque la liste déroulante change cette valeur

J'ai créé 3 scénarios différents pour une situation de projet d'investissement, ces scénarios apparaissent dans la cellule "h13" comme une liste déroulante avec trois options disponibles, meilleur cas/pire cas/scénario de base.

Lorsque vous sélectionnez chaque scénario, les différentes sorties changeront sur la feuille et j'ai mis en place le code suivant pour modifier les sorties et afficher celles qui sont pertinentes selon le scénario:

Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.Address = "$H$13" Then 
    ActiveSheet.Scenarios(Target.Value).Show 
    End If 

Maintenant, ce que je vouloir atteindre est la suivante:

Dans la cellule E13 j'ai une valeur numérique qui est ma principale préoccupation (je devrais noter qu'il s'agit d'une formule NPV). Chaque fois que nous changeons de scénario, cette valeur change évidemment. Je voudrais pour créer un tableau récapitulatif qui est simplement quelque chose comme ceci: Scénario 1 = x Scénario 2 = y Scénario 3 = z Donc, Idéalement, ce que je veux à faire est, lorsque nous sélectionnons le scénario 1, nous copions la valeur de E13 pour indiquer B21. Lorsque nous sélectionnons le scénario suivant E13 changera évidemment, mais je voudrais que la valeur copiée de B21 reste la même, et maintenant la nouvelle valeur du scénario 2 à afficher dans B22.

Je ne sais pas comment s'y prendre? Je l'ai essayé d'ajouter cela sur le fond, mais les valeurs que je pense pas rester « statique »

If Target.Cells.Count > 1 Then Exit Sub 
If Not Intersect(Target, Range("h13")) Is Nothing Then 
    Range("E13").Copy 
    Range("B21:B23").PasteSpecial xlPasteValues 
End If 
    End Sub 

Maintenant, je sais que je dois créer une référence pour qu'il se lise comme suit quelque chose comme quand e13 = y puis copiez, suivant e13 = x copie et boucle? jusqu'à ce que tous les résultats ont eu lieu. Je ne sais pas comment le faire quand même.

Toute aide serait appréciée, je l'ai essayé de lire sur cela autant que possible, mais je ne peux pas vraiment le point d'épingle exactement ce que je dois en termes de code que je suis très nouveau à cette

Merci à l'avance.

Répondre

0

Cette solution présente les résultats dans une "table gamme \" situé à B20:D23(voir images ci-dessous)

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim rTbl As Range, lRow As Long 

    Application.EnableEvents = False      'To avoid triggering again when table is updated 

    If Target.Address = "$H$13" Then 

     Rem Filters value in target range 
     Select Case Target.Value2 
     Case "Base case", "Best case", "Worst case"   'Change as required 
     Case Else: GoTo ExitTkn       'Value is not in the list then exit 
     End Select 

     Rem Show Scenario 
     ActiveSheet.Scenarios(Target.Value).Show 

     Rem Update Results 
     Set rTbl = Range("B21").Resize(3, 3)    'Change as required 
     With rTbl 
      lRow = WorksheetFunction.Match(Target.Value, .Columns(1), 0) 
      .Cells(lRow, 2).Value = Range("E13").Value2  'Updates result - Change as required 
      .Cells(lRow, 3).Value = Range("D13").Value2  'Updates scenario variable - Change as required 
     End With 

    End If 

ExitTkn: 
    Application.EnableEvents = True 

    End Sub 

enter image description here enter image description here

Proposer à lire les pages suivantes pour gagner une meilleure compréhension des ressources utilisées:

Select Case Statement, With Statement

+0

Salut, Merci pour cela, le processus logique du code est logique mais j'obtiens l'erreur suivante: Erreur d'exécution 1004 Impossible d'obtenir la propriété de match de la classe WorksheetFunction lRow = WorksheetFunction.Match (Target.Value, .Columns (1), False) Maintenant, je me dis que Columns (1) est le problème, mais je ne sais pas exactement pourquoi? – abrk23

+0

Cette erreur vous indique qu'il n'y a pas de correspondance (c'est-à-dire 'Cible.La valeur »n'a pas été trouvée dans la« colonne 1 du tableau », pas dans la colonne 1 de la feuille de calcul). Vous devez vous assurer que les valeurs de la première colonne de la table sont exactement les mêmes que les valeurs de 'DataValidation'. – EEM

+0

Vérifiez également que cette ligne a été mise à jour en fonction de l'emplacement de la table: 'Set rTbl = Range (" B21 "). Resize (3, 3)'. Notez que '" B21 "' fait référence à la première ligne de la table et non à l'en-tête. – EEM