[VB/Excel] lege cellen in kolommen zoeken *

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Frentik
  • Registratie: November 2004
  • Laatst online: 01-09-2021

Frentik

Broken, Beat and Scarred

Topicstarter
Ik zit met het volgende probleem: op mijn werk gebruiken we een excelsheet (excel2003) als werklijst en ik ben de gelukkige die deze lijst mag 'beheren'. Met behulp van macro's heb ik wat eenvoudige handelingen vastgelegd en deze onder command buttons gestopt (bv het weergeven van de kolommen F t/m K door de anderen simpelweg te verbergen), so far so good.

Nu is er een iets "geavanceerder" verzoek gekomen. Nu moet ik niet alleen de kolommen F:H weergeven maar als in rij x de cellen Fx t/m Hx leeg zijn dan mag rij x ook verborgen worden zodat alleen de rijen met een waarde in F, G of H overblijven.

Ik heb wat gezocht en gelezen op http://msdn.microsoft.com/en-us/library/bb386107.aspx en de volgende code opgedoken die vanaf cell A5 de rijen doorzoekt en stopt bij de eerste lege A cell. De rijen zijn altijd gevuld vanaf A dus dit leek me wel een goede manier om te stoppen bij de eerste lege rij.


Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
Sub ViewSA ()

      ' Select cell A5, *first line of data*.
      Range("A5").Select
      ' Set Do loop to stop when an empty cell is reached.
      Do Until IsEmpty(ActiveCell)
         ' Insert your code here.
        'Step down 1 row from present location.
         ActiveCell.Offset(1, 0).Select
      Loop
 End Sub


Het probleem zit dus bij het stukje "Insert your code here.", hier zou dus de code moeten komen die kijkt of alle cellen in het bereik F(activecell) t/m K(activecell) leeg zijn (of één van de cellen in hetzelfde bereik niet leeg is). Als de rij hieraan voldoet dan mag deze dus verborgen worden en is de volgende rij aan de beurt.

Ik hoop dat ik eea duidelijk heb opgeschreven en ik verwacht dat de oplossing relatief simpel zal zijn maar met mijn ervaring (Turbo Pascal >15 jaar geleden en wat simpele Excel macro's.) kom ik er op korte termijn niet uit dus als iemand mij op weg zou willen helpen _/-\o_ .

[ Voor 2% gewijzigd door Frentik op 27-05-2009 00:37 . Reden: TR gemaakt ]

>> Nieuw! - Twitch << & >> YT Channel


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Vooropgesteld: imho is het heel erg 'vies' om .Select en ActiveCell te gebruiken, dat is nogal foutgevoelig en je verliest er de huidige geslecteerde cel mee. Je kunt prima een loop door een bereik van cellen doen zonder te selecteren.

Je wilt (IMHO) met een tweetal loopjes i en j kijken of IsEmpty(cells(i,j)). Als dat zo is, kan je kijken of (i-1,j) of (i+i,j) of etc leeg is. Zo ja, kan je de desbetreffende rij / kolom verbergen.

Ook: pas erg op met VBA voor je werk. Als je geen idee hebt waar je moet beginnen, lees eerst een goede handleiding/boek in de baas z'n tijd en ga dan aan de gang. Natuurlijk denken / kijken we graag met je mee maar jij bent verantwoordelijk en je wilt vast niet dat je door een denkfoutje opeens werk van een collega sloopt.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

  • Frentik
  • Registratie: November 2004
  • Laatst online: 01-09-2021

Frentik

Broken, Beat and Scarred

Topicstarter
F_J_K schreef op dinsdag 26 mei 2009 @ 16:14:
Vooropgesteld: imho is het heel erg 'vies' om .Select en ActiveCell te gebruiken, dat is nogal foutgevoelig en je verliest er de huidige geslecteerde cel mee. Je kunt prima een loop door een bereik van cellen doen zonder te selecteren.

Je wilt (IMHO) met een tweetal loopjes i en j kijken of IsEmpty(cells(i,j)). Als dat zo is, kan je kijken of (i-1,j) of (i+i,j) of etc leeg is. Zo ja, kan je de desbetreffende rij / kolom verbergen.

Ook: pas erg op met VBA voor je werk. Als je geen idee hebt waar je moet beginnen, lees eerst een goede handleiding/boek in de baas z'n tijd en ga dan aan de gang. Natuurlijk denken / kijken we graag met je mee maar jij bent verantwoordelijk en je wilt vast niet dat je door een denkfoutje opeens werk van een collega sloopt.
Dat slopen valt wel mee, het echte werk zit allemaal in een LIMS alleen dat is een draak van een programma waar wij zelf geen custom rapportjes voor kunnen (lees: mogen) maken. Vandaar dat er ooit iemand een excel sheet begonnen is om snel een overzicht te krijgen van de lopende analyses. Nu moeten 2 verschillende lijsten samengevoegd worden tot 1 nieuwe en daar horen ook nieuwe " features" bij. Ik ben nu ook opnieuw begonnen met een lege lijst en vul deze voorlopig met fictieve data totdat alles lijkt te werken, dus werk slopen zit er echt niet in ;)

Afhankelijk van het type analyse zal deze plaatsvinden in Lab A, B of C. De sheet is grofweg nu zo opgebouwd:
Kolom A-E = algemeen analyse info (nummer deadline e.d.):
Kolom F-J = Analyses voor Lab A,
Kolom K-P = Analyses voor Lab B,
Kolom Q-U = Analyses voor Lab C

Een medewerker van Lab C kan nu door 1 klik op de knop alleen de kolommen A-E + Q-U zien simpelweg door kolom F tot en met P te verbergen. Het nadeel is echter dat er 100 tot 150 lopende analyses zijn waarvan misschien maaar 30% voor Lab C is, vandaar dat ik ook nog rijen zou willen verbergen.

Ik wil me inderdaad wel beter inlezen en meer leren van vb maar zoals zo vaak moet je dit er maar "even" bij doen omdat je toevallig wat handiger bent dan de anderen vd afdeling. Ik ben al sinds gisteren aan het spelen met macro's opnemen, de output daarvan bekijken en aanpassen. Maar een loop in een loop gaat me nu nog even te ver, vandaar de vraag om toch relatief snel to een oplossing te komen.

>> Nieuw! - Twitch << & >> YT Channel


Acties:
  • 0 Henk 'm!

Verwijderd

je maakt een foutje : je bedoelt TP > 15 jaar geleden ;)
iig zou je bv onderstaand kunnen toepassen voor de vraag uit TS :
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub LegeRijenVerbergen()
  Dim Rij         As Range
  Dim LeegGebied  As Range
  
  On Error Resume Next
  
  For Each Rij In range(Range("f5"),range("f65536").end(xlup)).Rows
    Set LeegGebied = Nothing
    Set LeegGebied = Rij.Resize(1, 3).SpecialCells(xlCellTypeBlanks)
    If (Not (LeegGebied Is Nothing)) Then
      Rij.EntireRow.Hidden = (3 = LeegGebied.Cells.Count)
    End If
  Next
End Sub
opgelet, deze code is allesbehalve perfect en gaat uit van een aantal aannames die niet altijd kloppen. ik laat het aan jou over om daarvan de meeste eruit te halen. (als je debugt, zorg dan dat de foutafhandelingsopdracht uitgecommentarieerd is)

Acties:
  • 0 Henk 'm!

  • Frentik
  • Registratie: November 2004
  • Laatst online: 01-09-2021

Frentik

Broken, Beat and Scarred

Topicstarter
Na vveel lezen (thx Wilgert) en van alles proberen, uithuilen en opnieuw beginnen heb ik nu een werkend stuk code. Het zal vast eenvoudiger/sneller kunnen dus kom maar op met dat commentaar, want daar leer je tenslotte ook van ;)

stukje code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Range("Q5").Activate    'eerste cel ligt vast
rw = ActiveCell.Row     'bepaal startwaarde voor rij
col = ActiveCell.Column 'bepaal startwaarde voor kolom
colinit = col           'reset
colmax = col + 10       'maxwaarde voor kolom (ligt ook vast)
EmptyRow = True         'switch

Do While rw < rwmax                             'loop voor rijen
    Do While col < colmax                       'loop voor kolommen
        If IsEmpty(ActiveCell) = True Then      'check voor lege cel
            ActiveCell.Offset(0, 1).Activate    'volgende cell
            col = col + 1                       'kolom+1
        Else
            EmptyRow = False                    'geen lege cel -> verander switch
            Exit Do                             'en verlaat kolom loop
        End If
    Loop

    If EmptyRow = True Then                     'check switch
        ActiveCell.EntireRow.Hidden = True      'en verberg rij indien nodig
    End If
    
    Cells(rw + 1, colinit).Activate        'volgende rij
    col = colinit                          'reset kolom
    EmptyRow = True                        'reset switch
    rw = rw + 1                            'volgende rij
Loop


edit: terwijl ik de code hier nu plak en doorlees besef ik net dat als de eerste cel vastligt, de startwaarde voor rw en col ook vast liggen en ik deze dus niet hoef te bepalen :)

[ Voor 5% gewijzigd door Frentik op 29-05-2009 23:19 ]

>> Nieuw! - Twitch << & >> YT Channel

Pagina: 1