Userform Private Function

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Goedenavond.

Ik heb voor het eerst eens een Function zelf gemaakt. Oja Ja. Het werd wel eens een keertje tijd als zeg ik het zelf.

Ik heb het feitelijk simpel gehouden en gebruikt om rijen te kleuren.

Code:
Private Function RijKleur(RKleur As Long)
    Sheets("Gebruikers").Range(Sheets("Gebruikers").Cells(UserRow, 1), Sheets("Gebruikers").Cells(UserRow, 13)) _
        .Interior.ColorIndex = RKleur

End Function

De uitvoering doe ik in de code met bijvoorbeeld:

Code:
    RijKleur (5)

Daar het wel werkt, maar voor de eerste keer is dat ik dit zelf heb gedaan, heb ik toch een paar kleine vraagjes.

1> Klopt het geheel of pas ik ergens toch iets verkeerds toe?
2> Wat is eigenlijk het voordeel in het gebruik van een function en wanneer pas je dit echt toe?
3> Ik lees hier en daar dat dit in een standaard module thuishoort. Ik heb hem in het betreffende userform geplaatst. Maakt dit wat uit.
4> Is dit ook te gebruiken met een Public Constante. Bijvoorbeeld: Public Const RijGroen As Long = 4
5> Helemaal bovenaan het codeblad heb ik ook nog een declaratie: Dim RKleur As Long staan zodat deze voor het hele userform geldt.
Is dit nog wel nodig of kan dit weg daar de declaratie in de Function staat?

Groet Maarten
 
Laatst bewerkt:
Correctie.

In verband met een conflict in een ander formulier, heb ik de code alsnog in een Algemene module geplaatst en de scope aangepast.

Code:
Public Function RijKleur(RKleur As Long)
    Sheets("Gebruikers").Range(Sheets("Gebruikers").Cells(UserRow, 1), Sheets("Gebruikers").Cells(UserRow, 13)) _
        .Interior.ColorIndex = RKleur

End Function

De uitvoering vindt gewoon nog plaatst als:

Code:
    Rijkleur (5)

Andere kleuren zijn: XlNone, 3, 4, en 6.

Bovenstaande vragen blijven verder wel van kracht.
 
Laatst bewerkt:
1> Klopt het geheel of pas ik ergens toch iets verkeerds toe?
Het werkt wanneer je de functie aanroept in de VBE, in 'principe 'gebruik je een function om een resultaat terug te geven en een sub om een actie uit te voeren, bijvoorbeeld de kleur van de cellen wijzigen.
2> Wat is eigenlijk het voordeel in het gebruik van een function en wanneer pas je dit echt toe?
zie 1
3> Ik lees hier en daar dat dit in een standaard module thuishoort. Ik heb hem in het betreffende userform geplaatst. Maakt dit wat uit.
Afhankelijk van waaruit de functie/sub aangeroepen (kan worden) wordt, is de plek van belang.
4> Is dit ook te gebruiken met een Public Constante. Bijvoorbeeld: Public Const RijGroen As Long = 4
ja
5> Helemaal bovenaan het codeblad heb ik ook nog een declaratie: Dim RKleur As Long staan zodat deze voor het hele userform geldt.
Is dit nog wel nodig of kan dit weg daar de declaratie in de Function staat?
In jouw functie staat Rkleur als argument, hier kun je een andere naam aangeven
Gebruik de variabelen in jouw functie vanuit de functie-aanroep, dat maakt dat de functie makkelijker hergebruikt kan worden en minder onderhoud nodig heeft (in dit geval de sheet, userrow, Rkleur en wellicht zelfs de 1 en de 13, ik zou hier dus overigens een Sub voor gebruiken.
 
1. gebruik een funktie om een resultaat van een berekening/methode/aktie weer te geven.
2. gebruik macro's om akties uit te voeren(bijv. het kleuren van een cel/range)
3. funkties kunnen in alle codemodules geplaatst worden
4. UDF's (user defined functions) die in formules in een werkblad gebruikt worden, moeten altijd in een algemene macromodule gezet worden.
5. Jouw voorbeeld is juist iets wat je niet in een funktie moet uitvoeren.

bijv. wat wel
Code:
sub M_snb()
   msgbox F_leeftijd("20-03-1990")
end sub

function F_leeftijd(c00)
   F_leeftijd=year(date)-year(c00)
end function
 
Laatst bewerkt:
Hmmm oke.

Wat ik hieruit begrijp is dat ik dus in deze gewoon beter een Sub in een Module moet maken en deze telkens aanroepen vanuit het userform.

Op zicht geen probleem, maar wat er gebeurd is dat ik dus telkens een Public Variabele een waarde moet geven en daarna de betreffende sub aan moet roepen.

Dit resulteert dan telkens in:

Code:
Sub Rijkleur()
       Sheets("Gebruikers").Range(Sheets("Gebruikers").Cells(UserRow, 1), Sheets("Gebruikers").Cells(UserRow, 13)) _
        .Interior.ColorIndex = RKleur

End Sub

De Public Function wordt dan een Algemene Sub in een module en RKleur dien ik dan Public te declareren As Long.

Vervolgens krijg ik dan als voorbeeld, telkens de volgende opzet vanuit een userform.

Code:
RKleur = 5
Call RijKleur [COLOR="#FF0000"]'Waarbij het woordje Call in feite niet eens nodig is, maar welke ik even voor het overzicht hier wel vermeld.[/COLOR]

Dit was ongeveer de eerste opzet welke ik gebruikte. Juist omdat ik van deze dubbele ingreep af wilde, wilde ik het anders doen. Scheelde weer wat coderegels. Is dit eventueel dan ook op een andere wijze te realiseren?

Ik weet dat ik realistisch moet blijven met denken, dat niet alles mogelijk is en dat ik vaak ook te moeilijk denk.
 
Laatst bewerkt:
Goed ik ben tot onderstaand en werkende code gekomen.

De Public Function is geheel verwijderd.
De Public variabele RKleur is verwijderd.
In alle userforms en daar waar nodig om de rijkleur te veranderen wordt de kleur van de rij niet meer bepaald en wordt direct Sub RijKleur aangeroepen.

Voor zover ik tot nu toe heb gezien werkt het en heb ik een ander userform: Frm_Beheer er aan toegevoegd zodat ik 1 Sub heb die de rijkleuren regelt.

Code:
Sub Rijkleur()
    Dim Kleur As Long
    Dim d As Range
    
    With Sheets("Gebruikers")
        Set d = .Range(Sheets("Gebruikers").Cells(UserRow, 1), Sheets("Gebruikers").Cells(UserRow, 13))
        
        If Not Frm_Beheer.Visible Then
            Select Case .Cells(UserRow, 11).Value
                Case Is = 3
                    Kleur = 5
                Case Is = 5
                    Kleur = 6
                Case Else
                    Kleur = IIf(InlogOk, 4, xlNone)
            End Select
        Else
            Kleur = IIf(Frm_Beheer.ComboBox1.Value <> "Deblokkeren", 3, xlNone)
        End If
        
        d.Interior.ColorIndex = Kleur        
       [COLOR="#FF0000"] '.Range(Sheets("Gebruikers").Cells(UserRow, 1), Sheets("Gebruikers").Cells(UserRow, 13)).Interior.ColorIndex = Kleur[/COLOR]    
    End With

End Sub

Toch ook weer een vraag. Ik gebruik nu variabele "d" als Range. Is dit beter of wordt ook hier de Range en de Set verkeerd gebruikt en of kan ik beter de in het rood geschreven code gebruiken en dus de variabele "d" en diens Set verwijderen?

Verder en als laatst.
Snb en of E V R. Is dit wat jullie bedoelde? Klopt het zo wel?
 
Laatst bewerkt:
Als je de variabele "d" vaker als één keer gebruikt is dat handiger code schrijven.
bv.
Code:
d.font.bold = true
d.Interior.ColorIndex = Kleur

Voor maar één keer gebruik om iets te regelen is geen variabele nodig (geen declaratie, geen extra coderegels).
Code:
.Cells(UserRow, 1).resize(,13).Interior.ColorIndex = Kleur    
    End With
 
@HSV

Vaker dan

@masala

Mij lijkt dat userform overbodig.


Code:
Sub M_snb
   M_kleur
end sub

Sub M_kleur()
   with activecell.offset(,-activecell.column+1).resize(,13)
     .interior.colorindex=xlnone
     if activecell.offset(,-activecell.column+11)=3 then
       .interior.colorindex=5
     elseif activecell.offset(,-activecell.column+11)=5 then
       .interior.colorindex=6
     end if
  end with             
End Sub
 
Laatst bewerkt:

@snb, @HSV

Ps. Als een tekst is gewijzigd en er per abuis een verkeerd woord is blijven staan heb ik geen behoefte om daarop geattendeerd te worden.
Maar als je iets gewoon kan overnemen.........
 
Laatst bewerkt:
@HSV

We gaan voor kwaliteit natuurlijk.:d
 
Snb. Hoewel ik jouw laatste code nog niet heb uitgeprobeerd, wil ik je aangeven waarom ik die Frm_Beheer er bij vermelde.

Twee Userform's maken gebruik van deze sub om rijen te kleuren en niet allebei kunnen tegelijk in gebruik zijn. Vandaar dat ik dus het ene stukje laat gelden als het formulier Beheer actief is en zo niet dan geldt de rest.
 
Sorry even nog terugkomen op dit topic. Wel zo netjes.

Snb het userform was inderdaad niet nodig. Hoewel jouw code niet werkte, omdat er in mijn opzet geen cel wordt geselecteerd en dus de ActiveCell altijd hetzelfde blijft, ben ik wel verder gaan kijken. Ik heb de zaken anders geprogrammeerd en kwam uit bij een Select Case Functie. Deze werkt goed en naar wens.

Code:
Sub Rijkleur()
    Dim Kleur As Long
    
    With Sheets("Gebruikers")
        Select Case .Cells(UserRow, 10).Value 'Kleur wordt bepaald a.d.h.v. Statuscode: 0, 1, 2, 3 of 4
            Case Is = 0
                Kleur = xlNone 'Standaard
            Case Is = 1
                Kleur = 4 'Groen
            Case Is = 2
                Kleur = 5 'Blauw
            Case Is = 3
                Kleur = 6 'Geel
            Case Is = 4
                Kleur = 3 'Rood
        End Select
        
        .Range(.Cells(UserRow, 1), .Cells(UserRow, 13)).Interior.ColorIndex = Kleur
    End With

End Sub

Wel allen bedankt.
 
Laatst bewerkt:
Voor diegene die liever met kleurnamen in VBA werken in plaats van de indexcodes.

Verander .Interior.ColorIndex in .Interior.Color .

Hoewel de uitkomst hetzelfde is, maakt onderstaande wijze de code wel meer leesbaar.


Code:
Sub Rijkleur()
    Dim Kleur As Long
    
    With Sheets("Gebruikers")
        Select Case .Cells(UserRow, 10).Value 'Kleur wordt bepaald a.d.h.v. Statuscode: 0, 1, 2, 3 of 4
            Case Is = 0
                Kleur = xlNone
            Case Is = 1
                Kleur = vbGreen
            Case Is = 2
                Kleur = vbBlue
            Case Is = 3
                Kleur = vbYellow
            Case Is = 4
                Kleur = vbRed
        End Select
        
        .Range(.Cells(UserRow, 1), .Cells(UserRow, 13)).Interior.Color = Kleur
    End With

End Sub
 
Laatst bewerkt:
En die van kort houdt.

Code:
Sub Rijkleur()
 With Sheets("Gebruikers")
  .Cells(UserRow, 1).resize(,13).Interior.Color = application.choose(.Cells(UserRow, 10) +1,xlnone, vbgreen, vbblue, vbyellow, vbred)
 end with
end sub
 
Altijd baas boven baas. Haha. :thumb:

Meteen weer wat geleerd.

Echter. Application.Choose, komt bij mij niet voor. Maar ja ik heb dan ook nog maar Office 2007.
 
Laatst bewerkt:
Bij mij komt het ook niet voor, en bezit ook Excel 2007.
Worksheetfunction.choose heb je wel, en dan vervang je dat in Application.choose.

Application reageert ook beter, maar dat is weer een andere discussie die ongeveer een maand geleden aan de orde is geweest tussen @Warme bakkertje en @snb.
 
Klopt. WorksheetFunction.Choose heb ik wel. Maar goed met bovenstaande in het achterhoofd, kun je net zo goed meteen Application.Choose intypen. Scheelt weer typewerk. :d
 
Het ging me niet om het typen van dat woord, maar om een uitleg.
Met een punt achter application. krijg je niet hetzelfde keuzemenu als bij worksheetfunction..
Als geoefende Exceller weet je de worksheetfunctions al wel zo'n beetje uit je hoofd, maar als je nog ergens naar moet zoeken is 'worksheetfunction' een betere start dan 'Application'.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan