Effectuez un button suivant dans un formulaire Userform pour passer à la ligne suivante dans une feuille Excel filtrée

J'ai fait un formulaire d'user avec plusieurs zones de text, les valeurs dans ces zones de text doivent être remplies ou pour afficher les valeurs trouvées dans une feuille Excel. entrez la description de l'image ici

Mon problème est d'get le button Suivant et OK pour fonctionner. Lorsque j'appuie sur Ok, il faut décharger toutes datatables sur la feuille excel sur la ligne correcte, et avec le button Suivant, il devrait passer à la ligne suivante.

Le problème est que je ne peux pas simplement augmenter un countur car il devrait passer à la rangée suivante du filter actif, c'est-à-dire que la prochaine ligne après 45 pourrait avoir 66. Alors, comment puis-je réussir?

Voici mon code pour appliquer le filter correct:

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 

J'ai une fonction appelée nextLine (rowNumber aussi longtime) qui remplit l'interface graphique avec les bonnes valeurs.

Votre code semble bon, sauf pour une chose à mon avis, dans la méthode d'init lorsque vous faites:

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

vous afficherez dans la GUI la troisième ligne de la table au lieu de la première ligne filtrée (que je m'attends à ce que vous vouliez) parce que columnheader été réglé sur 2 , puis vous faites le code ci-dessus qui vous nextindex = 3 ( tableau de colonne + 1 ).
Au lieu de cela, le code ci-dessus vous pouvez faire

 Settings.NextIndex = columnHeader call nextButton() 

et laissez le sous nextButton pour find la première ligne filtrée et l'afficher dans l'interface user graphique. Je n'ai jamais testé le code, c'est juste une idée qui permet de lire le vôtre.

Ettore

Donc, voici ma prochaine command de button, je n'ai pas complètement aimé la méthode de cellule active cependant (pourrait échouer si quelqu'un clique sur la feuille lors de l'utilisation de l'interface graphique.

 '********************************************************************************************************* '****************** This one gets sortingggered 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 

Voici ma méthode d'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