簡體   English   中英

在用戶窗體中創建一個下一步按鈕以跳轉到過濾后的 Excel 工作表中的下一行

[英]Make a next button in a Userform to jump to next row in a filtered excel sheet

我制作了一個帶有多個文本框的用戶表單,這些文本框中的值將被填充或顯示在 Excel 工作表中找到的值。 在此處輸入圖片說明

我的問題是讓 Next 和 OK 按鈕起作用。 當我按 Ok 時,它應該將所有數據轉儲到正確行的 Excel 表中,並使用 Next 按鈕移動到下一行。

問題是我不能簡單地增加一個計數器,因為它應該跳到有源過濾器的下一行,即 45 之后的下一行可能是 66。那么我該如何實現呢?

下面是我應用正確過濾器的代碼:

Dim columnHeader As Integer
Dim ws As Worksheet
Dim Wb As Workbook
Dim lo As ListObject
Dim lsColumn As Integer
Dim counter As Integer
Dim rRange As Range, filRange As Range, Rng As Range

'set the worksheet we will be dealing with
Set Wb = ActiveWorkbook
Set ws = Wb.Sheets("List")
Call Filter.Unhide_All_Columns ' just clear all filters

'Filter our sheet
columnHeader = 2
lsColumn = HelpFunctions.getColumn("LS", ws, columnHeader, True) 'Find correct colum, i.e 18 in this case
Set lo = ws.ListObjects("FilterParts")
lo.Range.AutoFilter Field:=lsColumn, Criteria1:=""
lo.Range.Cells.ClearFormats
lo.AutoFilter.ApplyFilter

'~~> Filter, offset(to exclude headers)
Settings.filRange = lo.Range.Offset(columnHeader, 0).SpecialCells(xlCellTypeVisible).EntireRow ' Assign it to a global variable so it can be reused

我有一個名為 nextLine(rowNumber as long) 的函數,它用正確的值填充 GUI。

您的代碼看起來不錯,除了我認為的一件事,在您執行以下操作時的 init 方法中:

Settings.nextIndex = columnHeader + 1
ws.Cells(Settings.nextIndex, 1).Select

Call Creo.updateGUI(Settings.nextIndex)

您將在 GUI 中顯示表格的第三行而不是過濾后的第一行(我希望這是您想要的),因為columnheader被設置為2 ,然后您執行上面的代碼,該代碼將為您提供nextindex = 3列標題 + 1 )。
相反,您可以執行上面的代碼

Settings.NextIndex = columnHeader
call nextButton()

並讓nextButton子查找過濾后的第一行並將其顯示在 GUI 中。 我從來沒有測試過代碼,這只是閱讀你的一個想法。

埃托雷

所以這是我的下一個按鈕命令,雖然我不完全喜歡活動單元格方法(如果有人在使用 GUI 時單擊工作表可能會失敗。

'*********************************************************************************************************
'****************** This one gets triggered when the next button event occurs ****************************
'*********************************************************************************************************
Public Sub nextButton()
    Dim i As Long
    For i = Settings.nextIndex To Settings.filRange.Row
        ActiveCell.Offset(1, 0).Select
        If Not ActiveCell.EntireRow.Hidden Then
            Exit For
        End If
    Next i
    Settings.nextIndex = ActiveCell.Row
    Call Creo.updateGUI(Settings.nextIndex)


    'Reached last row
    If Settings.nextIndex = Settings.filRange.Row Then
        'Remove any filters
        Call Filter.Unhide_All_Columns
        'Hide GUI
        MOM.Hide
    End If

End Sub

這是我的初始化方法:

'*******************************************************************************************************
'****************** THIS ONE GETS CALLED FROM EXCEL ****************************************************
'*******************************************************************************************************

Sub addNewLs()
    Dim columnHeader As Integer
    Dim ws As Worksheet
    Dim wb As Workbook
    Dim lo As ListObject
    Dim lsColumn As Integer
    Dim counter As Integer
    Dim rRange As Range, filRange As Range, Rng As Range

    'set the worksheet we will be dealing with
    Set wb = ActiveWorkbook
    Set ws = wb.Sheets("List")
    Call Filter.Unhide_All_Columns ' just clear all filters

    'Filter our sheet
    columnHeader = 2
    lsColumn = HelpFunctions.getColumn("LS", ws, columnHeader, True) 'Find correct colum, i.e 18 in this case
    Set lo = ws.ListObjects("FilterParts")
    lo.Range.AutoFilter Field:=lsColumn, Criteria1:=""
    lo.Range.Cells.ClearFormats
    lo.AutoFilter.ApplyFilter

    Set Settings.filRange = lo.Range.Cells(lo.Range.Rows.Count, lo.Range.Columns.Count)

    'lo.Range.Offset(columnHeader, 0).SpecialCells(xlCellTypeVisible).EntireRow ' Assign it to a global variable so it can be reused

    Settings.nextIndex = columnHeader + 1
    ws.Cells(Settings.nextIndex, 1).Select

    Call Creo.updateGUI(Settings.nextIndex)
    Call MOMModule.initiliazeMOM
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM