VBA / Excel cachant les lignes indésirables

J'essaie de générer une macro qui cachera les lignes indésirables dans une très grande feuille de calcul, et ne montrera que les lignes contenant des données pertinentes.

Sub hiddenrows() Dim i As Long Dim totalRows As Long totalRows = ActiveSheet.UsedRange.Rows.Count ActiveSheet.Rows("10:" & totalRows).Hidden = False For i = 10 To totalRows If ActiveSheet.Range("B" & i).Value <> vbNullSsortingng Then corr = i i = i + 1 End If If ActiveSheet.Range("C" & i).Value <> vbNullSsortingng Then geo = i i = i + 1 End If If ActiveSheet.Range("D" & i).Value <> vbNullSsortingng Then dis = i i = i + 1 End If While ActiveSheet.Range("E" & i).Value <> vbNullSsortingng If ActiveSheet.Range("E" & i).Value <> vbNullSsortingng Then act = i act2 = i + 1 act3 = i + 2 Cells(corr, 1).EntireRow.Hidden = False Cells(geo, 1).EntireRow.Hidden = False Cells(dis, 1).EntireRow.Hidden = False Cells(act, 1).EntireRow.Hidden = False Cells(act2, 1).EntireRow.Hidden = False Cells(act3, 1).EntireRow.Hidden = False i = i + 3 Else i = i - 1 End If Wend Next End Sub 

Je pense que j'ai la structure de base du code, mais je sais que ma syntaxe / exécution est très éloignée.

Permettez-moi d'essayer d'expliquer le code un peu mieux. Je tente d'abord de countr le nombre de lignes et de la stocker comme ma variable "LastRow". Ensuite, je souhaite parcourir toutes les lignes et les configurer comme cachées. Après cela, en utilisant la boucle "For" plus grande, je veux stocker des lignes spécifiques en tant que variables 'corr', 'geo', 'dis' et 'act'. Lorsqu'il y a des données dans la rangée "acte", je souhaite définir toutes les lignes enregistrées à afficher. Mon iterator «i», j'espère, est mis à jour correctement. Toute aide serait grandement appréciée.

J'ai mis à jour le code que j'utilise actuellement, mais ça ne fonctionne pas aussi bien que je le souhaite. Je vais append une image pour mieux décrire ce que je search. Fondamentalement, s'il y a quelque chose dans la colonne «Description de l'activité» que je veux montrer le corridor, la géographie et la discipline qui correspondent à la description particulière. Mais s'il n'y a rien dans la description de l'activité, il ne présente pas d'informations inutiles. Je souhaite fondamentalement condenser cet énorme file Excel, où seul vous pouvez voir, c'est l'information qui est utile. J'espère que ça aide.

entrez la description de l'image ici

La procédure VBA suivante reflète la structure de données dans l'image qui accompagne votre question. Si je comprends bien, vous souhaitez conserver les lignes qui ont des inputs dans la description de l'activité, ainsi que les lignes qui montrent le cadre organisationnel de ces inputs. Vous voulez cacher les autres lignes dans la feuille (à l'exclusion des lignes 1-9).

Explication du code

  • Il explique explicitement Sheet2 que la feuille à utiliser.

  • Comme lors de votre approche du problème, la routine cache d'abord toutes les lignes de données dans la feuille (réinitialisation des lignes précédemment cachées), puis désiste de façon sélective celles qui ont des descriptions d'activités, ainsi que celles qui fournissent des informations organisationnelles pour elles.

  • Il traverse les lignes de données de bas en haut. Cela élimine la nécessité de revenir en arrière après qu'une description soit trouvée afin de cacher les lignes d'organisation pertinentes à cette description.

  • Lorsqu'une description d'activité est trouvée, elle est désactivée et les indicateurs sont définis pour indiquer que les lignes organisationnelles pour cette description devront également être désactivées.

  • Au fur et à mesure que la boucle se déroule dans la table des données, elle dévoile les lignes d'organisation pour la description telle qu'elle est rencontrée et réinitialise l'indicateur correspondant à zéro à mesure que chaque class d'organisation est traitée.

      Option Explicit Sub hiddenrows2() Dim i As Long Dim firstRow As Long Dim lastRow As Long Dim dis As Long, _ geo As Long, _ cor As Long dis = 0 geo = 0 cor = 0 With Worksheets("Sheet2") firstRow = 10 lastRow = .Cells(Rows.Count, 6).End(xlUp).Row .Range(firstRow & ":" & lastRow).EntireRow.Hidden = False .Range(firstRow & ":" & lastRow).EntireRow.Hidden = True i = lastRow Do While i >= firstRow If .Range("E" & (i)).Value <> "" Then dis = 1 geo = 1 cor = 1 .Range(i & ":" & (i + 2)).EntireRow.Hidden = False ElseIf (.Range("D" & i).Value <> "") And dis = 1 Then dis = 0 .Range("D" & i).EntireRow.Hidden = False ElseIf (.Range("C" & i).Value <> "") And (geo = 1) Then geo = 0 .Range("C" & i).EntireRow.Hidden = False ElseIf (.Range("B" & i).Value <> "") And (cor = 1) Then cor = 0 .Range("B" & i).EntireRow.Hidden = False End If i = i - 1 Loop End With End Sub 

If "Bi" <> "" sera toujours évalué à true car la string "Bi" n'est pas égale à une string vide. Si vous souhaitez comparer la valeur de la cellule à l'adresse "B" & i , vous pouvez le faire de la sorte, en supposant que la macro s'exécute contre ActiveSheet :

 If ActiveSheet.Range("B" & i).Value <> vbNullSsortingng Then ... 

Je ne comprends pas tellement votre question, mais cette ligne est une erreur fréquente

LastRow = Sheet2.Rows.Count

Si vous avez une ligne en blanc, cela s'arrêtera à cela.

Par exemple:

 row 1 value = 1 row 2 value = 2 row 3 value = 3 row 4 value = row 5 value = 5 

votre empreinte variable sera le total de la feuille.

total = Cellules (Rows.Count, 1) .End (xlUp). Row est tellement meilleur et renverra les valeurs totales. 5

Pour votre question:

 Cells(i, 1).EntireRow.Hidden = true 

où i est une valeur d'incrément pour les lignes totales

ou:

 Dim yo As Range Set yo = Cells(i, 1).EntireRowç yo.EntireRow.Hidden = True