2017-04-08 1 views
0

Gibt es eine Möglichkeit, dass ich möglicherweise die Funktion zu einer bestimmten Spalte für jede sheet in der ActiveWorkbook Ich habe verschiedene Versionen versucht, aber es scheint nicht richtig zu machen.Auswahl erste leere Zeile mit bestimmten Spalten für jedes Blatt VBA

Sub resetFilters() 

Dim sht As Worksheet 

On Error GoTo ErrorHandler 

Application.ScreenUpdating = False 

    'On Error Resume Next 
     If ActiveSheet.FilterMode Then 
    ActiveSheet.ShowAllData 

    End If 

Range("A3:T3").ClearContents 
Application.ScreenUpdating = True 

Call GetLastRow 


Exit Sub 
ErrorHandler: 
Debug.Print "Error number: " & Err.Number & " " & Err.Description 


End Sub 
Private Function SelectFirstEmptyRowInColumnH(ByVal sheet As Worksheet, Optional ByVal fromColumn As Long = 8) As Long 

    SelectFirstEmptyRowInColumnH = sheet.Cells(sheet.Rows.Count, fromColumn).End(xlUp).Row 

End Function 

Private Sub GetLastRow() 
Dim selectLastRow As Long 

selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet, 8) 
Cells(selectLastRow, 8).Offset(1, 0).Select 

End Sub 
+0

sollten Sie so ziemlich nie verwenden '.Select' usw. in Ihrem VBA-Code, da es ziemlich unnötig ist. Was versuchen Sie konkret zu erreichen? Was genau ist das Problem, das Sie sehen - "es funktioniert nicht richtig" ist nicht sehr beschreibend für Ihr Problem. – Dave

+0

@Dave Ich brauche es, um die 'Auswahl' für die erste leere Zelle zu setzen, damit sie für die Dateneingabe bereit ist. Wie wird das möglich sein ohne 'select'? Auch brauche ich eine Möglichkeit, die Spalte basierend auf dem Blatt zu ändern, dass der Benutzer im Grunde in jedem Blatt ist, gibt es eine Tabelle, die fast die gleichen Header hat und möchte die Auswahl erste leere Zeile gleich. Die Spaltenüberschrift ist Stil, ich weiß nicht, ob ich die Spaltenüberschrift als Referenzen in der Funktion übergeben kann, um das gleiche Ergebnis auf allen "Blättern" zu erhalten. – QuickSilver

Antwort

1

Ein Arbeitsblatt ist ein Objekt und kann nicht als Argument ByVal übergeben werden. Es muss ByRef sein, was der Standard ist und daher weggelassen werden kann. Beachten Sie auch, dass Sheet ein Wort ist, das für die Verwendung von VBA reserviert ist. In den meisten Fällen wird VBA in der Lage sein, Ihre Intention zu bestimmen und Ihnen zu erlauben, seinen Wortschatz so zu verwenden, wie Sie es wünschen, aber für Sie ist es bei der Fehlersuche eine höllische Aufgabe, in jedem Fall zu bestimmen, ob Sheet bedeutet VBA's Blatt oder ein eigenes Blatt. Wählen Sie ein beliebiges Wort in Ihrem Code aus und drücken Sie die Taste F1, damit VBA Ihnen die Bedeutung und den Verwendungszweck anzeigt.

Beachten Sie, dass Ihre Funktion die zuletzt verwendete Zeile zurückgibt. Der erste leere ist der nächste danach. Also, ich würde diese Funktion etwas wie folgt schreiben: -

Private Function FirstEmptyRow(Ws As Worksheet, _ 
           Optional ByVal Clm As Long = 1) As Long 
    With Ws 
     FirstEmptyRow = .Cells(.Rows.Count, Clm).End(xlUp).Row + 1 
    End With 
End Function 

Beachten Sie, dass ich die Standardeinstellung für die optionale Spalte 1. Der Standard geändert werden sollten sowohl die logischste Wahl und die am häufigsten verwendet. Im Fall der letzten Zeile, die die erste Spalte ist, Spalte A.

Hier ist eine Alternative basierend auf Ihrem Kommentar (die ich nicht vollständig verstehen konnte). Dieser Code sucht in Rows(3) von ActiveSheet nach dem Wort "Style" und gibt die nächste leere Zeile in der Spalte zurück, in der "Style" gefunden wurde.

