[VBA] dag van de week uitvragen voor datum cel en verder

Pagina: 1
Acties:
  • 2.137 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Ik ben bezig in VBA voor Excel met een loop die alle regels doorloopt en afhankelijk van de waarde ervan de betreffende regel ergens plaats in de sheet. Ik kom wel tegen een probleem aan waar ik niet zo snel een oplossing voor kon vonden.
Afhankelijk van de dag van de week overeenkomstig met de datum wordt de regel op een bepaalde positie in een andere sheet geplaatst. Wanneer de loop in een cel komt met een datum 19-09-2005, dan moet hij zien dat dit een maandag is. Mijn vraag is hoe kan ik dit in VBA uitlezen? En hoe kan ik die uitgelezen waarde vervolgens gebruiken om de betreffende row ergens anders te plaatsen?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 15-06 22:03
Aangezien dit redelijk Office specifiek is, zet ik 'm maar in Office-suites.

P&W -> OFF

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 09:39

Boss

+1 Overgewaardeerd

Ik denk dat je dit zoekt.

Uit de VBA Help:
Weekday, functie


Geeft als resultaat een Variant (Integer) die een geheel getal bevat waarmee de dag van de week wordt aangegeven.

Syntaxis

Weekday(datum, [firstdayofweek])

De functie Weekday heeft de volgende benoemde argumenten:

Onderdeel Beschrijving
date Vereist. Een Variant, numerieke expressie, reeksexpressie of een combinatie daarvan, die een datum weergeeft. Als datum Null bevat, wordt Null als resultaat gegeven.
eerstedagvanweek Optioneel. Een constante die de eerste dag van de week aangeeft. Als er niets wordt opgegeven, wordt vbSunday gebruikt.


Instellingen

Het argument firstdayofweek heeft de volgende instellingen:

Constante Waarde Beschrijving
vbUseSystem 0 Gebruikt de NLS API-instelling.
vbSunday 1 zondag (standaardinstelling)
vbMonday 2 maandag
vbTuesday 3 dinsdag
vbWednesday 4 woensdag
vbThursday 5 donderdag
vbFriday 6 vrijdag
vbSaturday 7 zaterdag


Resultaatwaarden

De functie Weekday kan de volgende waarden als resultaat geven:

Constante Waarde Beschrijving
vbSunday 1 zondag
vbMonday 2 maandag
vbTuesday 3 dinsdag
vbWednesday 4 woensdag
vbThursday 5 donderdag
vbFriday 6 vrijdag
vbSaturday 7 zaterdag


Notities

Als de instelling van de eigenschap Calendar Gregoriaans is, geeft de integer die als resultaat wordt gegeven de Gregoriaanse dag van de week voor het argument datum weer. Als de kalender Hijri is, geeft de integer die als resultaat wordt gegeven de Hijri-dag van de week voor het argument datum weer. Voor Hijri-datums is het argument getal een willekeurige numerieke expressie die een datum en/of tijd kan weergeven van 1-1-100 (Gregoriaans: 2 aug 718) tot en met 4-3-9666 (Gregoriaans: 31 dec 9999).

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Ja dat zag ik al... maar ik weet niet precies hou dat te gebruiken. Kan iemand daar een korte uitleg over geven, over hoe ik de betreffende dag bijvoorbeeld in een variabele opsla? Zodat ik ergens anders de dag kan weergeven?

Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 09:39

Boss

+1 Overgewaardeerd

Als je al met VBA bezig bent, dan weet je toch hoe je in VBA onder Excell een waarde uit een cel kan uitlezen en die in een andere cel kan wegschrijven?

Als je het niet met VBA wilt doen, kan je ook nog de excel functie Weekdag gebruiken?
code:
1
2
A1: 12-04-1977
B1: =WEEKDAG(A1)

geeft dan als resultaat 3.

Dusssss....... wat lukt er niet?

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Inmiddels weet ik hoe ik de dag van de week moet uitvragen! :)

[ Voor 65% gewijzigd door Anoniem: 141965 op 18-09-2005 23:10 ]


Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Hieronder heb ik code geplakt die dat doet. Nu loop ik nog tegen een ander klein probleem aan. Ik weet nu hoe ik dagen uitlees en op een regel op een andere sheet kan zetten. Nu heb ik een Loop met daarin een geneste If voor iedere dag van de werkweek. De loop werkt goed. Nu is het de bedoeling dat de maandag (weekday 1) op regel 1 t/m 10 wordt gezet van sheet2 en de dinsdag op regel 11 tm/ 20, enzovoorts. Hij vult voor iedere dag alleen de eerste regel, hoe zorg ik ervoor dat deze voor ieder 'blok' steeds naar de lege regel gaat?

code:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Sub LoopSheet1()
    x = 2
    y = 1
    Dim iDay As Integer
    
    Do While Sheet1.Cells(x, y).Value <> ""
        iDay = Weekday(Cells(x, y), vbMonday)
        If iDay = 1 Then
            Sheet2.Cells(1, y) = iDay
            x = x + 1
        Else
            If iDay = 2 Then
                Sheet.Cells(11, y) = iDay
                x = x + 1
            Else
                If iDay = 3 Then
                    Sheet2.Cells(21, y) = iDay
                    x = x + 1
                Else
                    If iDay = 4 Then
                        Sheet2.Cells(31, y) = iDay
                        x = x + 1
                    Else
                        If iDay = 5 Then
                            Sheet2.Cells(41, y) = iDay
                            x = x + 1
                        Else
                            If iDay = 6 Then
                                Sheet2.Cells(51, y) = iDay
                                x = x + 1
                            Else
                                Sheet2.Cells(61, y) = iDay
                                x = x + 1
                            End If
                        End If
                    End If
                End If
            End If
        End If
    Loop    
End Sub

Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 09:39

Boss

+1 Overgewaardeerd

Misschien nog wel een leuke tip: in plaats van al die geneste if .. then kan je hier beter een Case voor gebruiken. Bovendien wordt de x=x+1 altijd gedaan, dus die kan buiten de IF. Dat houdt je code een stuk overzichtelijker:
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
28
29
Sub LoopSheet1()
Dim iDay as Integer
Dim x as Integer
Dim y as Integer

  x = 2
  y = 1
    
  Do While Sheet1.Cells(x, y).Value <> ""
    iDay = Weekday(Cells(x, y), vbMonday)
    Select Case iDay
      Case 1
        Sheet2.Cells(1, y) = iDay
      Case 2
        Sheet.Cells(11, y) = iDay
      Case 3
        Sheet2.Cells(21, y) = iDay
      Case 4
        Sheet2.Cells(31, y) = iDay
      Case 5
        Sheet2.Cells(41, y) = iDay
      Case 6
        Sheet2.Cells(51, y) = iDay
      Case 7
        Sheet2.Cells(61, y) = iDay
    End Select
  x = x + 1
  Loop    
End Sub


En gezien de logische reeks die in de cel-nummering zit kan het nog korter:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub LoopSheet1()
Dim iDay as Integer
Dim x as Integer
Dim y as Integer

  x = 2
  y = 1
    
  Do While Sheet1.Cells(x, y).Value <> ""
    iDay = Weekday(Cells(x, y), vbMonday)
    Sheet.Cells(1+10*(i-1),y) = iDay
    x = x + 1
  Loop    

En daar zou je dan weer alle overbodige variabelen uit kunnen halen, maar ik weet niet of je die misschien nog ergens anders voor nodig hebt:
Visual Basic:
1
2
3
4
5
6
7
8
9
Sub LoopSheet1()
Dim x as Integer

  x = 2
    
  Do While Sheet1.Cells(x, 1).Value <> ""
    Sheet.Cells(1+10*(i-1),1) = Weekday(Cells(x,1), vbMonday)
    x = x + 1
  Loop    


Nu zou je om te zorgen dat je de getallen per blok vult, per blok een loopje kunnen maken dat kijkt welke cellen er gevuld zijn. Een andere mogelijkheid (die denk ik sneller is), is een array maken van 7 integers en daarin bijhouden op welke positie iedere dag moet komen.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Harstikke bedankt voor de uitgebreide hulp! Dit komt de code zeker ten goede. Maar zoals ik al aangaf loop ik vast op het stukje waar ik de regels wil plaatsen. Ik weet niet hoe ik voor vijf verchillende dagen de code zo krijg dat hij ze voor alle vijf netjes onder elkaar plaatst. Nu overschrijft hij steeds de eerste regel. Kan iemand mij daarmee op weg helpen?

Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 09:39

Boss

+1 Overgewaardeerd

Ik snap niet precies wat je wilt doen, maar als ik uitga van het volgende:
Je wilt een aantal datums, die onder elkaar staan in een kolom, groeperen op dag van de week waarop die datums vielen?

Dat zou je met het volgende stukje kunnen doen:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub LoopSheet1()
Dim x As Integer
Dim Offset(1 To 7) As Integer
  For x = 1 To 7
    Offset(x) = 10 * x
  Next x
  x = 2
  Do While Blad1.Cells(x, 1).Value <> ""
    Blad1.Cells(Offset(Weekday(Cells(x, 1), vbMonday)), 3) = Cells(x, 1)
    x = x + 1
    Offset(Weekday(Cells(x, 1), vbMonday)) = Offset(Weekday(Cells(x, 1), vbMonday)) + 1
  Loop
End Sub


Per dag (ma t/m zo) worden er 10 regeles gereserveerd. Nadat er een dag is weggeschreven naar een bepaald 'blok', wordt voor dat blok de Offset met 1 opgehoogd zodat de volgende keer dat er in dat blok wordt geschreven er 1 regel lager wordt begonnen.

Ik heb het even met mn nederlandse Excel gemaakt, dus je moet nog even de Blad1 vervangen door Sheet1 denk ik!

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Thanks, hier kan ik wat mee! :)

Misschien een rare vraag maar wat is de eigenlijk functie van offset als ik vragen mag?

Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 09:39

Boss

+1 Overgewaardeerd

Offset is een array (een reeks variabelen) van 7 getallen. Per dag van de week sla ik daarin op hoeveel datums er al onder die dag zijn geplaatst. En vervolgens gebruik ik die info om te bepalen waar de volgende moet komen.

De dagen staan op een afstand van 10 regels van elkaar. Als er nu onder woensdag iets geplaatst wordt, dan is Offset: (0,0,1,0,0,0,0). Als er nu weer iets onder woensdag moet, komt dat 1 regel onder het begin van het woensdag-blok te staan.

Sschnappie?

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Het lukt me niet op het werkend te krijgen :( Ik krijg steeds een type mismatch melding, runtime error 13. Hij stopt bij de eerste regel van de Do While Loop, kan iemand mij helpen?

Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 09:39

Boss

+1 Overgewaardeerd

Met dezelfde code als die ik hierboven heb gepost? Als de code is aangepast, kan je dan nog even de hele sub neerzetten hier?

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

Anoniem: 113297

opgelet met offset, want het is ook een eigenschap van het range object. vandaar ws. de foutmelding.

Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Ik heb de code van jouw overgenomen, blad1 heb ik vervangen voor sheet1. Het gekke was dat hij net wel werd uitgevoerd plotseling :? Alleen de gegevens kwamen op sheet1 en niet helemaal op de goede plek, maar nu krijg ik dat zelfs niet meer voor elkaar. Even kort samengevat wat ik wil: Op sheet1 staan een x aantal regels. In kolom A staan data, hiervan wil ik bepalen welke dag van de week het is. Dit om deze in een bepaald gebied te kunnen zetten op Sheet2.

Ik krijg nog steeds de melding, echter ik krijg hem nu op de 3e regel van de Do While Loop. Ik begin steeds meer thuis te geraken met VBA, maar veel is nieuw voor me. Ik weet gewoon niet wat ik fout doe. Hieronder mijn code.


Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub LoopSheet1()
    Dim x As Integer
    Dim Offset(1 To 7) As Integer
    For x = 1 To 7
        Offset(x) = 10 * x
    Next x
    x = 2
    Do While Sheet1.Cells(x, 1).Value <> ""
        Sheet1.Cells(Offset(Weekday(Cells(x, 1), vbMonday)), 3) = Cells(x, 1)
        x = x + 1
        Offset(Weekday(Cells(x, 1), vbMonday)) = Offset(Weekday(Cells(x, 1), vbMonday)) + 1
    Loop
End Sub


Hoi mensen, een nieuwe dag van de week en ik kom er nog steeds niet uit! Wie helpt mij verder? Graag! :)

