使Userform中的下一个button跳转到筛选的Excel表单中的下一行

我做了一个用几个文本框的用户窗体,这些文本框中的值将被填充或显示Excel表中find的值。 在这里输入图像说明

我的问题是让下一步和确定button工作。 当我按下OK时,它应该将所有数据转储到正确的行上的Excel表单中,并且使用Nextbutton它应该移动到下一行。

问题是,我不能简单地增加一个计数器,因为它应该跳转到有效的filter中的下一行,即在45之后的下一行可能是66.那么我怎么能做到这一点?

以下是我的代码来应用正确的filter:

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, ie 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为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中。 我从来没有testing过代码,这只是一个读你的想法。

埃托雷

所以这里是我的下一个button命令,尽pipe我不完全像活动单元格的方法(如果有人在使用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 

这是我的init方法:

 '******************************************************************************************************* '****************** 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, ie 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