Producten toevoegen op een werkblad middels getrapte keuzelijsten

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Beste,

Ik weet dat je via een formulier een lijst op een werkblad kunt aanvullen. Echter en voordat ik hier mijn vraag uitgebreid plaats, is het ook mogelijk om via een formulier deze lijsten aan te vullen als er een getrapte keuzelijst aanwezig is.

Bijvoorbeeld. Ik heb een materiaallijst die opgedeeld is in meerdere keuzelijsten. Iedere keuzelijst moet ik apart kunnen vullen. Het nieuw in te voeren product moet dan in het juiste keuzelijst worden geplaatst OP het werkblad!

Stel ik wil een onderdeel voor een groepenkast toevoegen in de materiaallijst. De zoekwaarde wordt via een combobox ingevoerd en is: Installatiekasten, vervolgens kan ik in een ander combobox een keuze voor het merk. Als dit gedaan is dan krijg ik in een derde combobox een keus: Groepenkasten, Klemmenkasten, Onderdelen etc.

Ik zie dat er in de lijst van onderdelen een product mist en wat ik dan wil toevoegen. Ik kan nu kiezen om dit op het werkblad zelf te doen, maar wil dit graag doen via een formulier die het product dan in de juiste keuzelijst erbij plaatst OP het werkblad.

Is dit te realiseren. Ik vind er namelijk niet echt iets over dan enkel bijvoorbeeld Combobox1.Add, maar volgens mij is dat niet de oplossing.
 
Helemaal niemand. Ik mag er dus vanuit gaan dat mijn gestelde niet kan.

Het gaat mij er nu alleen even om of het wel kan. Niet direct om een voorzetje te krijgen.
 
Zonder een voorbeeld-bestand zijn er sowieso weinig helpers die er trek in hebben om het na te bouwen.
Ook als het daarna niet goed uitgelegd is haken de meesten ook af (waaronder ik ook val).
 
Weet ik. Maar het gaat mij er nu hoofdzakelijk om of dit wel of niet kan. Als het kan dan maak ik een voorbeeld bestand.

Gewoon JA of NEE. Bij JA volgt een voorbeeldbestandje. Anders doe ik deze moeite voor niets, want op internet zelf kom ik er weinig tot niet uit.
 
Je moet anders gaan denken.
Je weet dat er heel veel mogelijk is, dat heb jezelf vaak ondervonden, maar als jij al geen moeite wil doen, dan de helpers al helemaal niet.
Jij wil geholpen worden, dus moet jij je best doen dat je het aantrekkelijk maakt voor de helpers.
 
Langdradig antwoord voor JA :thumb:.

Ik zal een voorbeeld plaatsen.

Bedankt
 
Laatst bewerkt:
Laat maar, ik heb al geen interesse meer.
Misschien doe je het toch voor andere helpers, maar ik haak af.
 
Ik begrijp dat je niet zag dat ik blij was met je antwoord. Ik heb zojuist het emoticon erbij gezet.

Sorry als het daardoor verkeerd bij je overkwam.

Als je alsnog bij je besluit blijft. Geen probleem en no hard feelings.


Het voorbeeldbestandje uit de vorige vraag:
Bekijk bijlage 229881
 
Laatst bewerkt door een moderator:
Hier het voorbeeldbestand. In de code van het Userform heb ik bij Cb_Invoer summier beschreven wat de bedoeling is. Ik hoop dat iemand mij kan helpen. Tevens wil ik de lege cellen in de combobox, welke ontstaan vanuit het werkblad, niet laten meenemen. Ik heb getracht dit voor elkaar te krijgen, maar enkel in 1 sub krijg ik dit voor elkaar.

Alvast bedankt voor de medewerking.

HSV ik hoop dat toch ook jij mij wilt helpen. Omdat jij min of meer aangaf dat het mogelijk moet zijn, heb ik het voorbeeldbestand gemaakt en geplaatst.

Voorbeeldbestand: Bekijk bijlage Combobox.xlsm
 
Laatst bewerkt:
Maarten,

Ik ben de beroerdste niet, want als ik geen oplossing zag had ik niet gereageerd.
Hier de comboboxen zonder lege en dubbele regels.
Belangrijk is dat de eerste twee kolommen volledig aangevuld zijn zonder lege regels.
Open het Form; vul wat gegevens in en druk op 'Invoeren'.

Oh ja, als je een combobox vergeet in te vullen merk je het vanzelf.
 

Bijlagen

  • masala09.xlsm
    32,7 KB · Weergaven: 44
HSV. Hartelijk bedankt voor het volledig teniet doen van mijn code :confused: Zat ik dan zo ver naast, of heb jij hem op jouw manier geschreven? (Goed bedoeld hoor (haha))

Ik probeer de code nu uit te pluizen en heb er een beetje mijn indeling van gemaakt om deze een beetje meer leesbaar te maken, maar snap er eerlijk gezegd weinig van. Er staan zaken in die ik niet ken.

Gebruik jij wel alle lijsten die ik heb aangemaakt?
Jij gebruikt om lijsten in comboboxen in getrapte vorm samen te voegen met het .keys?
Arr, ik neem aan dat jij hier array mee bedoelt?

De With CreateObject("scripting.dictionary")
.CompareMode = vbTextCompare

Is dit het gedeelte waar gelijke waarden in de lijsten worden verwijderd en dus dat hiermee enkel de ongelijke waarde worden getoond?

Verder enkele opmerkingen:

Ik zag inderdaad dat je een bericht laat opkomen op het moment dat er iets niet is ingevuld en ook dat comboboxen leeg worden gemaakt indien ik een voorgaande combobox wijzig. Dat had ik ook in gedachten, maar vond ik voor het voorbeeld niet echt belangrijk, toch doe het net een tikkeltje anders, maar daar heb ik wel inzicht in. Dat stuk dat begrijp ik.

Wat mij tevens op valt en dat vind ik wel erg irritant is dat zodra ik iets invoer.
In eerste instantie voor invoeren staat bijvoorbeeld in de eerste kolom Installatiekasten boven aan de lijst. Na bijvoorbeeld iets te hebben toegevoegd in Installatiekasten dan zie ik dat de eerste kolom met gevolg naar volledig onder aan alle lijsten is verplaatst. Daarbij verandert ook de volgorde in mijn keuzelijst in de combobox. Hier ben ik echter niet zo blij mee. Ik ben wat dat aangaat een control freak en ben tevens pietje precies. Ik wil geen veranderingen in mijn lijst zien zodra ik iets toevoeg. Dit omdat ik er voor mijzelf een bepaalde volgorde in heb gebracht voor eventueel handmatig terugzoeken. Nu heb ik wel een zoekformulier gemaakt, maar nu gaat straks alles door elkaar staan.

Ik hoor het wel. Het ziet er heel goed uit in ieder geval en doet merendeel wel wat ik wil.

Bedankt daarvoor.
 
Laatst bewerkt:
Ik weet dat je een pietje precies bent, je verhalen zijn daar getuige van.

Een control freak heeft alleen maar belang bij makkelijk zoeken.
Er is niets moeilijks aan alfabetisch zoeken, dus gooi je eigen volgorde aan de kant.
Je eerste drie kolommen worden alfabetisch gesorteerd, je comboboxen staan gesorteerd, hoe kan iemand zich een freak noemen als dit niet goed bevonden wordt.

Tip: Plaats filters voor het zoeken.

Ken je de rijdende rechter en zijn uitspraak aan het eind?, "Dit is mijn uitspraak, en daar zult u het mee moeten doen".

Ps. Misschien is er nog iemand die het veranderen wil.
 
Hmmm ik was een beetje voorbarig Harry. Ik geloof, weet eigenlijk wel zeker, dat hier een welgemeend excuus van mijn kant naar jou toe behoorlijk op zijn plaats is. Dus bij deze mijn excuus.

Ik zag pas later met een beetje spelen dat de boel alfabetisch wordt gesorteerd en dat het daarna zo blijft. Ook had ik voordat ik ging testen de zaken een beetje omgezet en lege rijen verwijderd. Daarna ben ik eigenlijk verder gaan spelen met jouw aanpassingen. Toen zag ik dingen gebeuren waarvan ik even niet begreep wat er gebeurde. Ook werd er soms niet gesorteerd en kwam het gewoon ergens onder te staan. Nadat ik alles had aangepast en een beetje in terugkoppeling hier opnieuw wilde plaatsen... zag ik wat ik net over het hoofd zag en waar jij mij voor in was met antwoorden.

Jouw code werkt dus gewoon perfect en doet juist WEL degelijk wat ik wil doen. Blijven enkel mijn vragen staan die ik had gesteld in bericht: 11.

Een zoekfilter had ik al eerder gemaakt in deze lijst. Alleen voor hier had ik hem niet gebruikt omdat dit slechts een voorbeeld bestand betreft.

