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

Opgelost VBA voor Variable range

Dit topic is als opgelost gemarkeerd
Status
Niet open voor verdere reacties.

caffie

Gebruiker
Lid geworden
2 jan 2008
Berichten
291
Ik heb een voorbeeld sheet bijgesloten

Ik zou graag een macro maken waarin ik een variable range kan bouwen

Ik snap dat het makleijk is als je een vierkant blok heb maar als dat niet zo is
kom ik er niet goed uit

De marco moet dus werken als ik de volgende range wil gebruiken

1 feb tot 18 feb
dat lukt me nog wel

Code:
Range(a, bl), (Cells(c, d))).Select

nu
10 feb tot 5 maart
of
10 feb tot 5 april

De maanden staatn ik kolom " B "
De dag staan in regel 7

vast heel erg bedankt
 

Bijlagen

Laatst bewerkt:
Hoe word de voorwaarde bepaald hoeveel dagen je wil selecteren?
 
10 feb tot 5 maart:
Code:
Set Rng = Union(Range("L17:AD17"), Range("C18:G18"))
En dan mag je zelf de start- en einddatum omzetten in celadressen;)
Kom je er niet uit dan meld je je maar weer.
 
de start- en einddatum omzetten in celadressen (Dat lukt me wel)

Ik snap de je de regels samen voeg
Code:
Set Rng = Union(Range("L17:AD17"), Range("C18:G18"))

maar 10 feb tot 5 april
zijn dan zelfs 3 regels

Mag dit dan ook
Code:
Set Rng = Union(Range("L17:AD17"), Range("C18:G18") , Range("C19:G19"))

Ik moet dus ook uitvogelen hoeveel regels het zijn.
want als de range niet uit 3 regels bestaat werk het dan nog


vast heel erg bedankt al


Code:
Sub teller()

Dim stdg As Date, enddg As Date, x As Long, y As Long, strd As Long, eindd As Long, teller As Long


strdatum = InputBox("Vul een Start datum in", Title, DateSerial(2022, 8, 1))
enddatum = InputBox("Vul een Eind datum in", Title, DateSerial(2024, 7, 1))

If IsDate(strdatum) = True Then
Else
    MsgBox ("Startdatum is niet goed ingevuld")
    Exit Sub
End If

If IsDate(enddatum) = True Then
Else
    MsgBox ("Einddatum is niet goed ingevuld")
    Exit Sub
End If

maanden = DateDiff("m", strdatum, enddatum)
strd = Day(strdatum)
endd = Day(enddatum)

If strd > eindd Then
    maanden = maanden + 1
End If


Kstartcel = Day(strdatum) + 2
Rstartcel = ((Year(strdatum) - 2017) * 12) + Month(strdatum) + 3
Cells(Rstartcel, Kstartcel).Select
 
???????
      
Else

MsgBox "datums zijn gelijk of eind datum ligt voor de startdatum"
End If

End Sub
 
Ja hoor, je kunt op deze manier ook drie of meer ranges samenvoegen.
En dat kan ook in stapjes:
Code:
    Set rng = Range("L17:AD17")
    Set rng = Union(rng, Range("C18:G18"))
    Set rng = Union(rng, Range("C19:G19"))
 
En dit:
Code:
If IsDate(strdatum) = True Then
Else
    MsgBox ("Startdatum is niet goed ingevuld")
    Exit Sub
End If
Kan je ook zo doen:
Code:
If Not IsDate(strdatum) Then
    MsgBox ("Startdatum is niet goed ingevuld")
    Exit Sub
End If
 
Ik heb er het volgende van gemaakt
Voor als iemand het handig vind

Bedant voor alle hulp
Weer wat geleerd

volgende keer een kijken of het toch niet beter kan
Maar voor nu werkt het

Code:
Sub teller()

Dim stdg As Date, enddg As Date, x As Long, y As Long, strd As Long, eindd As Long, teller As Long

strdatum = InputBox("Vul een Start datum in", Title, DateSerial(2023, 8, 1))
enddatum = InputBox("Vul een Eind datum in", Title, DateSerial(2024, 7, 31))


If Not IsDate(strdatum) Then
    MsgBox ("Startdatum is niet goed ingevuld")
    Exit Sub
End If

If Not IsDate(enddatum) Then
    MsgBox ("Einddatum is niet goed ingevuld")
    Exit Sub
End If

maanden = DateDiff("m", strdatum, enddatum)
strd = Day(strdatum)
endd = Day(enddatum)

If strd > eindd Then
    maanden = maanden + 1
End If

Kstartcel = Day(strdatum) + 2
Rstartcel = ((Year(strdatum) - 2017) * 12) + Month(strdatum) + 3
 
Keindcel = Day(enddatum) + 2
Reindcel = ((Year(enddatum) - 2017) * 12) + Month(enddatum) + 3

If maanden = 1 Then
    Set Rng = (Sheets("16").Range(Cells(Rstartcel, Kstartcel), (Cells(Reindcel, Keindcel))))
End If
    If maanden = 2 Then
        Set Rng = (Sheets("16").Range(Cells(Rstartcel, Kstartcel), (Cells(Rstartcel, 33))))
        Set Rng = Union(Rng, (Sheets("16").Range(Cells(Reindcel, 3), (Cells(Reindcel, Keindcel)))))
    End If
        If maanden = 3 Then
            Set Rng = (Sheets("16").Range(Cells(Rstartcel, Kstartcel), (Cells(Rstartcel, 33))))
            Set Rng = Union(Rng, (Sheets("16").Range(Cells(Rstartcel + 1, 3), (Cells(Rstartcel + 1, 33)))))
            Set Rng = Union(Rng, (Sheets("16").Range(Cells(Reindcel, 3), (Cells(Reindcel, Keindcel)))))
        End If
            If maanden > 3 Then
                Set Rng = (Sheets("16").Range(Cells(Rstartcel, Kstartcel), (Cells(Rstartcel, 33))))
                Set Rng = Union(Rng, (Sheets("16").Range(Cells(Rstartcel + 1, 3), (Cells(Reindcel - 1, 33)))))
                Set Rng = Union(Rng, (Sheets("16").Range(Cells(Reindcel, 3), (Cells(Reindcel, Keindcel)))))
                End If
 Rng.Select
 Cells(1, 1) = Application.WorksheetFunction.Sum(Rng)
 Cells(2, 1) = Application.WorksheetFunction.CountA(Rng)
End Sub
 
Een variant:
Code:
Function Sommeren(r1, k1, r2, k2) As Double
    For r = r1 To r2
        If r1 = r2 Then
            For k = k1 To k2
                som = som + Cells(r, k)
            Next
        Else
            If r = r1 Then
                For k = k1 To 33
                    som = som + Cells(r, k)
                Next
            ElseIf r = r2 Then
                For k = 3 To k2
                    som = som + Cells(r, k)
                Next
            Else
                For k = 3 To 33
                    som = som + Cells(r, k)
                Next
            End If
        End If
    Next
    Sommeren = som
End Function
 
Grappig ik had ook zo iets met een met twee for functies
Maar niet zo mooi als deze
Mijn code was 2x zo groot (lang)
Ga er ook even naar kijken want ziet er wel heel netjes uit

Alle bedankt voor de hulp en de lessen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan