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

VBA; If Proces.Value

Status
Niet open voor verdere reacties.

ronbb2

Gebruiker
Lid geworden
18 mei 2015
Berichten
107
Goedendag,

Ik heb op dit moment een userform met daarin dropdown menu's. Afhankelijk van de keuze in de eerste dropdown wordt een lijst ingeladen met de gegevens die gekoppeld zijn aan de eerste keuze.
Dit doe ik met de volgende code;

If Proces.Value = "Generiek" Then Subcategorie.List = [Generiek].Value

Echter wil ik het dynamischer maken. Het bestand zal door verschillende afdelingen gebruikt worden en elke afdeling zal zijn eigen begrippen gebruiken. Mijn voorbeeld, Generiek, zal niet bij iedereen toepasbaar zijn.

VBA past zich hier met de huidige code niet automatisch op aan. Met als gevolg dat hij de lijsten niet meer kan vinden. Immers vindt hij pas iets wanneer je voor Generiek kiest.

Weet iemand hoe ik deze VBA code dynamisch kan maken?

Alvast bedankt.
 
En je voorbeeld document?
 
Excuses. Dacht ik het bestand had toegevoegd.

Bij deze.

Tab "Vragen" is de hoofdpagina waarop de userform terug te vinden is.

Tab "Data" is de pagina met de input die aanpasbaar moet worden zonder mijn userform te verprutsen.
 

Bijlagen

Ik zie het probleem hier niet gebeuren.
Misschien dat je eens stap voor stap een casus kan beschrijven en vertellen waar het dan mis gaat?
 
Ik zie het probleem hier niet gebeuren.
Misschien dat je eens stap voor stap een casus kan beschrijven en vertellen waar het dan mis gaat?

Met de huidige keuzes doet hij het inderdaad. Het probleem ontstaat wanneer ik het bestand naar een andere afdeling stuur en deze andere opties wil. Zodra de opties van tab Data rij D worden aangepast werken de dropdowns in het userform niet meer goed. Dit komt omdat de VBA code erg statisch is. Hij verwijst naar de inhoud van de cel (die dus bij elke afdeling anders kan zij) ipv de cel zelf.


Vb. Als je nu in het userform kiest voor Generiek - Alg (gele rij) dan krijg je de opties van alleen Generiek - Alg te zien (Rekeningnummer, bali, etc.). Echter, geef ik Generiek - Alg een andere benaming op tabblad Data dan laat hij de gele rij (rekeningnummer, bali, etc.) niet meer zien omdat de eerste keuze niet overeen komt met de VBA code.
 
Dat lijkt me logisch als de eerdere naam er niet meer is.
VBA zal dat inderdaad niet automatisch aanpassen.
 
Dat lijkt me logisch als de eerdere naam er niet meer is.
VBA zal dat inderdaad niet automatisch aanpassen.

En er is geen (andere) VBA code/optie om dit wel mogelijk te maken? Met mijn huidige code lukt dat niet maar mijn kennis is te beperkt om te achterhalen of er andere opties zijn om dit mogelijk te maken.
 
Maak geen gebruik van die namen maar van een directe verwijzing naar de juiste kolom op het blad Data.
Bijvoorbeeld zo:
Code:
Private Sub Proces_Change()
    Dim Kolom As String
    With Sheets("Data")
        Select Case Proces.Value
            Case "Generiek - Alg":      Kolom = "F"
            Case "Generiek - IB":       Kolom = "G"
            Case "Generiek - VA":       Kolom = "H"
            Case "Generiek - ZVW":      Kolom = "I"
            Case "IB Winst proces P":   Kolom = "J"
            Case "Woning - Alg":        Kolom = "K"
            Case "Woning - IB":         Kolom = "L"
            Case "Woning - IB W&R":     Kolom = "M"
            Case "Woning - VA":         Kolom = "N"
        End Select
        Subcategorie.Clear
        Subcategorie.List = Application.Transpose(.Columns(Kolom).Value)
    End With
End Sub
 
Maak geen gebruik van die namen maar van een directe verwijzing naar de juiste kolom op het blad Data.
Bijvoorbeeld zo:
Code:
Private Sub Proces_Change()
    Dim Kolom As String
    With Sheets("Data")
        Select Case Proces.Value
            Case "Generiek - Alg":      Kolom = "F"
            Case "Generiek - IB":       Kolom = "G"
            Case "Generiek - VA":       Kolom = "H"
            Case "Generiek - ZVW":      Kolom = "I"
            Case "IB Winst proces P":   Kolom = "J"
            Case "Woning - Alg":        Kolom = "K"
            Case "Woning - IB":         Kolom = "L"
            Case "Woning - IB W&R":     Kolom = "M"
            Case "Woning - VA":         Kolom = "N"
        End Select
        Subcategorie.Clear
        Subcategorie.List = Application.Transpose(.Columns(Kolom).Value)
    End With
End Sub

Ontzettend bedankt. Hiermee kom ik al een heel eind, maar nog niet exact zoals ik het zou willen. De eerste rij (in jouw code "Case "....") moet namelijk ook aanpasbaar zijn.

Voorbeeld. Als je nu Generiek - Alg kiest dan laadt hij rij "F" in de tweede listbox. Maar als een andere afdeling niet Generiek - Alg wil maar daar gewoon "Algemeen" van wil maken, dan moet hij nog steeds kolom "F" inladen.

Met de huidige code moet de case exact overeenkomen met wat wordt ingevuld. Eigenlijk wil ik die ook gewoon laten verwijzen naar een kolom, en niet zozeer de inhoud van de kolom.

Is dat mogelijk?
 
Zo bedoel je?
Maak een nieuw blad met de naam Lijsten.
Vul deze als volgt in kolommen A en B:
Code:
Proces	              Kolom
Generiek - Alg	        F
Algemeen	        F
Generiek - IB	        G
Generiek - VA	        H
Generiek - ZVW	        I
IB Winst proces P	J
Woning - Alg	        K
Woning - IB	        L
Woning - IB W&R	        M
Woning - VA	        N

En gebruik dan deze code:
Code:
Private Sub Proces_Change()
    Set c = Sheets("Lijsten").Range("A:A").Find(Proces.Value)
    If Not c Is Nothing Then
        Subcategorie.Clear
        Subcategorie.List = Application.Transpose(Sheets("Data").Columns(c.Offset(, 1).Value).Value)
    End If
End Sub
 
Laatst bewerkt:
Zo bedoel je?
Maak een nieuw blad met de naam Lijsten.
Vul deze als volgt in kolommen A en B:
Code:
Proces	              Kolom
Generiek - Alg	        F
Algemeen	        F
Generiek - IB	        G
Generiek - VA	        H
Generiek - ZVW	        I
IB Winst proces P	J
Woning - Alg	        K
Woning - IB	        L
Woning - IB W&R	        M
Woning - VA	        N

En gebruik dan deze code:
Code:
Private Sub Proces_Change()
    Set c = Sheets("Lijsten").Range("A:A").Find(Proces.Value)
    If Not c Is Nothing Then
        Subcategorie.Clear
        Subcategorie.List = Application.Transpose(Sheets("Data").Columns(c.Offset(, 1).Value).Value)
    End If
End Sub

Deze krijg ik helaas niet aan de praat. Is er een mogelijkheid dat je hem integreert in mijn voorbeeldbestand?
 
Dat is toch niet zo moeilijk?
Bekijk bijlage helpmijVR2.xlsm

Iets anders:
Gebruik de Reageer op bericht knop als je direct op een bericht reageert, niet de Quote knop.
 
Laatst bewerkt:
Ontzettend bedankt. We zijn er bijna. Vraag is of we nog 1 "quality of life" wijziging kunnen doorvoeren.

Het lukt mij nu om gewoon aanpassingen te doen in de processen met behoud van de userform. Exact waar ik naar op zoek wou.

Nog 1 vraagje. Wanneer je nu iets aanpast dan moet je de aanpassing op twee sheets doen (data & lijsten) om het werkend te houden. Ik heb geprobeerd om in 1 van de 2 sheets een verwijzing te doen naar de andere cel die dezelfde naam heeft.

Voorbeeld; In mijn voorbeeldbestand wat ik in dit bericht doorvoer wil ik het Proces "Scheiding" veranderen in "Uit elkaar gaan". Wanneer ik dit handmatig verander in beide sheets dan werkt het. Ik wil dit terugbrengen naar een wijziging in 1 sheet. Wat ik heb geprobeerd is om een verwijzing te zetten in soortgelijke cel. In mijn voorbeeld zou ik dan in cel Data;D10 de code "=Lijsten!A11" plaatsen. Hij zet dan dezelfde worden als =Lijsten!A11 in de cel. Echter werkt de userform dan niet meer naar behoren. De keuze staat dan niet meer in de listbox.

Is daar een workaround voor?

Mvg.
 

Bijlagen

De cellen in kolom D van het blad Data moeten dan allemaal een verwijzing zijn naar het blad Lijsten hebben.
Voor het vullen in de Initialize routine van het userform gebruik je dan niet:
.SpecialCells(2)

Maar:
.SpecialCells(xlCellTypeFormulas)
 
Laatst bewerkt:
Held! Zijn we er helemaal. Nogmaals bedankt dat je jouw tijd hierin hebt willen steken!
 
Graag gedaan :)

En het blad Lijsten kan je dan uiteraard verbergen.
Eventueel met:
Sheets("Lijsten").Visible = xlVeryHidden

Dan kan een gebruiker deze ook niet via de rechtermuisknop zichtbaar maken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan