• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

VBA Autofit rijhoogte, ook van regels die uitgefilterd zijn

Status
Niet open voor verdere reacties.

MarcelBeug

Terugkerende gebruiker
Lid geworden
31 mei 2015
Berichten
1.684
Hallo, dit is mijn eerste vraag op dit forum. :d (echt waar).

Ik heb een overzicht met 2 weergaven: een compacte weergave en een weergave waarbij alle kolommen zichtbaar zijn.
Met knoppen kan tussen beide weergaven worden gewisseld: met CommandButton1 ga je naar compacte weergave; met CommandButton2 ga je naar weergave van alle kolommen.

Nu is er 1 kolom (in het voorbeeldbestand kolom H) met tekstterugloop en meerdere regels in 1 cel. Deze kolom is in compacte weergave verborgen.

Nu bevat het overzicht ook een autofiltermogelijkheid.

Nu wil ik - als met CommandButton2 geschakeld wordt naar volledige weergave - ook de rijhoogte wordt aangepast van regels die op dat moment zijn uitgefilterd.

Ik plaats het voorbeeld waarbij gefilterd is op "Censuur 2" in kolom B.
Als je nu drukt op "Toon alle kolommen", dan wordt de rijhoogte automatisch aangepast, maar niet voor de regels die zijn uitgefilterd zijn.
Als je vervolgens alle gegevens in kolom B selecteert, dan zijn alleen de rijhoogten van "Censuur 2" aangepast en niet de overige rijhoogten; dat zou ik graag wél willen.

De code voor het schakelen naar weergave van alle kolommen is nu:

Code:
Private Sub CommandButton2_Click()

    Application.ScreenUpdating = False
    Range("E2:E6").Clear
    Range("F1:N1").EntireColumn.Hidden = False
    [COLOR="#FF0000"]Range("A8:A29").Rows.AutoFit 'Dit zou ook moeten gelden voor rijen die uitgefilterd zijn[/COLOR]
    CommandButton1.Visible = True
    CommandButton2.Visible = False
    ActiveWindow.FreezePanes = False
    Range("F8").Select
    ActiveWindow.FreezePanes = True
    Application.ScreenUpdating = True

End Sub

Hoe kan ik ervoor zorgen dat ook de rijhoogte van uitgefilterde rijen wordt aangepast?

Ik hoop dat mijn uitleg voldoende duidelijk is.
 

Bijlagen

Hoi Marcel,
En ik ben dan diegene die het eerste antwoord probeer te geven:d
Ben niet zeker of ik uw vraag juist begrepen heb
maar probeer deze eens, ik denk dat je zoiets bedoeldt
Code:
ActiveSheet.Rows("8:29").WrapText = True
 
Hoi Marcel,
En ik ben dan diegene die het eerste antwoord probeer te geven:d
Ben niet zeker of ik uw vraag juist begrepen heb
maar probeer deze eens, ik denk dat je zoiets bedoeldt
Code:
ActiveSheet.Rows("8:29").WrapText = True
Dank, maar dat is hem toch niet.
Bij het schakelen naar compacte weergave, wordt de rijhoogte vast op 17.25 ingesteld, wat overeenkomt met normale rijhoogte als er geen tekst terugloop is.
Wrap text is al ingeschakeld.

Ik zou het zelf zoeken in de richting van:
1. Autofilter ongedaan maken.
2. Rijhoogte aanpassen.
3. Autofilter weer toepassen.

Maar ja: hoe moet je dan bij stap 1 de autofilter gegevens bewaren en bij stap 3 weer toepassen?

En misschien is een hele andere benadering wel beter.
 
Hoi Marcel,
Zoiets dan?
Code:
Private Sub CommandButton2_Click()

    Application.ScreenUpdating = False
    EnableAutoFilter = False
    Range("E2:E6").Clear
    Range("F1:N1").EntireColumn.Hidden = False
    Range("A8:A29").RowHeight = 17.25
    CommandButton1.Visible = True
    CommandButton2.Visible = False
    ActiveWindow.FreezePanes = False
    Range("F8").Select
    EnableAutoFilter = True
    ActiveWindow.FreezePanes = True
    Application.ScreenUpdating = True

End Sub
 
Ik weet niet hoeveel filters je altijd aan hebt staan Marcel.
Hier ben ik uitgegaan van 1 filter met meerdere criteria.

Bestand gecontroleerd op filter in kolom B met 1 twee of drie criteria.
Code:
Private Sub CommandButton2_Click()
Dim ftr As Filter, y As Long, x As Long, strCri1, strCri2
    Application.ScreenUpdating = False
    Range("E2:E6").Clear
    Range("F1:N1").EntireColumn.Hidden = False
   
  If AutoFilterMode Then
     For Each ftr In AutoFilter.Filters
    If ftr.On Then
      y = y + 1
   With AutoFilter
        With .Filters(y)
            If IsArray(.Criteria1) Then
              strCri1 = Replace(Join(.Criteria1, ", "), "=", "")
            Else
                strCri1 = Replace(.Criteria1, "=", "")
            End If
            
            If .Operator <> 0 And .Operator < 3 Then
                strCri2 = .Criteria2
                x = .Operator
            End If
        End With
    End With
  End If
Next ftr
 End If
 AutoFilterMode = False
        Rows("8:29").AutoFit 'Dit zou ook moeten gelden voor rijen die uitgefilterd zijn
        CommandButton1.Visible = True
        CommandButton2.Visible = False
        ActiveWindow.FreezePanes = False
        Range("F8").Select
        ActiveWindow.FreezePanes = True
        Application.ScreenUpdating = True
    If strCri2 = "" Then
      [b7].CurrentRegion.AutoFilter 1, Split(strCri1, ","), 7
     Else
      [b7].CurrentRegion.AutoFilter 1, strCri1, x, strCri2
    End If
End Sub
 
@Philiep: zodoende resulteert een rijhoogte die slechts voldoende is voor 1 regel.
@Harry: dit komt op zijn minst in de goede richting. Ik ga me er even verder in verdiepen.
 
Vooralsnog heb ik de indruk dat er nogal wat haken en ogen zitten aan het weghalen en opnieuw aanbrengen van filtercriteria, oftewel er zou van alles fout kunnen gaan.

Op dit moment heb ik voor een "veilige" oplossing gekozen in het echte bestand: de knop "Toon alle kolommen" heb ik omgedoopt tot "Volledige weergave".
Met een dubbele autofilter wordt autofilter uit en aan gezet, zonder criteria: kortom als - in de compacte weergave - regels uitgefilterd waren, dan worden deze weer zichtbaar in de volledige weergave.
Code:
Private Sub CommandButton2_Click()

    Application.ScreenUpdating = False
    Range("E2:E6").Clear
    Range("F1:N1").EntireColumn.Hidden = False
    [B][COLOR="#FF0000"]Range("B7").CurrentRegion.AutoFilter
    Range("B7").CurrentRegion.AutoFilter[/COLOR][/B]
    Range("A8:A29").Rows.AutoFit
    CommandButton1.Visible = True
    CommandButton2.Visible = False
    ActiveWindow.FreezePanes = False
    Range("F8").Select
    ActiveWindow.FreezePanes = True
    Application.ScreenUpdating = True

End Sub
Ik laat de vraag nog even open tot morgenochtend voor het geval zich nog betere alternatieven aandienen.
Evengoed ben ik al dik tevreden met het resultaat tot nu toe. Bedankt! :thumb:
 
Marcel,

Dat kan ook met:
Code:
me.showalldata
 
Het idee van een schakelaar is ook niet onaardig. In het echte bestand staan de 2 knoppen op verschillende plaatsen, gezien de beschikbare ruimte.
Misschien kan die schakelaar ook nog wel verplaatst worden in de code, maar ik houd het maar even op de aparte knoppen.

Alles in overweging genomen, heb ik toch voor een andere oplossing gekozen: ik heb de rijhoogten-bij-volledige-weergave in kolom A gezet (onzichtbaar).
Bij het switchen van compacte weergave naar volledige weergave worden deze gebruikt om de rijhoogten aan te passen.
Vervolgens pas ik de autofilter opnieuw toe (tenzij de gebruiker inmiddels het hele filter heeft verwijderd).
Het betreft hier een statisch overzicht, althans voor wat betreft de rijhoogten.
Anders zou deze oplossing niet zo praktisch zijn (of je moet weer iets verzinnen om de rijhoogten in kolom A telkens aan te passen, maar dat is hier dus niet nodig).
De aanpassing van de "freeze panes" heb ik verwijderd; deze is nu bij beide weergaven hetzelfde (dat was mogelijk).

Zodoende is de code voor de switch naar volledige weergave geworden (in het echte bestand):
Code:
Private Sub CommandButton2_Click()
    
    Dim i%
    Application.ScreenUpdating = False
    Range("E2:E6").Clear
    Range("F1:N1").EntireColumn.Hidden = False
    For i = 8 To 29
        Range("A" & i).RowHeight = Range("A" & i)
    Next i
    If AutoFilterMode Then ActiveSheet.AutoFilter.ApplyFilter
    CommandButton1.Visible = True
    CommandButton2.Visible = False
    Application.ScreenUpdating = True

End Sub
 
Zijn de rijhoogten dan per rij verschillend ?
 
Zijn de rijhoogten dan per rij verschillend ?
In het echte bestand wel; in het voorbeeldbestand waren de rijhoogten van de betreffende range inderdaad allemaal gelijk. :o

Het echte bestand betreft een overzicht van de afrondingsfuncties in Excel.
Het veld "aandachtspunten" kent een variabele hoogte... :cool:
 
Gebruik je daarvoor dan geen rows.autofit ?
 
Ik zie het probleem blijkbaar niet.
Dit zijn de stappen:
1. In compacte weergave filter je op kolom B, dus niet alle rijen zijn zichtbaar.
2. Je gaat naar volledige weergave, waarbij rijhoogten aangepast worden.
3. Je wijzigt het filter zodanig dat rijen zichtbaar worden die in de compacte uitgefilterd waren.
Nu is de rijhoogte van die nieuw-zichtbare rijen niet aangepast, waarvoor tekst op regel 2 en verder (binnen 1 cel met tekstterugloop) onzichtbaar is.
 
Als ik je goed begrijp:

Code:
Private Sub ToggleButton1_Click()
    Columns("F:N").Hidden = Not Columns("F:N").Hidden
    Rows("8:29").RowHeight = 17.25
    If Columns("F:N").Hidden Then Range("A8:A29").SpecialCells(12).EntireRow.AutoFit
End Sub
 
Als ik je goed begrijp

Helaas. Dit past alleen de rijhoogte van zichtbare rijen aan. In die laatste regel zou trouwens nog een Not na de If moeten komen.

In de bijlage heb ik de code (met de toegevoegde Not) opgenomen, geselecteerd op Censuur 2.
Als je nu op schakelaar drukt en daarna alles selecteert in kolom B, dan zie je dat alleen de rijhoogten van Censuur 2 zijn aangepast.
 

Bijlagen

Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan