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

Tafel indeling

Status
Niet open voor verdere reacties.
Heropening,

Ik ben destijds onwijs geholpen door cow18. Ik gebruik deze sheet met regelmaat. Ben er nog steeds blij mee. Maar na een aantal weken van gebruik toch nog een vraag of iets is aan te passen. De verdeling gebeurd zoals het moet zijn. Maar is het mogelijk om de plaats die leeg is toe te kennen aan welke stoel dan ook. Nu gebeurd dit vanaf stoel 10, 9, 8 enz. De verdeling moet blijven zoals die is. Dus het aantal lege plaatsen gelijkmatig verdelen over de tafels alleen niet vanaf plaats 10. Dit mag elke willekeurige plek zijn.
 
Laatst bewerkt:
Code:
Sub Tafelindeling()
  Dim Data, i As Integer, i1 As Integer, iTa As Integer, iSt As Integer, Loting, Dict As Object, arr(1 To 1, 1 To 4), iTafels As Integer, TafelStoel(), iDeelnemers As Integer, Tafels, Ten, Ten0, i2%, i3%, bOK As Boolean

  Dim LO       As ListObject
  For Each LO In Sheets("indeling").ListObjects
    LO.Range.AutoFilter
    LO.ShowAutoFilter = True
  Next

  iDeelnemers = Range("Totaal_aantal_deelnemers").Value
  If iDeelnemers <= 1 Then MsgBox "onvoldoende deelnemers om er een tabel van te maken": Exit Sub
  iTafels = Range("Totaal_aantal_tafels_indelen").Value
  ReDim Ten0(0 To 9): For i1 = 0 To UBound(Ten0): Ten0(i1) = Chr(i1 + 1): Next
  Data = Range("tabel2")                                   'lees je namen in
  Tafels = WorksheetFunction.Transpose(Range("tabel4").Resize(WorksheetFunction.Max(2, iTafels)))
  ReDim Loting(1 To UBound(Data))                          'maak een array met even veel elementen als namen
  ReDim TafelStoel(0 To 10, 0 To iTafels)                  'array met in de rijen de stoelen en in de kolommen de tafels

  Set Dict = CreateObject("scripting.dictionary")          'je dictionary aanmaken
  With Dict                                                'in die dicitionary
    For iSt = 0 To UBound(TafelStoel)
      For iTa = 0 To UBound(TafelStoel, 2)
        TafelStoel(iSt, iTa) = IIf(iTa > 0 And iSt > 0, "leeg", IIf(iTa > 0, "Tafel_" & Range("Tabel4").Cells(iTa, 1).Value, IIf(iSt > 0, "Stoel_" & iSt, "Tafelindeling")))  'zet overal "leeg" in behalve in de 1e rij, daar de tafelnamen en de 1e kolom de stoelnrs
        If iSt And iTa Then
          arr(1, 1) = "leeg"
          arr(1, 2) = "Tafel_" & Tafels(iTa)               'die zit aan deze tafel
          arr(1, 4) = iTa
          arr(1, 3) = iSt                                  'zijn stoel
          .Item((iTa - 1) * 10 + iSt) = arr                'toevoegen aan dictionary
        End If
      Next
    Next
    Randomize                                              'random-getallen-generator
    For i = 1 To UBound(Loting): Loting(i) = rnd: Next     'vul je array met random getallen

    iTa = 1: iSt = 1                                       'start bij tafel1 en stoel1
    For i = 1 To iDeelnemers                               'zoveel keer als er namen zijn
      arr(1, 2) = "Tafel_" & Tafels(iTa)                   'die zit aan deze tafel
      arr(1, 4) = iTa
      arr(1, 3) = iSt                                      'zijn stoel
      If i <= iDeelnemers Then
        i1 = WorksheetFunction.Match(WorksheetFunction.Small(Loting, i), Loting, 0)  'plaats van de zoveelste kleinste in je loting = willekeurige naam uit je lijstje
        arr(1, 1) = Data(i1, 1) & IIf(Len(Data(i1, 2)), " " & Data(i1, 2), "") & IIf(Len(Data(i1, 3)), " " & Data(i1, 3), "")  'zijn naam
        Ten = Ten0
        bOK = False
        Randomize
        Do
          i2 = rnd * UBound(Ten)
          i3 = Asc(Ten(i2))
          If TafelStoel(i3, iTa) = "leeg" Then
            arr(1, 3) = i3
            TafelStoel(i3, iTa) = arr(1, 1)
            .Item((iTa - 1) * 10 + i3) = arr
            bOK = True
          Else
            Ten = Filter(Ten, Ten(i2), 0)
          End If
        Loop While Not bOK And UBound(Ten) <> -1
      End If
      iTa = iTa + 1                                        'tafel 1 ophogen
      If iTa > iTafels Then iTa = 1: iSt = iSt + 1         'indien hoger dan aantal tafels, dan herbeginnen bij tafel1 en stoel 1 ophogen
    Next
  End With

  Application.ScreenUpdating = False
  With Range("Tabel3").ListObject                          'uitvoertabel
    If .ListRows.Count Then .DataBodyRange.Delete          'indien neit leeg dan leegmaken
    If Dict.Count Then                                     'indien er namen zijn
      .ListRows.Add.Range.Resize(Dict.Count, UBound(arr, 2)).Value = Application.Index(Dict.items, 0, 0)  'tabel aanvullen
      With .DataBodyRange
        .Sort .Range("D1"), key2:=.Range("C1"), Header:=True
      End With
    End If
  End With

  With Range("Tafel1_Stoel1")                              'vanaf deze plaats
    .Resize(1000, 10).ClearContents                        'eerst ruim genoeg leegmaken
    For i1 = 0 To (iTafels - 1) Step 5
      For i = 1 To WorksheetFunction.Min(5, iTafels - i1)
        .Offset((i1 \ 5) * (UBound(TafelStoel) + 5), (i - 1) * 2).Resize(1 + UBound(TafelStoel)).Value = Application.Index(TafelStoel, 0, 1)  'array wegschrijven
        .Offset((i1 \ 5) * (UBound(TafelStoel) + 5), i * 2 - 1).Resize(1 + UBound(TafelStoel)).Value = Application.Index(TafelStoel, 0, i1 + i + 1)  'array wegschrijven
      Next
    Next
    '.Resize(, 10).EntireColumn.AutoFit 'kolombreedte automatisch
  End With
End Sub
 
Beste Cow18,

Allereerst nogmaals hartelijk dank. Ik heb het wat uitgebreider uitgetest en een verschil ontdekt met de oude methode. ( Er is heel wat veranderd in de code). Bij de nieuwe methode worden in de kolom G:J minder ingedeeld dan in de oude situatie. Heb al gekeken maar weet niet hoe dit op te lossen. Kan jij er misschien naar kijken. Ik heb in het voorbeeld beide indelingen naast elkaar gezet.

Bvd

Bekijk bijlage indeling(1) (2).xlsm
 
Niemand die een oplossing kan bieden. Ik zelf heb het nog niet kunnen vinden omdat dit boven mijn pet gaat.

BvD
 
Laatst bewerkt:
zie bijlage
 

Bijlagen

wow!!!!

Geweldig.... Cow18 je bent de bovenste beste. Mijn hartelijke dank hiervoor.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan