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

Analyseren bestaande code

  • Onderwerp starter Onderwerp starter wiki
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

wiki

Gebruiker
Lid geworden
2 okt 2007
Berichten
576
Ik heb een code waarmee ik al jaren totaalberekeningen maak in een dienstrooster. Deze code is geschreven door een collega, maar het lukt mij maar niet om te achterhalen waar ik bepaalde informatie kan wijzigen. Het rooster is ondertussen steeds verder uitgewerkt en er moeten nu veranderingen in de code aangebracht worden.

Ik wil graag het volgende aanpassen:
-Er moet een kolom tussen a en b ingevoegd worden, waardoor betreffende bereiken en start of doelcellen een kolom op moeten schuiven
-De code "inlijst" "nietinlijst" wil ik graag omzetten naar het gedefinieerd bereik (not) "deelcode1", waardoor in kolom daginzet alleen werkuren weergegeven
worden en geen verlof of andere codes.


Ik heb vooral moeite te achterhalen wat de code doet met
Dim a
Dim b
Dim c
Dim d
Ik kan in de code niet achterhalen waar eea voor staat

Wie kan mij helpen?
 

Bijlagen

Laatst bewerkt:
Hier volgt de code in het blad:
Code:
Sub Knop2_BijKlikken()
'
' Knop2_BijKlikken Macro
Application.ScreenUpdating = False



    Dim a
    Dim b
    Dim c
    Dim d
    For d = 3 To 33 'rij
        a = 1 'kolom?
        Cells(d, 2) = ""
        'deze lus loopt van links naar rechts
        Do
        c = "nietinlijst"
        a = a + 2 '2 kolommen opschuiven
            If Cells(d, a) <> "" Then 'staat er een code in de cel dan
                
                For b = 48 To 53 'als de code niet in de voorwaarde lijst staat
                    If Cells(b, 1) = Cells(d, a) Then
                        c = "inlijst"
                    End If
                Next b
                If c = "nietinlijst" Then
                    Cells(d, 2) = Cells(d, 2) + Cells(d, a + 1)
                    If Cells(d, a + 1) > 5 Then
                        Cells(d, 2) = Cells(d, 2)
                    End If
                End If
            End If
            'hier begint de lus voor totalen onder aan het blad
            For b = 47 To 54
                If Cells(b, 1) <> "" Then
                    If Cells(d, a) = Cells(b, 1) Then
                        Cells(b, a) = Cells(b, a) + Cells(d, a + 1)
                        If Cells(d, a + 1) > 5 Then
                            Cells(b, a) = Cells(b, a)
                        End If
                    End If
                 End If
            Next b
        Loop Until Cells(3, a + 2) = "stop"
    Next d
    For c = 2 To 26 'deze lus bepaald in welk blok hij zit
        b = 2
        Do ' lus van ls naar rs
            b = b + 2
            Cells(c + 8, b) = ""
            For a = c + 1 To c + 7
                If Cells(a, b - 1) <> "" Then
                    Cells(c + 8, b) = Cells(c + 8, b) + Cells(a, b)
                    If Cells(a, b) > 5 Then
                        Cells(c + 8, b) = Cells(c + 8, b)
                    End If
                End If
            Next a
        Loop Until Cells(3, b + 1) = "stop"
        c = c + 7 ' hierdoor worden het stappen van 8(1 blok)
    Next c

        Range("a1").Select
        
        Application.ScreenUpdating = True
End Sub

Ondertussen heb ik beredeneerd dat A de kolom is en B de rij.

gr wim
 
Laatst bewerkt:
Op verzoek van TS verplaatst naar Excel
 
Uiteraard ben ik ook gelukkig als ik op een andere manier de zelfde output kan krijgen.

-Lengte van periode is altijd gelijk nl: 4 weken van 7 dagen
-Het aantal medewerkers is variabel
-In kolom 3 wil ik graag de uren opgeteld uit ieder tweede cel als de cel links ervan gelijk is aan gedefinieerd bereik "Deelcode1"
In iedere 8e rij wil ik graag een telling van alle uren van de week erboven.

Wie kan helpen?

gr Wim
 
Als het verzoek te ingwikkeld, onlogisch of nadere uitleg nodig is dan hoor ik dat graag.:confused:

gr wim
 
Open je VBA-scherm, open het deelvenster Lokale variabelen en doorloop nu je code met F8. In je deelvenster kan je nu zien welke waarden de respectievelijke variabelen hebben en wat de code eigenlijk doet
 
Deelvenster Lokale variabelen heb ik nooit gebruikt, maar ziet er goed uit. Ga morgen de code nalopen. Heb jij een idee voor het vervangen van de verwijzing
Code:
   For b = 48 To 53 'als de code niet in de voorwaarde lijst staat
                    If Cells(b, 1) = Cells(d, a) Then
                        c = "inlijst"
voor code met verwijzing naar als zit in deelcode1 (gedefinieerde naam)?