[ Voor 13% gewijzigd door Anoniem: 141965 op 20-10-2005 00:02 ]


Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Anoniem: 113297 schreef op vrijdag 14 oktober 2005 @ 10:53:
opgelet met offset, want het is ook een eigenschap van het range object. vandaar ws. de foutmelding.
Zou je kunnen aangeven waar de fout zit? Bedankt:)

Acties:
  • 0 Henk 'm!

  • onkl
  • Registratie: Oktober 2002
  • Nu online
Offset wordt hier gebruikt als variabelenaam. Echter, offset is ook een Excel functie.
In VBA termen is Range("A1").Offset(0,1) een verwijzing naar B1 (of A2, dat vergeet ik altijd 8)7 )
Het is i.h.a. een afrader namen van functies als variabelen te gebruiken. Soms lukt 't, soms niet, mijden is de uitweg. Hernaam alle Offset eens naar "Dagenarray" of een andere beeldende naam. (VBA heeft een vervangen functie, CRTL-H?dacht ik)

[ Voor 20% gewijzigd door onkl op 17-10-2005 14:26 ]


Acties:
  • 0 Henk 'm!

  • onkl
  • Registratie: Oktober 2002
  • Nu online
Even terug naar je startpost.
Wat wil je nu eigenlijk bereiken? Je hebt een rij met data en die moet, gesorteerd op weekdag ergens anders komen te staan is wat ik eruit op maak.
Klopt dat?

Acties:
  • 0 Henk 'm!

Anoniem: 141965

Topicstarter
Het is me ineens gelukt binnen 10 minuten op een mooie dinsdagavond (2-0!). De onderstaande code doet wat ik wil. Ik heb de Offset als naam weggehaald en vervangen voor Weekarray. Daarna kreeg ik weer dezelfe melding. Volgens mij ging er ook wat fout met x. Ik heb zo het idee dat deze voor zowel het ophogen van de Array werd gebruikt als voor de rowwaarde op de eerste sheet. Daarom heb ik hem opgesplits in x en Sheet1x.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub LoopSheet1()
    Dim x As Integer
    Dim Sheet1x As Integer
    Dim WeekArray(1 To 7) As Integer
    For x = 1 To 7
        WeekArray(x) = 12 * x - 7
        Debug.Print (WeekArray(x))
    Next x
    Sheet1x = 2
    
    Do While Sheet1.Cells(Sheet1x, 1).Value <> ""
        Sheet2.Cells(WeekArray(Weekday(Sheet1.Cells(Sheet1x, 1), vbMonday)), 1) = Sheet1.Cells(Sheet1x, 1)
        WeekArray(Weekday(Sheet1.Cells(Sheet1x, 1), vbMonday)) = WeekArray(Weekday(Sheet1.Cells(Sheet1x, 1), vbMonday)) + 1
        Sheet1x = Sheet1x + 1
    Loop
End Sub



Het belangrijkste is dat het nu werkt, alle dagen worden binnen hun blok onder elkaar geplaatst.

Ik heb nog een aanvullend vraagje hierop. De kolom waarvan ik bepaal bij welke dag die hoort is niet de enige kolom die gebruikt wordt. Het gaat om meerdere cellen op dezelfde rij, maar dan met vaste tekst. Nu wil ik liever niet voor kolom B en C, etc.. op dezelfde manier bepalen op welke regel die moeten komen. Immers, dat heb ik in de eerste cel al bepaald. De overige cellen op dezelfde rij moeten op dezelfde regel komen.

Is er een manier om na het uitlezen van de datum en het bepalen van de plek in de Array, deze plek tijdelijk te onthouden totdat er naar de volgende regel wordt geloopt? Zodat ik alle andere cellen op de regel ook kan plaatsen?

In ieder geval bedankt voor de hulp bij mijn grootste probleem!!!! :)
Pagina: 1