[英]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.