gr wim
 
Ziet er goed uit. Ga ik morgen verder uitwerken. Bedankt!!

gr wim
 
Rudi, de code werkt wel in het voorbeeld, maar in het werkelijke blad heb ik meer dan 35 medewerkers en dan loopt het blad vast:(

gr wim
 
Waar loopt hij dan op vast ?
 
Ik heb er overal nog wat extra commentaar bij gezet. Dit lijkt me een rommelige code van een beginner. Als je vertelt wat die code eigenlijk verondersteld is te doen, vooral dan die "stop" in F3 of een waarde 5 in de F-kolom, dan kan je werkblad veel leuker gemaakt worden.
Die formules onderin de code, die nu commentaar zijn, kunnen misschien, mits aanpassingen weer werken?

Code:
Sub Knop2_BijKlikken()
  Application.ScreenUpdating = False
  Dim a As Integer, b As Integer, c As Integer, d As Integer, e As String
  For d = 3 To 33                                          'loop 1 voor 1  de datums af
    Cells(d, 3) = ""                                       'wis daginzet
    Do
      e = "nietinlijst"                                    'hulpvariabele
      If Cells(d, 4) <> "" Then                            'kolom "40" is niet leeg
        For b = 48 To 53                                   'zinloze loop, hier doe je 6 keer hetzelfde ??????
          If Not Sheets("Diensten").Range("Deelcode1").Find(Cells(d, 4), , xlValues, xlWhole) Is Nothing Then
            e = "inlijst"                                  'die code in de kolom "40" staat in de lijst "deelcode1"
          End If
        Next b
        If e = "nietinlijst" Then                          'je code kwam niet voor in die deelcode1
          Cells(d, 3) = Cells(d, 3) + Cells(d, 5)          'dan zet je de inhoud van de E-kolom bij de C-kolom
          If Cells(d, 5) > 5 Then
            Cells(d, 3) = Cells(d, 3)                      'is de E-kolom "8" groter dan 5, dan enkel E-kolom in de C-kolom
          End If
        End If
      End If

      'hier begint de lus voor totalen onder aan het blad
      For b = 48 To 53
        If Cells(b, 1) <> "" Then
          If Cells(d, 4) = Cells(b, 1) Then                'item in periodetotaal is zelfde als onze kolom "40"
            Cells(b, 4) = Cells(b, 4) + Cells(d, 5)        'subtotaal maken in D-kolom
            If Cells(d, 5) > 5 Then
              Cells(b, 4) = Cells(b, 4)                    'is de E-kolom "8" groter dan 5, dan enkel E-kolom in de C-kolom
            End If
          End If
        End If
      Next b
    Loop Until Cells(3, 6) = "stop"                        'eigenlijk maak 1 loop als F3 stop staat
  Next d

  For c = 2 To 26                                          'deze lus bepaald in welk "week"-blok hij zit
    Do
      Cells(c + 8, 5) = ""                                 'weektotaal wissen
      For a = c + 1 To c + 7                               'loop 1 voor 1 elke dag van de week af
        If Cells(a, 4) <> "" Then
          Cells(c + 8, 5) = Cells(c + 8, 5) + Cells(a, 5)  'sommeer alles in weektotaal
          If Cells(a, 5) > 5 Then                          'staat er een waarde > 5 in de E-kolom "8"
            Cells(c + 8, 5) = Cells(c + 8, 5)              'stom, dan zet je iets gelijk aan zichzelf
          End If
        End If
      Next a
    Loop Until Cells(3, 6) = "stop"                        'eigenlijk maak 1 loop als F3 stop staat
    c = c + 7                                              ' hierdoor worden het stappen van 8(1 blok)
  Next c
  ' Cells(1, 2) = Cells(1, 1)
  'Range("b10").FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
  ' Range("b18").FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
  'Range("b26").FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
  'Range("b34").FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
  'Range("b1").FormulaR1C1 = "Dag inzet"
  ' Range("B48:B56").FormulaR1C1 = "=SUM(RC[1]:RC[200])"
  Range("a1").Select
  Application.ScreenUpdating = True
End Sub
 
Als je vertelt wat die code eigenlijk verondersteld is te doen, vooral dan die "stop" in F3 of een waarde 5 in de F-kolom, dan kan je werkblad veel leuker gemaakt worden.

@4
-Lengte van periode is altijd gelijk nl: 4 weken van 7 dagen
-Het aantal medewerkers is variabel
-In kolom 3 wil ik graag de uren opgeteld uit ieder tweede cel als de cel links ervan gelijk is aan gedefinieerd bereik "Deelcode1"
In iedere 8e rij wil ik graag een telling van alle uren van de week erboven.

STOP wordt gebruikt om aan te geven bij welke kolom de code moet stoppen.

gr wim
 
Doe maar. Het kan echter wel even duren (veel werk met oudejaarsperiode),maar ik doe evenwel mijn best.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan