2017-04-08 44 views
0

是否有任何方法可以使功能更改爲ActiveWorkbook中的每個sheet的特定列我嘗試了各種版本,但看起來似乎無法正確完成。爲每張紙選擇具有特定列的第一個空行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

你應該幾乎從不使用在您的VBA代碼中選擇''等等,因爲它幾乎沒有必要。你想達到什麼目的?此外,您看到的問題究竟是什麼 - 「這不正確」並不能很好地描述您的問題。 – Dave

+0

@Dave我需要它爲第一個空單元格設置「選擇」,以便爲數據輸入做好準備。如果沒有'select',這將如何實現?此外,我需要一些方法來改變列基於用戶當前基本上在每張表中的工作表有一個表具有幾乎相同的標題,並希望保持選擇第一個空行是相同的。列標題將是樣式,我不知道是否可以傳遞列標題作爲函數中的引用來檢索所有'圖表'上的相同結果。 – QuickSilver

回答

1

工作表是一個對象,不能作爲參數傳遞ByVal。它必須是ByRef,這是默認值,因此可以省略。另請注意,工作表是爲VBA的使用保留的一個字。在大多數情況下,VBA將能夠確定您的意圖,並允許您按照自己的意願使用自己的詞彙,但對於您而言,面對解決問題的任務時,確定每種情況下的工作表意味着VBA的表格或您自己的表格。選擇代碼中的任何單詞並按F1讓VBA顯示它附加的含義以及如何使用它。

除此之外,請注意您的函數返回上次使用的行。第一個空的是之後的下一個。所以,我就有點像這樣寫功能: -

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 

注意,我改變了默認爲可選列1.默認的應該是兩個最合理的選擇和最常用的一種。在最後一行是第一列的情況下,列A.

這是一個基於您的評論(我不能完全理解)的替代方案。此代碼在ActiveSheetRows(3)中查找單詞「樣式」,並返回找到「樣式」的列中的下一個空行。

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 

如果沒有找到單詞「風格」會發生錯誤,執行會跳轉到什麼也不做標籤ErrHandler:。你可能想讓它以某種方式處理這種情況。由於該函數代表行號,它返回的值將爲零,如果嘗試對該行進行尋址,則會導致錯誤。

+0

我需要一些方法來根據用戶當前所在的工作表來更改列。基本上,工作簿中有4張工作表,其中有一個表具有幾乎相同標題的表,並希望將選定的第一個空行保留在相同列標題和其他3張圖表和圖表。列標題將是樣式,我不知道我是否可以傳遞列標題作爲函數中的引用來檢索所有工作表上相同的結果或需要像一個變量來檢查什麼是'ActiveSheet'通過然後變量在函數的列中以獲得正確的列。 – QuickSilver

+0

是的,您可以將列標題「樣式」作爲參數傳遞給函數。我已經根據假設標題始終是「樣式」修改了我的建議代碼。 – Variatus

+0

有一件事我不明白爲什麼會失去'Private Function FirstEmptyRow(Ws As Worksheet,Optional ByVal Clm As Long = 1)中的所有參數。這一切都不利於功能更好嗎? – QuickSilver

0

您可以將所需的列號傳遞給函數。 Optional ByVal fromColumn As Long = 8表示如果在調用函數時未傳遞列號,則列8(列H)是缺省列。但傳遞一個列號將覆蓋該默認值。

在這一行

所以,經過8實際上不是必需的,雖然可能爲清楚起見好,可以寫像這樣具有相同的結果(返回爲H列最後一行):

selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet) 

要更改列數例如2(B柱),你會改變線路,像這樣:

selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet, 2) 

我也建議你泛化函數的名稱SelectFirstEmptyRowInColumn所以要避免混淆。

1

,你可以使用此功能:

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 

,並利用它在你的主代碼如下:

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

這個簡單的代碼,會幫助你。

子FindFirstEmptyRow()

細胞(Rows.Count,1).END(xlUp).Offset(1)。選擇

末次 ☺☺

相關問題