2017-07-22 4 views
1

betrachten das folgende Beispiel, um autofill:Macro N Anzahl von Zellen (Zeilen/Spalten) basierend auf einem Wert in einem anderen Blatt

enter image description here

Man bedenke, dass ich in dem „Blatt 1“ die Tabelle habe mit die Spalten Land und Essen mit seinen Werten.

In Blatt 2 habe ich zwei Spalten namens Country # 1 und Food # 1. Das Makro, das ich bereits habe (Kredite an @ sktneer), muss die Nahrungsmittel # 1 Zelle, die mit dem richtigen Text in der Zelle des Landes # 1 verbunden ist, über die Auswahlliste automatisch füllen.

Beispiel: Wenn ich in Land # 1 "Madrid" wähle, muss das Essen # 1 mit dem Text "Tapas und Tortillas" automatisch ausgefüllt werden.

Der Code hierfür lautet:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.CountLarge > 1 Then Exit Sub 
    Dim wsSource As Worksheet 
    Dim r As Long 
    Set wsSource = Sheets("Sheet1")  'Source sheet which contains a table of countries and their food 
    If Target.Column = 1 And Target.Row > 1 Then 
     If Application.CountIf(wsSource.Columns(1), Target.Value) > 0 Then 
      Application.EnableEvents = False 
      r = Application.Match(Target.Value, wsSource.Columns(1), 0) 
      Target.Offset(0, 1) = wsSource.Cells(r, 2) 
      Application.EnableEvents = True 
     End If 
    End If 
End Sub 

Meine Frage ist: Kann dieser Code auf eine größere Anzahl von Spalten skaliert werden, für die genau das gleiche Problem?

Hier ist eine Vorschau eines Beispiels:

enter image description here

Sorry, wenn diese Frage umfangreich ist, aber mein Ziel hier ist es, beide Codes vergleichen (die ich habe und dieses Beispiel), zu lernen, wie auf N Zeilenanzahl und N Spaltenanzahl skalieren.

Mit freundlichen Grüßen, Luís

+0

Die kurze Antwort ist - ja, leicht. Ihr Hinweis, dies selbst herausfinden zu können, ist bereits im Code-Typ - "Target.Offset (0, 1) = wsSource.Cells (r, 2)". Technisch haben Sie nur Code aus einer anderen Frage und haben nicht versucht, dies für sich selbst zu tun. Zum größten Teil gab ich dir die Antwort, du musst nur verstehen, was es tut. Sobald Sie verstehen, dass Sie Ihre Antwort haben werden. –

Antwort

0

Dies scheint zu kompliziert, wenn alles, was Sie ist im Wesentlichen ein vlookup zu tun versuchen. Hier ist eine grundlegende Formel, die angewendet werden kann, wenn sich Ihre Daten in der oberen linken Spalte befinden und die Spaltenreihenfolge übereinstimmt. =INDEX(Sheet2!$1:$1048576,MATCH($A2,Sheet2!$A:$A,TRUE),MATCH(B$1,Sheet2!$1:$1,FALSE))

Alternativ VBA verwenden, wenn Werteinstellung wie diese Dynamik zu sein ....

Range(Target.Offset(0, 1), Target.Offset(0, Application.WorksheetFunction.CountA(wsSource.Rows(1)) + 1)).Value = _ 
      Range(wsSource.Cells(r, 2), wsSource.Cells(r, Application.WorksheetFunction.CountA(wsSource.Rows(1)))).Value 
1

Try this ...

der folgende Code auf Sheet2 Modul.

Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.CountLarge > 1 Then Exit Sub 
Dim wsSource As Worksheet 
Dim r As Long 
Set wsSource = Sheets("Sheet1")  'Source sheet which contains a table of countries and their food 
If Target.Column = 1 And Target.Row > 1 Then 
    Application.EnableEvents = False 
    If Target <> "" Then 
     If Application.CountIf(wsSource.Columns(1), Target.Value) > 0 Then 
      r = Application.Match(Target.Value, wsSource.Columns(1), 0) 
      wsSource.Range("B" & r & ":E" & r).Copy Target.Offset(0, 1) 
      Target.Offset(0, 1) = wsSource.Cells(r, 2) 
     End If 
    Else 
     Target.Resize(1, 5).ClearContents 
    End If 
    Application.EnableEvents = True 
End If 
End Sub 
Verwandte Themen