Al met al schaam ik mij er nu best wel voor dat ik wellicht voor jouw gevoel, jouw werk en inzet "afkraakte" terwijl ik zelf eerst aanpassingen ging maken en pas later zag wat er werkelijk gebeurde. Deze wijze van sorteren is helemaal mooi en maakt de zaken juist overzichtelijker. Van deze manier ben ik enkel maar voorstander en het helpt beter met eventueel handmatig zoeken. Door deze simpele toevoeging heb je mij zelfs extra werk en tijd afgenomen omdat ik dit feitelijk al van plan was, maar dan op een handmatige manier.

Waar doe jij dan het alfabetisch sorteren in jouw gemaakte code vraag ik mij dan af en doet deze dat straks met mijn gehele lijst die vele malen langer dan dit is?

Mijn dank en hier weer opnieuw het bestand met een kleine aanpassing in de code voor het legen van alle combo- en textboxen.
Ook zie je waar het in eerste fout ging. Ik had namelijk de rijen waar ik eerst van dacht dat het verkeerd ging, blauw gekleurd. Later gingen deze dus op de plek staan waar ze moesten staan.
 

Bijlagen

  • masala09.xlsm
    31,9 KB · Weergaven: 46
  • masala09.xlsm
    34,9 KB · Weergaven: 35
Laatst bewerkt:
Harry aanvulling op jouw werk. Je hebt mij zelfs nog meer werk uit handen genomen, merk ik op. Als ik in extra keuzes wil hebben in de comboboxen omdat er bijvoorbeeld een merk bij komt.... dan merk ik dat ik gewoon dit in de Comboboxen handmatig kan invullen en dat zelfs ook dit na opslaan in de comboxen wordt meegenomen en dat ik dus feitelijk gezien nooit meer in de lijst hoef te komen...... Daarom was voor mij die indeling die ik eerst had gemaakt zo ontzettend belangrijk om later eventueel iets toe te voegen in de keuzelijsten.... Ook hier hoef ik dus niet meer naar om te kijken, want ook dat zit in de code.

Al met al ik kan dit zo in het werkelijke blad invoeren, want wijzigingen zijn er niet of nauwelijks te maken dan behalve aan de onderzijde van het formulier, mocht daar iets moeten komen te staan, het maken van de randen om de cellen heen. Heb ik zelf opgelost.

Het aangepast voorbeeldbestand:

Bekijk bijlage masala09.xlsm
 
Laatst bewerkt:
Ik heb de code aangepast met een 4e Combobox. Ik zag bij de For Loop dat er achter Ubound(arr) -1 staat. Wat doet deze -1. Als ik deze weglaat dan zie ik op het oog geen verandering.

De totale code is tot nu toe:

Code:
Private Sub UserForm_Initialize()
    Set Geg = Sheets("Materiaallijst")
    arr = Geg.Columns(1).CurrentRegion.Offset(1)
    
    With CreateObject("scripting.dictionary")
        .CompareMode = vbTextCompare
        
        For i = 1 To UBound(arr) - 1
            .Item(arr(i, 1)) = arr(i, 1)
        Next
        
        Combo_Zoek.List = .keys
    End With
    
    Set Geg = Nothing
End Sub

Private Sub Combo_Zoek_Change()
    Combo_Keuze = ""
    Combo_Merk = ""
    Combo_Test = ""
    
    Set Geg = Sheets("Materiaallijst")
    arr = Geg.Cells(1).CurrentRegion.Offset(1)

    With CreateObject("scripting.dictionary")
        .CompareMode = vbTextCompare
            
        For i = 1 To UBound(arr) - 1
            If arr(i, 1) = Combo_Zoek And arr(i, 2) <> vbNullString Then
                .Item(arr(i, 2)) = arr(i, 2)
            End If
        Next
            
        Combo_Keuze.List = .keys
    End With
    
    Set Geg = Nothing
    
End Sub
Private Sub Combo_Keuze_Change()
    Combo_Merk = ""
    Combo_Test = ""
    
    Set Geg = Sheets("Materiaallijst")
    arr = Geg.Cells(1).CurrentRegion.Offset(1)
    
    With CreateObject("scripting.dictionary")
        .CompareMode = vbTextCompare
        
        For i = 1 To UBound(arr) - 1
            If arr(i, 1) & arr(i, 2) = Combo_Zoek & Combo_Keuze And arr(i, 3) <> vbNullString Then
                .Item(arr(i, 3)) = arr(i, 3)
            End If
        Next
    
        Combo_Merk.List = .keys
    End With
    
    Set Geg = Nothing
    
End Sub
Private Sub Combo_Merk_Change()
    Combo_Test = ""

    Set Geg = Sheets("Materiaallijst")
    arr = Geg.Cells(1).CurrentRegion.Offset(1)
    
    With CreateObject("scripting.dictionary")
        .CompareMode = vbTextCompare
        
        For i = 1 To UBound(arr)
            If arr(i, 1) & arr(i, 2) & arr(i, 3) = Combo_Zoek & Combo_Keuze & Combo_Merk And arr(i, 4) _
                <> vbNullString Then .Item(arr(i, 4)) = arr(i, 4)
            End If
        Next
    
        Combo_Test.List = .keys
    End With
    
    Set Geg = Nothing
    
End Sub

Private Sub Cb_Invoeren_Click()
    If Combo_Zoek = vbNullString Then
        MsgBox ("U dient een Zoekwaarde in te geven"), vbInformation, "Zoekwaarde"
        Combo_Zoek.SetFocus
        Exit Sub
    End If
    
    If Combo_Keuze = vbNullString Then
        MsgBox ("U dient een Keuze in te geven"), vbInformation, "Merk"
        Combo_Merk.SetFocus
        Exit Sub
    End If
    
    If Combo_Merk = vbNullString Then
        MsgBox ("U dient een Merk in te geven"), vbInformation, "Keuze"
        Combo_Keuze.SetFocus
        Exit Sub
    End If
    
    If Combo_Test = vbNullString Then
        MsgBox ("U dient een waarde in te geven"), vbInformation, "Test"
        Combo_Test.SetFocus
        Exit Sub
        
    With Sheets("Materiaallijst")
        .Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 13). _
            Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'Rij onder werkblad invoegen
        .Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 11) _
            = Array(Combo_Zoek, Combo_Keuze, Combo_Merk, TextBox1, _
            TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8) 'Product invoegen
        .Cells(1).CurrentRegion.Sort .[A2], , .[B2], , , .[C2], , xlGuess 'Product invoegen in juiste lijst
    End With
    
    Cb_Opnieuw_Click
    
    Select Case MsgBox("Product is aan de lijst toegevoegd." _
            & vbNewLine & vbNewLine & "Wilt u nog een product invoeren?", _
            vbYesNo + vbInformation, "Product toegevoegd")
        Case Is = vbYes
            Combo_Zoek.SetFocus
        Case Is = vbNo
            Cb_Sluiten_Click
    End Select
    
End Sub

Private Sub Cb_Opnieuw_Click()
    For Each ctl In Me.Controls
        If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then ctl.Value = vbNullString
    Next

End Sub

Private Sub Cb_Sluiten_Click()
    Unload Me

End Sub

De Combo_Test is een tijdelijke naam. Deze wordt straks definitief ingevuld. Dit omdat ik het besloten een aantal keuzes erbij te plaatsen.

Toch alsnog bedankt voor diegene die de moeite doet.

Aanvulling. Ik krijg nu sinds dat ik deze code gebruik in Initialize dat de typen niet overeenkomen zodra ik de -1 laat staan. Haal ik deze weg dan gaat de code door. Dit bevreemd mij daar dit wel werkte toen ik Combo_Keuze niet had toegevoegd.
 
Laatst bewerkt:
Maarten, loop je de code wel eens door met F8.
Zet met F9 ergens een controlepunt in de VBeditor.
De code begint op A2 met:
Code:
arr = Geg.Cells(1).CurrentRegion.Offset(1)
Ubound(arr) = 55
Je laatste cel in het werkblad is 55.
Van 2 tot 55 = 54
For i = 1 to Ubound(arr)-1 = ?????

Je zit nu dus een lege cel controleren op rij 56.
Daar er een controle inzit merk je er toevallig nu niets van. :)
Code:
And arr(i, 2) <> vbNullString
 
Hai HSV. Ik probeer die code ook helemaal uit te pluizen van jou. Ik begrijp er tot nu toe weinig van. Dat maakt het aanbrengen van een wijziging ook iets lastiger. Ik wil in deze niet meteen de boel er weer in gooien, maar het met deze voorzet weer zelf uit zoeken. Al heb ik nu weer iets dat ik de 4e kolom indien deze leeg is, kolom 5 moet kiezen. Ik kwam er achter dat ik een keuze mis en soms staat er in die keuze niets. Echter wat ik van jou begreep is dat er altijd iets moet zijn ingevuld.

Ik heb de -1 weggelaten en nu begrijp ik nog steeds niet waarom. Ik heb nog niet met UBound gewerkt. Alsmede andere sleutelwoorden die jij in jouw code gebruikt. Dat brengt mij weer even van de wijs. Vandaar dat ik wil weten waar wat gebeurd.

Aangezien ik de 4e combobox, tijdelijk genaamd Test, werkend heb gekregen en het geen louter toeval betreft, dacht ik dat ik het langzaam begon te begrijpen. Echter daar ik een wijziging wil aanbrengen als kolom 4 leeg is dat dan automatisch kolom 5 gebruikt moet worden en dan ook nog op de manier hoe de kolommen zonder deze extra combobox eerder met elkaar "communiceren" heb ik hem dus toch niet door omdat ik het niet voor elkaar krijg.

Vandaar ook mijn eerder vragen in post 11. Niet dat ik dan antwoord heb op waar ik nu mee bezig ben, maar ik vermoed dat het wel enige duidelijkheid geeft om weer verder te kunnen.

Er moet dus ook nog een voorwaarde inkomen te staan dat zodra kolom 4 leeg is, automatisch kolom 5 wordt gekozen en dan naar zoekopdrachten volgens hetgeen wat bekend is. Dat probeer ik nu uit te vinden.....

In mijn huidig bestand, het originele in modus test dan, is mijn laatste regel alweer 309. Dat min 1. Dus laatste cel volgens Ubound zou in deze betekenen?? UBound (arr)=309

Maar waarom werkte de -1 in jouw code eerst wel en in de mijne ineens niet meer. Of heb ik misschien zelf iets aangepast waar ik overheen kijk?
 
Laatst bewerkt:
De -1 moet je mooi laten staan, de code loopt zonder -1 cel 56 af waar geen gegevens staan.
Dus de code loopt daar voor niets langs.

Wat betreft je vraag begrijp ik niet.
Bedoel je dit waar het wordt weggeschreven?
Code:
.Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 11) _
            = Array(Combo_Zoek, Combo_Keuze, Combo_Merk, TextBox1, _
            TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8) 'Product invoegen
veranderen in:
Code:
.Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 1[COLOR=#FF0000]2[/COLOR]) _
            = Array(Combo_Zoek, Combo_Keuze, Combo_Merk, [COLOR=#FF0000]c[/COLOR][COLOR=#FF0000]ombo_test, [/COLOR]TextBox1, _
            TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8) 'Product invoegen
 
Nee niet het wegschrijven... tenzij het met wegschrijven te maken heeft. Zover was ik nog niet namelijk. Ik probeer eerst die comboboxen datgene te laten doen wat ik wil doen.

Ik doe hem er toch even opnieuw bij. Misschien begrijp je het dan iets beter.

Met -1 krijg ik het bestand in ieder geval niet meer werkend. Typen komen niet overeen.

Voor het andere bedoel ik.

Als kolom D leeg is, zoals ook alle cellen in Kolom D in het voorbeeld, dan moet kolom E gekozen worden en dan uit de waarden die bekend zijn.

Het kan ook zijn dat ik een stap te ver vooruit zit te denken.

In kolom D is het straks de bedoeling dat voor sommige Merken er nog verschil in kan zitten met inbouw of bijvoorbeeld opbouw, Dikte draad etc. Zeg maar aanvullende voorwaarden om te zoeken als er in de omschrijving verschillen zitten.

Bijvoorbeeld.
Kolom A =Buisbevestigingsmateriaal, Kolom B = Buiszadelklem, Kolom C = MEPAC. Nu is Kolom D gevuld met Transparant etc. Hier dient dan combo_Test mee ingevuld te worden, maar als zoals bij JMV kolom D niet is gevuld dan moet alles van Buiszadelklem van JMV in de combo_Test komen.

Dat stukje probeer ik nu dus te verwezenlijken, maar omdat ik de code niet helemaal door heb, lukt het mij dus niet en ben ik met de code aan het spelen om deze wel te begrijpen.



Bekijk bijlage Materiaal TU macrotest_3 Combo.xlsm
 
Ik leg het mijn vrouw denk ik zelfs nog beter uit.

Dit staat niet in het voorbeeld.

Stel ik wil van het merk PEHA, de stopcontacten hebben. Ik heb de stopcontacten in bijvoorbeeld 2 kleuren. Deze kleuren staan dan in kolom D. Als ik niets kies, dan worden alle stopcontacten getoond zowel wit als creme. Kies ik in kolom D wit dan moeten enkel de witte getoond worden, kies ik dan voor creme dan moeten enkel de creme getoond worden. Stel ik heb geen keuze in D en die cel is dan leeg, dan moeten zowel de witte als ook de cremekleurige worden getoond. :confused: Ik neem nog een biertje......
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan