[Excel VBA] WorksheetFunction.Min met variabele invoer?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Da_maniaC
  • Registratie: September 2004
  • Laatst online: 16-09 20:12

Da_maniaC

a.k.a. The Sequenz Pounder

Topicstarter
Hallo,

Ik ben bezig om een tooltje te maken in VBA maar ik loop nog vast op 1 functie.
In het verleden had ik ooit eens een tool gemaakt die wat Magazijn handelingen kon registreren en werden er wat werkzaamheden uitgevoerd waarbij er altijd een omstapeling plaats vond van 5 pallets met goederen naar 5 gemixte pallets (van iedere pallet steeds 1 tray goederen).

Nu zijn hier wat variaties op gekomen waardoor ik niet altijd van 5 pallets uit kan gaan. Sommige variaties hebben slechts 2, 3 of 4 pallets.
Mijn gehele tool heb ik hier vrijwel op aangepast.

Ik loop echter nog vast bij de volgende routine:

Ik stap deze routine in waarbij diverse waardes/variabelen al bekend zijn (vanuit een UserForm).

THT1 = 210630
THT2 = 210630
THT3 = 210530
THT4 = ""
THT5 = ""

code:
1
FinalTHT = WorksheetFunction.Min(THT1, THT2, THT3, THT4, THT5)


In de oude situatie waren altijd alle 5 de THT waardes gevuld en kreeg ik een kloppende uitkomst.
Nu zijn de waardes THT3, THT4 of THT5 soms leeg.

Ik heb getracht om hier wat op te bedenken. Een dynamische Array die zich vult aan de hand van
de invoer. Met een extra argument om het aantal (1, 2, 3, 4 of 5 stuks) vooraf kenbaar te maken.
Ik kwam hier vervolgens op de volgende code uit:

Als ik de routine in stap zijn de volgende waardes/variabelen al bekend:

AantalPallets = 3
THT1 = 210630
THT2 = 210630
THT3 = 210530
THT4 = ""
THT5 = ""

De waardes THT4 en THT5 zouden dus niet hoeven te worden meegenomen. Dan werkt de .Min (Minimum) functie niet goed.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim THTArray() As Variant
Dim X As Long

X = 1

ReDim THTArray(1 To AantalPallets)

For X = 1 To AantalPallets

THTArray(X) = THT & X

Next X

FinalTHT = WorksheetFunction.Min(THTArray)


Toch gaat hier ergens iets nog niet goed. Mijn uitkomst is telkens "0".

Doe ik nog iets verkeerd in mijn code? Of is mijn aanpak onhandig? Ik krijg de oorzaak niet gevonden! :)

----------

Zojuist nog wat meer getest.

Als ik nu het volgende toevoeg aan de routine:

code:
1
 Debug.Print Join(THTArray, ", ")


Krijg ik als uitkomst: "1, 2, 3".
Ik had verwacht dat hier eigenlijk de waarde van de variabelen: THT1, THT2 en THT3 zou komen te staan! :?

[ Voor 7% gewijzigd door Da_maniaC op 18-01-2022 10:25 ]

Inventory | Instagram: @sequenzpounder | http://www.zdaemon.org | ZDaemon! Client/Server port for DOOM!

Beste antwoord (via Da_maniaC op 18-01-2022 20:53)


  • pporrio
  • Registratie: Februari 2010
  • Laatst online: 21:55
De code gaat fout omdat de lege waarden worden gezien als 0.
Misschien AantalPallets opnemen in een Select statement en zo afhankelijk van het aantal pallets de formule aanpassen:
code:
1
2
3
4
5
6
7
8
9
Select Case AantalPallets
  
    Case 5
      FinalTHT = WorksheetFunction.Min(THT1, THT2, THT3, THT4, THT5)
    
    Case 3
      FinalTHT = WorksheetFunction.Min(THT1, THT2, THT3)
  
End Select

Mijn platencollectie

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • pporrio
  • Registratie: Februari 2010
  • Laatst online: 21:55
De code gaat fout omdat de lege waarden worden gezien als 0.
Misschien AantalPallets opnemen in een Select statement en zo afhankelijk van het aantal pallets de formule aanpassen:
code:
1
2
3
4
5
6
7
8
9
Select Case AantalPallets
  
    Case 5
      FinalTHT = WorksheetFunction.Min(THT1, THT2, THT3, THT4, THT5)
    
    Case 3
      FinalTHT = WorksheetFunction.Min(THT1, THT2, THT3)
  
End Select

Mijn platencollectie


Acties:
  • +1 Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
X = 1 kan achterwege blijven, want je begint de for-nextlus al met x = 1.
Je hebt alleen X gedeclareerd, doe dat ook met AantalPallets en THT en geef die een (begin)waarde (moeten getallen zijn).
En als je de array met 1 wil beginnen dan moet je (boven de macro) vermelden: Option Base 1

Acties:
  • +1 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Makkelijker, loopje: kleinste = eerste waarde. Voor elke volgende waarde: als nul: next, anders kleinste = min(kleinste, waarde (i)).

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • +1 Henk 'm!

  • Da_maniaC
  • Registratie: September 2004
  • Laatst online: 16-09 20:12

Da_maniaC

a.k.a. The Sequenz Pounder

Topicstarter
Allen bedankt voor de uitleg/input.
Ik heb uiteindelijk maar gekozen om de "array" los te laten en hier een Case selectie van te maken. Werkt prima! :)

Inventory | Instagram: @sequenzpounder | http://www.zdaemon.org | ZDaemon! Client/Server port for DOOM!