Private Function FirstEmptyRow() As Long 
    ' 9 Apr 2017 

    Dim Clm As Long 

    With ActiveSheet 
     On Error GoTo ErrHandler: 
     Clm = WorksheetFunction.Match("Style", .Rows(3), 0) 
     FirstEmptyRow = .Cells(.Rows.Count, Clm).End(xlUp).Row + 1 
    End With 
ErrHandler: 
    Err.Clear 
End Function 

Wenn das Wort „Style“ wird ein Fehler nicht gefunden auftreten und die Ausführung auf dem Etikett ErrHandler:, die nichts tut, wird springen. Vielleicht möchten Sie, dass es die Situation irgendwie angeht. Da die Funktion die Zeilennummer hat, die sie zurückgibt, ist sie Null, was zu einem Fehler führen wird, wenn Sie versuchen, diese Zeile zu adressieren.

+0

Ich brauche eine Möglichkeit, die Spalte basierend auf dem Blatt zu ändern, in dem sich der Benutzer gerade befindet. Im Grunde gibt es 4 Blätter in einer Arbeitsmappe, die eine Tabelle mit fast den gleichen Headern hat und die erste leere Zeile beibehalten möchte Spaltenüberschrift und dort 3 weitere Blätter mit Diagrammen. Die Spaltenüberschrift ist Stil, ich weiß nicht, ob ich die Spaltenüberschrift als Referenzen in der Funktion übergeben kann, um das gleiche Ergebnis auf allen Blättern zu erhalten oder wie eine Variable zu überprüfen, was das 'ActiveSheet' dann zu übergeben ist Variable in der Spalte der Funktion, um die richtige Spalte zu erhalten. – QuickSilver

+0

Ja, Sie könnten die Spaltenüberschrift "Style" als Parameter an die Funktion übergeben. Ich habe meinen oben vorgeschlagenen Code geändert, basierend auf der Annahme, dass die Beschriftung immer "Stil" wäre. – Variatus

+0

Es gibt eine Sache, die ich nicht verstehe, warum alle Argumente in 'Private Funktion FirstEmptyRow (Ws als Arbeitsblatt, optional ByVal Clm als Long = 1) als Long' verlieren? Wird all das nicht dazu beitragen, dass die Funktion besser wird? – QuickSilver

0

Sie können die gewünschte Spaltennummer einfach an die Funktion übergeben. Optional ByVal fromColumn As Long = 8 bedeutet, dass Spalte 8 (Spalte H) die Standardspalte ist, wenn beim Aufruf der Funktion keine Spaltennummer übergeben wird. Aber das Übergeben einer Spaltennummer überschreibt diesen Standard.

So in dieser Linie, ist die 8 vorbei erforderlich eigentlich nicht, obwohl für Klarheit wahrscheinlich gut, und könnte wie so mit dem gleichen Ergebnis geschrieben werden (die letzte Zeile für Spalt H Rückkehr):

selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet) 

um die Spaltennummer 2 (Spalte B) zum Beispiel zu ändern, würden Sie die Zeile wie so ändern:

selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet, 2) 

ich würde auch empfehlen, dass Sie den Namen der Funktion SelectFirstEmptyRowInColumn genericize so Verwirrung zu vermeiden.

1

könnten Sie mit dieser Funktion:

Private Function SelectFirstEmptyRowInColumnWithGivenHeader(ByVal sheet As Worksheet, Optional ByVal header As String = "Style") As Long 
    Dim col As Variant 
    With sheet 
     col = Application.Match(header, .Rows(1), 0) 
     If Not IsError(col) Then 
      .Activate '<--| you must select a sheet to activate a cell of it 
      .Cells(.Rows.Count, col).End(xlUp).Offset(1).Select 
     End If 
    End With 
End Function 

und es in Ihrem Haupt-Exploit-Code wie folgt:

Sub main() 
    Dim sht As Worksheet 

    Application.ScreenUpdating = False '<--| this to prevent sheet activating slow down the code (and annoy you) 
    For Each sht In Worksheets 
     SelectFirstEmptyRowInColumnWithGivenHeader sht , "Style" '<--| you can omit the 2nd parameter and it'll be assumed the default column header 
    Next 
    Application.ScreenUpdating = True '<--| get default behavior back in place 
End Sub 
0

Dieser einfache Code wird Ihnen helfen.

Sub FindFirstEmptyRow()

Zellen (Rows.Count, 1) .End (xlUp) .Offset (1) .Select

End Sub ☺ ☺ ​​

Verwandte Themen