• 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 om combinatie van letters te bepalen

Status
Niet open voor verdere reacties.

richard1970

Terugkerende gebruiker
Lid geworden
12 mei 2005
Berichten
2.660
Hoi,

In een model dat ik aan het maken ben heb ik elf cellen: A1 t/m K1.
Hierin moeten de letters A, B, C, D, E, F, G, H, I, J en K komen te staan in een willekeurige volgorde.
In L2 controleer ik of er 11 verschillende letters staan in de elf cellen. In cel L1 volgt na diverse controleberekeningen het cijfer 0 (fout) of 1 (goed). Bij goed is een juiste combinatie gevonden die ik wil weten.
Ik gebruik nu een hulptabel met de cijfers 1 t.m. 11 en daarnaast de letters A t.m. K, en in de cellen A1 t.m. K1 staat de formule:
Code:
=VERT.ZOEKEN(ASELECTTUSSEN(1;11);$O$1:$P$11;2;0)

Er is altijd minimaal één goede combinatie van letters mogelijk.

In VBA heb ik staan:
Code:
Sub test()
    Do Until Sheets("test").Range("L1").Value = 1
    Calculate
    Range("M2").Value = Range("M2").Value + 1
    Loop
End Sub

Na iedere controle of in L1 een 0 of 1 staat, bepaalt via het commando Calculate de functie ASELECTTUSSEN een nieuwe waarde.

Het vervelende is nu dat ik 11 cellen heb met 11 mogelijke waardes wat resulteert in meer dan 285.mld combinaties. Met vier processoren en 6 Gb intern geheugen, duurt het nu bijna 1 seconde per berekening. Dat zit 'm in de controleberekeningen en die kunnen niet eenvoudiger. Maar op deze manier duurt het te lang en dat moet slimmer kunnen. Zes cellen met de letters A, B, C, D, E en F ging nog wel.

Kan dit met VBA opgelost worden , of met slimmere formules? Want als in A1 de letter A staat, hoeft in de overige tien cellen de A niet meer komen te staan.
En een tweede vraag. Hoe stop ik de macro als het me te lang duurt? Vroeger gebruikte in Ctrl+Break, maar ik zie op dit toetsenbord nergens een Break staan.

Richard
 

Bijlagen

  • combinaties.xlsm
    15,2 KB · Weergaven: 27
Hallo Richard,

Volgens mij hebben we ooit een verbaal bostsingetje gehad maar ook ik ben wel aardig:d

Hoe stop ik de macro als het me te lang duurt? Vroeger gebruikte in Ctrl+Break, maar ik zie op dit toetsenbord nergens een Break staan.

Met een paar keer op <Esc> drukken stopt bij mij in iedergeval de code. Wel met een foutmelding maar dat mag de pret niet drukken toch?

Ik begrijp niet helemaal wat je met jouw vraag wil
In L2 controleer ik of er 11 verschillende letters staan in de elf cellen
Door een beetje te <F9>en krijg in jouw voorbeeldje soms dezelfde letters. Wil je iets van als de A vergeven is dan mag deze niet meer voorkomen in de rest van de cellen of wil je een aselect die alle letters binnen de opgegeven range in de volgende cellen zet?
 
gewoon met formules, zie bijlage, kans op gelijke letters ongeveer 1e-14
 

Bijlagen

  • combinaties(1).xlsm
    13 KB · Weergaven: 48
@Cow18: ga ik vanavond proberen. Ziet er goed uit.
@VenA: Ik ben kort van geheugen denk ik :) Het is de bedoeling dat de elf verschillende letters allemaal in de elf cellen komen. Dus iedere letter één keer. En dat lukt met de formules van cow18.
 
cow18 heel mooi:thumb:

richard1970 ik heb vragen over L1 en L2 :
vraag L1: die "A" en die "H"
Code:
=ALS(EN(A1="A";B1="H";AANTALARG(A1:K1)=11;L2=11);1;0)
vraagL2: waar om doe je 1/..... in je formule
Code:
=SOM(1/AANTAL.ALS(A1:K1;A1:K1))
als je 1/ weg laat werkt het toch ook?
ik ben heel benieuwd .

Code:
 
Laatst bewerkt:
Kan dat niet simpeler (zonder tabel) met:

in A1:

=CHAR(64+RANK(A$2;$A$2:$K$2))

doortrekken naar K1

Verdere controle is overbodig.
 
@VenA: Esc ingedrukt houden werkt. thnx.
@SNB, Jouw functie werkt prima. Bedankt voor het meedenken. Maar na de letter Z ga ik door met AA en dan werkt TEKEN niet meer.
@Sylvester-ponte. Klopt helemaal. En met de functie van cow18 heb ik de controle van 11 verschillende getallen ook niet nodig.

Iedereen bedankt voor het meedenken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan