2017-01-23 23 views
0

Ich habe zwei Makros, die unabhängig voneinander arbeiten. Ich möchte eins ineinander verschachteln.Verschachteln eines Makros innerhalb eines Makros

Ich erhalte eine wiederkehrende Datei, die einige Reihen von sporadischen Fußzeilen auf der Unterseite von ihnen hat. Ich muss diese Fußzeilen entfernen. Die Anzahl der Zeilen in jeder Datei variiert, aber zwischen dem Ende der Daten und der Fußzeile befindet sich immer eine leere Zeile.

Das erste Makro findet die leere Zeile von A in Spalte suchen

Sub FTPstep2() 
' 
' FTPstep2 Macro 
' 

' 
If Application.WorksheetFunction.CountA("A:A") = 0 Then 
    [A1].Select 
Else 
    On Error Resume Next 
    Columns(1).SpecialCells(xlCellTypeBlanks)(1, 1).Select 
    If Err <> 0 Then 
     On Error GoTo 0 
     [A65536].End(xlUp)(2, 1).Select 
    End If 
    On Error GoTo 0 
End If 
End Sub 

Der zweite Makro alles unterhalb Zeile „X“ löscht

Sub FTPstep3() 
' 
' FTPstep3 Macro 
' 
With Sheets("Sheet1") 
    .Rows(X & ":" & .Rows.Count).Delete 
End With 
End Sub 

Ich mag würde das erste Makro Nest (FTPstep2) wo das "X" im zweiten Makro ist (FTPstep3). Ich habe eine Vielzahl von Wegen versucht, aber es neigt dazu, nicht das Und-Zeichen zu mögen oder erwartet Ende Aussagen usw.

+0

Sie sagen, dass Sie z. B. Daten in A1: A500 und dann etwas in A1000: A1005 haben und Sie letztere löschen möchten? – SJR

+1

Es ist auch am besten [vermeide die Verwendung von '.Select' /' .Activate'] (https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – BruceWayne

+0

Mit Code, der so schlecht entworfen ist, kann man nicht viel anfangen. –

Antwort

1

Was Sie brauchen, ist eine Funktion, die einen Wert zurückgibt Sie im Makro „FTPstep3“

verwenden können überprüfen sie den Code zu sehen, ob es

Function FTPstep2() As String 
' 
' FTPstep2 Macro 
Dim returnValue As Integer 

' 
If Application.WorksheetFunction.CountA("A:A") = 0 Then 
    returnValue = 1 
Else 
    On Error Resume Next 
    returnValue = Columns(1).SpecialCells(xlCellTypeBlanks)(1, 1).Row 
    If Err <> 0 Then 
     On Error GoTo 0 
     returnValue = [A65536].End(xlUp)(2, 1).Row 
    End If 
    On Error GoTo 0 
End If 

FTPstep2 = returnValue 

End Function 

Sub FTPstep3() 
' 
' FTPstep3 Macro 
' 
With Sheets("Sheet1") 
    .Rows(FTPstep2 & ":" & .Rows.Count).Delete 
End With 

End Sub 

Dieser Code funktioniert werden alle Zeilen unterhalb der ersten leeren Zelle löschen es in der Spalte „A“ findet.

Funktionen sind ähnlich wie Subs, sie können jeden Eingang erhalten (in diesem Fall gebe ich keinen Parameter in die Funktion "FTPstep2") und sie geben einen Wert zurück, der in anderen Verfahren verwendet werden kann (beachten Sie die Zeile FTPstep2 = returnValue). Wir eliminieren auch alle Select Anweisungen, da sie hier unnötig sind, und es wird nicht empfohlen, sie zu verwenden, da VBA keine Zellen auswählen muss, um sie zu ändern. Auch in diesem Fall, wir verlassen uns auf das gesamte Arbeitsblatt mit End() und Offset() bewegen, sollten Sie sehen, ob dies verbessert werden kann

Übrigens würde ich aussagekräftigere Namen für Ihre Subs und Funktionen wählen, wird es Sie machen einfacher, die Funktionen wiederzuverwenden, die Sie schreiben und pflegen. Sie könnten beispielsweise ein Add-In erstellen und Ihren Code nach Bedarf wiederverwenden oder ein Codemodul mit allen nützlichen benutzerdefinierten Funktionen exportieren, die Sie möglicherweise in anderen Projekten wiederverwenden möchten.

Glückliche Codierung!

Edit: Korrigierte kurze Definition von VBA Function, danke @ barrowc für Hinweis darauf!

+2

"Funktionen sind ähnlich wie Subs, aber sie modifizieren kein Worksheet" klingt wie eine Beschreibung einer UDF (dh eine bestimmte eingeschränkte Art von 'Function', die in einer Formel aufgerufen werden kann) anstatt einer Beschreibung einer allgemeinen VBA' Funktion ' – barrowc

+1

Ich wollte eine einfache Definition geben, was eine' Funktion 'ist, eine Art von "wie ein Sub, aber es gibt einen Wert als eine Ausgabe". Vielleicht ist die Formulierung, die ich verwendet habe, nicht die genaueste. Ich könnte eine andere Definition verwenden und die Antwort bearbeiten, was würdest du vorschlagen? –

+1

Die Antwort sieht gut aus außer für die "aber sie ändern kein Arbeitsblatt" Teil, also vielleicht nur das Bit entfernen – barrowc

Verwandte Themen