2016-06-13 6 views
1

Ich habe ein Arbeitsblatt mit 4 Spalten, ich habe ein Makro geschrieben, Formel in Spalten A + B, die abhängig sind, was in Spalte D ist, dann kopieren und als Werte einfügen Aktivieren Sie das Filtern dieser Spalten. Mein Problem ist, dass die Spalte D wöchentlich länger wird. Ich will nicht zu haben, halten Sie die Werte in meinem Makro für den Bereich von A + B (A2: A69422) zu ändern, wo 69.422 der zuletzt verwendete Zelle in Spalte D.Bereich verknüpft mit der letzten Zelle in der angrenzenden Spalte

Worksheets("salesinfo").Range("B2").Formula = "= MID(D3,3,5)" 
    Range("B2").Select 
     Selection.AutoFill Destination:=Range("B2:B69422") 
     Range("B2:B69422").Select 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 

    Selection.Value = Selection.Value 

    Range("A2").Formula = "= VLOOKUP(B2,[Data.xlsb]Stores!$A:$X,4,0)" 

    Range("A2").Select 
     Selection.AutoFill Destination:=Range("A2:A69422") 
     Range("A2:A69422").Select 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 

      Workbooks("Data.xlsb").Close SaveChanges:=False 

      Application.CutCopyMode = False 

      Range("A2").Select 

Antwort

2

ist Verwenden Sie die folgende Syntax Bestimmen Sie die letzte Zeile in Spalte D und weisen Sie sie dann einer Variablen oder Integer zu. In meinem Beispiel verwende ich lRow als meine Variable:

Dim lRow As Long 

With ActiveSheet 

    lRow = .Cells(.Rows.Count, 4).End(xlUp).Row 

End With 

Dann benutzen Sie einfach lRow + 1 in Ihrer Reihe Referenz in der Zellenadresse.

+0

Vielen Dank, für "TheGuyThatDouldnnKnowMuch" wissen Sie eine verdammt viel. Ein kleines Problem, Spalte B endet eine Zelle kurz und Spalte A endet 1 Zelle zu lang. Danke noch einmal. – Sherbetdab

1

Wie von TheGuyThatDoesn'tKnowMuch beschrieben, wird die Deklaration einer Long-Typ-Variablen und das Speichern der letzten befüllten Zeile der modusrelevanten Spalte am besten durch einen Blick von unten nach oben durchgeführt. Dies entspricht dem Beginn am Ende des Arbeitsblatts und Tippen auf Strg + .

Hier sind einige andere Möglichkeiten, wie Sie Ihren Code verbessern können.

  • Definieren Sie Ihre Workbook Object und Worksheet Object mit einem With ... End With statement und diese Referenz verwenden, indem jede Range object mit einem . wie .Range(...) prefixing. Lassen Sie .Parent Arbeitsblattverweise nicht implizit; mach sie immer explizit.
  • Schreiben Sie alle Ihre Formeln auf einmal; keine Notwendigkeit, die Range.AutoFill method zu verwenden.
  • Direkte Wertübertragung ist effizienter als eine Kopie & Paste Special, Werte und beinhaltet nicht die Zwischenablage.
  • Vermeiden Sie die Verwendung der Methoden Range.Select und Range.Activate¹. Sie können ein guter Weg sein, mit VBA zu beginnen, aber sie sind auch das erste, von dem Sie weg sein sollten.

Referenzierung A-Säulen: X in der externen Arbeitsmappe innerhalb des VLOOKUP function, wenn Sie nur ein benötigen: D ist ineffizient; In jedem Fall kann ein INDEX/MATCH Funktionspaar für eine große Anzahl von Zeilen insgesamt besser sein.

Sie schreiben eine Formel in Spalte A, die auf die externe Arbeitsmappe Data.xlsb verweist, so dass ich weiß, dass dies nicht das Arbeitsblatt ist, das das Arbeitsblatt Salesinfo enthält. Sie sollten die Referenz der Arbeitsmappe anpassen, um die Verwendung der ActiveWorkbook property zu vermeiden.

Die Formel für Spalte B betrifft mich ein wenig. Sie verweisen auf D3 aus der Formel in B2. Dies bedeutet, dass die letzte Formel tatsächlich auf eine leere Zelle unterhalb der zuletzt bevölkerten Zelle in Spalte D verweist, wenn die Formel in Spalte B mit allen Werten in Spalte D aufgefüllt wird.

Wenn Sie auf die Berechnungsverzögerung stoßen Probleme (zu lange dauern) schreiben zwei Spalten von Formeln in fast 70K Zeilen, ein Wörterbuch Objekt und Variante Arrays könnte Dinge sehr deutlich beschleunigen.


Siehe How to avoid using Select in Excel VBA macros für weitere Methoden auf wegzukommen auf ausgewählten berufen und aktivieren Sie Ihre Ziele zu erreichen.

+0

Danke Jeeped, funktioniert ein Vergnügen, dauert nur eine Frage von Sekunden, aber spart mir ziemlich viel Zeit, ich bin gerade erst mit vba beginnen und Ihre Hilfe wird sehr geschätzt. Ich habe ein paar Bücher, VBA für Dummies für einen, kannst du mich in Richtung einer guten Selbstlernseite zeigen? Obwohl ich hier nur Posts gesehen habe, habe ich es geschafft mit ein bisschen Hilfe zu schreiben. Danke. PS.D3 sollte D2 lesen, danke für das Hinzeigen. – Sherbetdab

+0

Sie werden wahrscheinlich VBA in Spritzungen lernen; Wählen Sie eine Aufgabe und untersuchen Sie jeden Abschnitt oder Vorgang, der diese Aufgabe erfüllt. Stellen Sie etwas zusammen und wenn Sie in Schwierigkeiten geraten, schreiben Sie eine neue Frage zurück, die zeigt, was Sie herausgefunden haben und notieren Sie irgendwelche Probleme oder Fehler. VBA ist eine DIY-Sprache; Ich glaube, es ist absichtlich so strukturiert. Halten Sie eine Sammlung von "Snippets" bereit, die verschiedene Aspekte aufzeigen, auf die Sie zurückgreifen können. – Jeeped

+0

Danke Jeeped. Sehr geschätzt. – Sherbetdab