2008-11-13 8 views
1

Je ne sais pas combien de gourous Excel VBA, en plus de moi ;-D, qui traînent stackoverflow mais voici une question intéressante.Excel VBA masquer/afficher la vitesse du code de ligne

Objectif: afficher/masquer efficacement les lignes en fonction des données de la ligne.

  1. Créer une colonne d'aide qui détermine si oui ou non une rangée doit être caché.
  2. Avoir la formule dans la colonne helper renvoie une erreur ou un nombre.
  3. Masquer la colonne d'assistance et écrire le code pour exécuter le masquage/affichage.

Question: Parmi les méthodes suivantes, laquelle serait la plus rapide? La colonne B est la colonne auxiliaire et sera toujours contiguë.

Sub SetRowVisibility1() 

    Dim rowsToCheck As Range 
    With ActiveSheet 
    Set rowsToCheck = .Range(Range("B7"), Range("B7").End(xlDown)) 
    End With 

    Dim needToShow As Range, needToShow_Showing As Range 
    Dim needToHide As Range, needToHide_Showing As Range 

    Set needToShow = rowsToCheck.SpecialCells(xlCellTypeFormulas, xlNumbers) 
    Set needToHide = rowsToCheck.SpecialCells(xlCellTypeFormulas, xlErrors) 

    On Error Resume Next 
    Set needToShow_Showing = needToShow.Offset(0, 1).SpecialCells(xlCellTypeVisible) 
    Set needToHide_Showing = needToHide.Offset(0, 1).SpecialCells(xlCellTypeVisible) 
    On Error GoTo 0 

    If Not needToHide_Showing Is Nothing Then 
    needToHide_Showing.EntireRow.Hidden = True 
    End If 
    If Not needToShow Is Nothing Then 
    If needToShow.Count <> needToShow_Showing.Count Then 
     needToShow.EntireRow.Hidden = False 
    End If 
    End If 

End Sub 


Sub SetRowVisibility2() 

    Dim rowsToCheck As Range 
    With ActiveSheet 
    Set rowsToCheck = .Range(Range("B7"), Range("B7").End(xlDown)) 
    End With 

    Dim needToShow As Range, needToHide As Range 
    Dim cell As Range 
    For Each cell In rowsToCheck 

    If IsError(cell.Value) And (cell.EntireRow.Hidden = False) Then 
     If needToHide Is Nothing Then 
     Set needToHide = cell 
     Else 
     Set needToHide = Union(needToHide, cell) 
     End If 
    End If 

    If Not IsError(cell.Value) And (cell.EntireRow.Hidden = True) Then 
     If needToShow Is Nothing Then 
     Set needToShow = cell 
     Else 
     Set needToShow = Union(needToShow, cell) 
     End If 
    End If 

    Next cell 


    If Not needToHide Is Nothing Then needToHide.EntireRow.Hidden = True 
    If Not needToShow Is Nothing Then needToShow.EntireRow.Hidden = False 

End Sub 
+0

mauvaise variable sur ce qui devrait être 5ème needToShow à partir du bas –

Répondre

1

il y a une façon différente et qui est d'utiliser e fonction de filtre automatique - après tout VBA a un A en elle - utiliser les fonctionnalités de l'application la mesure du possible si ce morceau de code est assez court et doux - suppose que les données sont un bloc contigu dans les colonnes a et b et n'assume aucune autre erreur de traitement en jeu. la reprise de la ligne suivante permet d'activer le filtre.

Sub showHideRange() 
Dim testrange 
    testrange = Range("A1").CurrentRegion.Address 
    On Error Resume Next 
    testrange.AutoFilter 
    ActiveSheet.Range(testrange).AutoFilter Field:=2, Criteria1:="show" 
End Sub 
+0

Belle réponse évidente ... ou juste la fonction Auto Filter elle-même. Mais alors ce ne serait pas un "comment faire x par programmation?" SO question :) –

+0

Ceci est un excellent point SpyJournal. J'utiliserais certainement cette approche si cela ne me dérangeait pas que l'utilisateur voit ce qui se passe. – GollyJer

+0

Malheureusement AutoFilter est quelque peu limité dans VBA - Excel ne facilite pas l'utilisation des fonctions intégrées dans des situations où cela pourrait être pratique. S'il était correct de montrer à l'utilisateur ce qui se passait, cela ne fonctionnerait qu'avec moins de 3 valeurs qui donnent des lignes affichées. (Pour une raison quelconque, vous pouvez uniquement utiliser Criteria1 et Criteria2 lors de la définition des valeurs AutoFilter dans VBA.) –

0

Si vous ne souhaitez pas montrer à l'utilisateur ce qui se passe, ne serait-il pas préférable d'effectuer le calcul en VBA lui-même, plutôt que dans une colonne cachée? Certes, cela semblerait vous enfermer dans l'option 2, que je suspecte être l'option la plus lente ... la plupart de mon expérience VBA est dans les anciennes versions d'Excel, donc je n'ai pas eu le plaisir de travailler avec certaines des fonctionnalités les plus récentes et les tâches que j'ai effectuées pour traiter les lignes de données ont été effectuées ligne par ligne.

Je suppose qu'un problème possible avec le premier sous-marin est que s'il y a un problème avec la feuille de calcul ou les valeurs que vous utilisez pour déterminer le masquage/affichage, le processus échouera. Si vous vérifiez ligne par ligne et qu'une ligne cause des problèmes, vous pouvez ignorer cette ligne et traiter les autres correctement.

Questions connexes