Tijdverschil berekenen tussen twee dezelfde waardes in een kolom

Status
Niet open voor verdere reacties.

xsteps

Nieuwe gebruiker
Lid geworden
21 feb 2017
Berichten
3
Hallo allemaal,

Voor een opdracht probeer ik een VBA script te schrijven. In de bijlage vindt u de gegeven informatie.
Ik wil graag weten wat het verschil in tijd (Date) is tussen twee dezelfde kaartnummers (CardNr). Wat ik wil programeren is als volgt:

In kolom B staan allemaal verschillende kaartnummers. Mijn eerste opdracht is om voor elk kaartnummer in de kolom te zoeken wanneer het volgende kaartnummer voorkomt. Wanneer deze is gevonden wil ik de tijden, gegeven in kolom A, van elkaar aftrekken om zo het tijdverschil te berekenen.
Hierna ga je door met het volgende kaartnummer in kolom B, tot dat alle tijdverschillen zijn berekend.

Het kan voorkomen dat een kaartnummer meer dan twee keer voorkomt in de kolom. Mijn idee is dat ik de eerste twee met elkaar vergelijk en dan de volgende twee met elkaar vergelijk. Het kan ook voorkomen dat er een kaartnummer maar een keer in voorkomt. In dat geval hoeft er geen tijdsverschil berekend te worden.

Ik kom hier niet uit en weet niet hoe ik dit moet programmeren. Heeft iemand tips?

Alvast bedankt!
 

Bijlagen

  • Data 1-1 tm 3-1.xlsx
    93,9 KB · Weergaven: 40
Sorteren op kolom "B" en een heel simpele formule in een nieuwe kolom geeft je al 99% het antwoord. Wat is het voordeel om dit anders op te lossen? Natuurlijk je kunt het volledig programmatisch oplossen, maar dan kan je in dit geval net zo goed geen excel gebruiken.
 
Bedankt voor de tip. Het kan inderdaad ook op deze manier opgelost worden.
De reden waarom ik het wil programmeren is omdat ik veel meer data wil bekijken. Dit is data van een week en ik wil het bekijken voor 3 maanden.
 
Uhm, ja? Je kan uiteraard het gevonden resultaat verder bewerken met VBA, maar VBA is helaas niet zo geschikt voor intensieve in-memory data verwerking. Als je dat toch wil ben je vaker beter af met het importeren van de vbscript collections class om de data te verwerken. Maar over het algemeen ben je beter af om excel's eigen kracht zoveel mogelijk te gebruiken en daarna eventuele missende stappen toe te voegen met VBA
 
Bedankt voor deze informatie. Dan ga ik het op die manier proberen. Bedankt voor uw tijd.
 
Ik ben wat minder pessimistisch:

Code:
Sub M_snb()
  sn = Sheet1.Cells(1).CurrentRegion
   
  With CreateObject("scripting.dictionary")
    For j = 2 To UBound(sn)
      If .exists(sn(j, 2)) Then sn(j, 1) = Application.Max(sn(j, 1), .Item(sn(j, 2))) - Application.Min(sn(j, 1), .Item(sn(j, 2)))
      .Item(sn(j, 2)) = sn(j, 1)
    Next
     
    sheet1.Cells(1, 4).Resize(.Count, 2) = Application.Transpose(Array(.keys, .items))
  End With
End Sub
 
en prompt maak je gebruik van de scripting.dictionary class zoals ik al suggereerde :p

Ik ben overigens niet pessimistisch, als je net begint met VBA zijn dit soort oplossingen heel moeilijk om te bevatten en te gebruiken. Zonder de 32bit classes geïntroduceerd met vbscript en .NET is VBA zeer lastig in gebruik voor grote datasets.
 
@wamp

De system.collections class is toch echt een andere bibliotheek dan de scripting.runtime.
Het gebruik van scripting.filesystemobject en scripting.dictionary heeft niets met vbscript en .NET van doen.
Hoe eenvoudig (eenvouidger dan de in VBA ingebouwde 'Collection') het is om in VBA met een dictionary te werken zie je hier:

http://www.snb-vba.eu/VBA_Dictionary.html
 
Hiermee krijg iets andere resultaten.
Code:
Sub hsv()
Dim sn, i As Long, ii As Long
Application.ScreenUpdating = False
sn = Cells(1).CurrentRegion.Resize(, 3)
Columns(3).ClearContents
For i = 2 To UBound(sn)
   For ii = i + 1 To UBound(sn)
       If sn(i, 2) = sn(ii, 2) Then sn(i, 3) = sn(ii, 1) - sn(i, 1)
   Next ii
 Next i
 Cells(1).Resize(UBound(sn), 3) = sn
 Columns(3).NumberFormat = "[h]:mm"
End Sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan