• 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.

Uitlezen tabbladen

Status
Niet open voor verdere reacties.

Theknurt

Gebruiker
Lid geworden
11 nov 2006
Berichten
130
Beste mede excelisten,

Aller eerst een fijn en zalig kersfeest.

Ik zit met het volgende probleem.

Heb een bestand met namen in de A-kolom, en in de bovenste rij de datum's

Nu zou ik graag voor iedere naam een opgave hebben van wanneer tot wanneer verlof heeft.
Het mooiste zou zijn als het een aanéén gesloten periode betreft dat hier de begin en einddatum word geplaatst.

Ik hoop dat jullie een opzetje kunnen maken waarmee ik verder kan borduren.....

Txs guys and girls......
 

Bijlagen

Hallo Knurt .

Je zou de opmaak omgekeerd kunnen doen.
In Rij 1 de namen en in Kolom A de data zetten.
Via autofilter heb je snel een overzicht welke dagen iemand vrij heeft.
 
Hoi PopiPipo,

Dit zou inderdaad een makkelijkere oplossing zijn, echter aandeze bestanden zitten nog 12 verschillende / andere bestanden gekoppeld, die ik dan ook zou moeten gaan aanpassen.

Als de suggesties uitblijven, zou ik moeten bezien naar jou auto-filter optie.......

Txs alvast voor het mee denken.

Gr. Theknurt
 
Alle specificaties in acht genomen dus ook onderstaande,

Het mooiste zou zijn als het een aanéén gesloten periode betreft dat hier de begin en einddatum word geplaatst.

denk ik dat je een oplossing moet gaan zoeken middels VBA. Ik weet niet of je hier mee vertrouwd bent?

Misschien dat je er met een (paar) arrayformules ook uit geraakt, maar die formules zijn meestal ook niet de meest toegankelijke.

En anders blijft er inderdaad de oplossing met autofilters, of eventueel zelfs draaitabellen over (evt. met transformatie van de data).
 
Laatst bewerkt:
Hier is alvast wat VBA-code voor een oplijsting van de verlofdagen:

Wigi

Code:
Option Explicit

Sub VerlofkalenderOpstellen()

'==============================================
'hier aanpassen indien nodig

    Const sSource As String = "Blad1"
    Const sTarget As String = "Blad2"
    Const sSourceBeginCell As String = "A4"
    Const sVerlof1 As String = "VL-S1"
    Const sVerlof2 As String = "VL-S2"
    Const sVerlof3 As String = "VL-S3"
    
'==============================================
    
    Dim wsSource As Worksheet
    Dim wsTarget As Worksheet
    Dim rNames As Range
    Dim rTemp As Range
    Dim rDagen As Range
    Dim lMax As Long
    Dim iKolomHeader As Integer
    Dim lRij1 As Long
    Dim lRij2 As Long
    Dim lRij3 As Long
    
    Application.ScreenUpdating = True
    
    Set wsSource = ThisWorkbook.Sheets(sSource)
    Set wsTarget = ThisWorkbook.Sheets(sTarget)
    
    With wsTarget.Range("B1")
    
        .Offset(0, 0).Value = sVerlof1
        .Offset(0, 2).Value = sVerlof2
        .Offset(0, 4).Value = sVerlof3
    
    End With
    
    lRij1 = 1
    lRij2 = 1
    lRij3 = 1
    lMax = 1
        
    For Each rNames In wsSource.Range(sSourceBeginCell, wsSource.Range(sSourceBeginCell).End(xlDown))
        
        Application.StatusBar = "Bezig met " & rNames.Value & String(3, ".")
        
        wsTarget.Cells(lMax + 1, 1).Value = rNames.Value
        
        On Error Resume Next
        Set rDagen = wsSource.Range("B" & rNames.Row, "CT" & rNames.Row).SpecialCells(xlCellTypeConstants, xlTextValues)
        On Error GoTo 0
        
        If Not rDagen Is Nothing Then
        
            For Each rTemp In rDagen
            
                Select Case rTemp.Value
                
                    Case sVerlof1:
                    
                        lRij1 = lRij1 + 1
                        iKolomHeader = 1
                        
                    Case sVerlof2:
                    
                        lRij2 = lRij2 + 1
                        iKolomHeader = 2
                        
                    Case sVerlof3:
                    
                        lRij3 = lRij3 + 1
                        iKolomHeader = 3
                        
                End Select
                
                wsTarget.Cells(Choose(iKolomHeader, lRij1, lRij2, lRij3), 2 * iKolomHeader).Value = wsSource.Cells(1, rTemp.Column).Value
                
            Next rTemp
            
        End If
        
        lMax = Application.Max(lRij1, lRij2, lRij3)
        
        lRij1 = lMax
        lRij2 = lMax
        lRij3 = lMax
        
    Next
    
    With wsTarget
        .Columns(1).Font.Bold = True
        .Rows(1).Font.Bold = True
'        .Range("B1").EntireColumn.Delete
'        .Range("D1").EntireColumn.Delete
        .Cells.EntireColumn.AutoFit
    End With
    
    With Application
        .ScreenUpdating = True
        .StatusBar = False
    End With
    
End Sub

Wigi
 
Hee Wigi,

Bedankt voor de code. hier kan ik zeker wat mee, ben hem al uitvoerig aan het testen.
ik zal hem hier en daar moeten aanpassen, maar dat gaat opzeker wel lukken.

Voorlopig zet ik de vraag op opgelost, totdat ik wederom vragen erover heb.

Txs. Theknurt
 
Heren en dames,

Ik kom toch nog even terug op de oplossing die WiGi heeft geboden.....

De formule loopt als een trein en is super, echter.......

Als een medewerker in geselecteerde periode GEEN verlof heeft aangevraagd, dan neemt de oplossing van WiGi de gegevens van de vorige naam.......

Hierdoor krijg ik een overzicht die niet geheel correct loopt.

Code:
 wsTarget.Cells(lMax + 1, 1).Value = rNames.Value
        
        On Error Resume Next
        Set rDagen = wsSource.Range("B" & rNames.Row, "GB" & rNames.Row).SpecialCells(xlCellTypeConstants, xlTextValues)
        On Error GoTo 0
        
        If Not rDagen Is Nothing Then

Nu vermoed ik dat het ergens fout gaat in "On Error GoTo 0"........ maar weet dat niet precies.......

Kunnen jullie hulp bieden ??

Txs......
 
Wigi zal zijn code waarschijnlijk sneller kunnen debuggen dan ik, aangezien hij ze zelf geschreven heeft. Maar ik heb ze snel even bekeken om je probleem toch op te lossen, maar Wigi kan daar nog wat aan toevoegen.

Het probleem ligt inderdaad aan het stukje code dat je aanhaalt. Wanneer je hier aan rDagen een range wil toekennen die leeg is gaat hij een foutmelding geven, die onderdrukt wordt door de regel erboven On Error Resume Next, en de uitvoering gaat verder met de volgende regel. Als neveneffect blijft rdagen op dezelfde "waarde" staan, maw de gegevens van de vorige naam blijven actief vandaar deze dubbels.

De oplossing is eigenlijk simpel vlak voor het uitvoeren ofwel na het uitvoeren van dat deel code zet je de waarde van rdagen terug op nothing. Dus op de regel voor On Error Resume Next zet je volgende lijn code:

Code:
Set rDagen = Nothing

Normaal gezien moet dat een oplossing bieden voor lege waarden.

PS. Ik merk in je vb bestand dat er een anomalie is in sommige waarde zoals bv. in cel D12 op blad1. Datainput via datavalidatie biedt hiervoor een uitkomst.
 
Laatst bewerkt:
Hee Finch,

Bedankt voor je snelle reactie !! Ik zal het vanavond eens proberen te wijzigen.

Je. opmerking is correct. In het originele bestand werk ik met data-validatie, dus dat zit wel snor....

Txs anyway........
 
Hee Finch,

Bedankt voor je snelle reactie !! Ik zal het vanavond eens proberen te wijzigen.

Je. opmerking is correct. In het originele bestand werk ik met data-validatie, dus dat zit wel snor....

Txs anyway........

Hee Finch,

Ik heb de aanpassing gedaan en het werkt. TOPPIE..........

Ik heb alleen een andere vraag. De uitvoering van de makro gaat tergend langzaam op mijn INTEL DUO T7500@2.20 Ghz laptobbie.....
Speel ik hem op mijn DUO 6800 af, gaat hij iets sneller, maar toch nog langzaam naar mijn zin.

Is hier, vba technisch, nog enige versnelling in te krijgen ?? Het originele bestand bestaat uit 2 tabbladen van elk 26 weken van 7 dagen....... en heb ongeveer 80 namen zo te gaan..... Dus als ik het in de huidige snelheid zou doen, is de makro ongeveer een 01:30 uur bezig (schat ik zo in).........

Ik hoor/zie de reactie's graag tegemoet...

Txs...
 
Zoek op FindNext in de helpfiles van VBA, daarmee kan je alle cellen zoeken met de eerste soort verlof, dan die met tweede, dan die met derde.

Telkens de gevonden cellen wegschrijven, inclusief datum en naam. Vervolgens sorteren op naam, vervolgens datum.

En hopelijk is dat wel sneller ;)

Wigi
 
Ik merk het nu ook pas, na de code met het oog op performance issues, te bekijken, maar verander volgende regel vlak onder declaraties:

Code:
Application.ScreenUpdating = True

eens in

Code:
Application.ScreenUpdating = False

Dat zal heel wat tijd schelen. Je kan ook eens proberen calculation op manual zetten en events afzetten. Maar, alleen op basis van deze code, zal dat niet superveel uitmaken.
De eerste verandering zal wel een slok op een borrel schelen, qua tijd het nodig heeft.

En anders idd overgaan tot iets "efficientere" code zoals Wigi in zijn vorige post aangaf.
 
Ik merk het nu ook pas, na de code met het oog op performance issues, te bekijken, maar verander volgende regel vlak onder declaraties:

Code:
Application.ScreenUpdating = True

eens in

Code:
Application.ScreenUpdating = False

Dat zal heel wat tijd schelen. Je kan ook eens proberen calculation op manual zetten en events afzetten. Maar, alleen op basis van deze code, zal dat niet superveel uitmaken.
De eerste verandering zal wel een slok op een borrel schelen, qua tijd het nodig heeft.

En anders idd overgaan tot iets "efficientere" code zoals Wigi in zijn vorige post aangaf.

Finch (en WiGi),

Wederom bedankt voor jullie reactie..

Finch, Screenupdating had ik eens op False gezet, echter ik blijf het resultaat minimaal vinden.

Wigi, ben al aan het zoeken naar de juiste FindNext routine en wegschrijven van de data..... Ik hoop dat ik hier wat verder (en sneller) mee ga....

Txs..
 
Ik merk het nu ook pas, na de code met het oog op performance issues, te bekijken, maar verander volgende regel vlak onder declaraties:

Code:
Application.ScreenUpdating = True

Woeps, typfoutje... :o

Merci om de zetduivel te vangen Finch.

Wat ook kan helpen, is met Arrays werken, en die dan wegschrijven, maar "lightning fast" zal het niet zijn.

Wigi
 
Woeps, typfoutje... :o

Merci om de zetduivel te vangen Finch.

Geen probleem, alleen spijtig dat dit volgens de TS geen zichtbare verbetering bracht, terwijl ik die eigenlijk verwachtte. Nu ja, het blijven een 30.000 cellen die moeten behandeld worden als ik TS goed begrijp.
 
Geen probleem, alleen spijtig dat dit volgens de TS geen zichtbare verbetering bracht, terwijl ik die eigenlijk verwachtte. Nu ja, het blijven een 30.000 cellen die moeten behandeld worden als ik TS goed begrijp.

Inderdaad, dat kan gewoonweg niet snel gaan...

Je moet er alleszins voor zorgen dat het aantal bewegingen van:

- cellen lezen
- cellen vullen

door VBA code tot het minimum beperkt wordt.

Wigi
 
Wat ook kan helpen, is met Arrays werken, en die dan wegschrijven, maar "lightning fast" zal het niet zijn.

WiGi, ik begrijp dat het bij zo'n groot bestand geen ferarri zal gaan worden, maar hij doet het nu als een trabant.......(exusses als ik mensen hiermee beledigd heb)...........:)

Maar alle gekheid op een stokje, ben bezig geweest met FindNext en met een zoek(verander) opdacht van één regel en 15 kolommen, is hij een kleine 30 seconden mee bezig..........(code van het net geplukt).........

Waarom gaat het zo langzaam ???
 

Bijlagen

Staat er in dat bestand nog andere code? En dan vooral code die reageert op events (worksheet change, selection change, ...)?
 
Ja dat is niet normaal, en zal wel de oorzaak zijn dat het in die andere macro zo traag gaat.

Met FindNext is het op mijn laptop klaar in een fractie van een seconde.

Over Events: dat zou best kunnen. Finch had dat eerder al aangegeven dat dat het probleem zou kunnen zijn:

Je kan ook eens proberen calculation op manual zetten en events afzetten.

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