csv Log vraagje

Gewoon even offtopic praten over van alles en nog wat.

Moderator: Moderators

Gebruikersavatar
Rocnc
Berichten: 312
Lid geworden op: 02 dec 2008 20:39

Re: csv Log vraagje

Bericht door Rocnc »

1 oktober is inmiddels gepasseerd. Ik heb geen vrij meer. In tegendeel. Ik heb het dik naar mijn zin met werk. Maar ik vind dit nog steeds een leuk klusje. Als je nog wat geduld hebt, dan kan ik er komend weekend nog eens naar kijken.
Progress isn't made by early risers. It's made by lazy men trying to find easier ways to do something. - Robert Heinlein
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Tuurlijk... :-)
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Rocnc
Berichten: 312
Lid geworden op: 02 dec 2008 20:39

Re: csv Log vraagje

Bericht door Rocnc »

Hmmm. Ik ben er al een tijdje mee aan het stoeien. Het blijkt lastiger dan verwacht. Het programmaatje werkt in principe wel, maar er zit ergens een fout in. Ik heb een controleberekening ingebouwd die soms aantoont dat er gegevens verdwenen zijn. Ik vermoed dat het een "tot-of-tot-en-met-fout" is, maar ik heb hem nog niet gevonden. Of ik heb misschien last van blindstaren.
Het gaat om erg veel gegevens (500K+ rijen) in mijn test. Dat maakt dat dingen uitzoeken tijdrovend is. Wordt vervolgd.
Progress isn't made by early risers. It's made by lazy men trying to find easier ways to do something. - Robert Heinlein
Gebruikersavatar
Rocnc
Berichten: 312
Lid geworden op: 02 dec 2008 20:39

Re: csv Log vraagje

Bericht door Rocnc »

Het is gelukt. Maar ik ga hier wel een disclaimer inbouwen. Ik weet niet of de loggegevens uit een simpele toepassing komen, of uit de voorzieningen van de operatiekamers van een ziekenhuis. Ik wil geen rampen op mijn geweten hebben.
Hoewel ik echt mijn best heb gedaan om alles goed te laten werken, voldoet mijn code niet aan officiele kwaliteitseisen en validaties als het erop aankomt. Je bent gewaarschuwd.

Verwerken van de 560.139 rijen met gegevens in mijn test kost op mijn (oude) core i7 laptop ongeveer 8 minuten. Dat is wel iets om je te beseffen. Tijdens het verwerken lijkt het erop dat Excel vastgelopen is. Als het langer dan een kwartier gaat duren, dan zou ik gaan mijmeren over CTRL+ALT+DEL, want dan zit er misschien iets vast in een loop.

Code: Selecteer alles

Option Explicit

'variabelen waarmee gecontroleerd wordt of het verzamelen en "concentreren" van de gegevens succesvol was of niet.
'Als alles goed verlopen is, dan is de waarde van deze twee variabelen gelijk
Dim checksum1 As Double 'de som van alle loggegevens op de geïmporteerde werkbladen
Dim checksum2 As Double 'de som van alle loggegevens op het verzamelblad

Sub VerzamelGegevensMain()

Dim LogGegevens() As Variant
Dim i As Integer

Dim StartTijd As Date
Dim StopTijd As Date
Dim Duur As Date

StartTijd = Time

Application.ScreenUpdating = False 'maak het macro sneller door schermverversen uit te zetten

'Gooi eerst alle gegevens van het huidige verzamelblad weg
Sheets("Verzamelblad").Activate
ActiveWindow.FreezePanes = False
Cells.Select
With Selection.Interior
    .Pattern = xlNone
    .TintAndShade = 0
    .PatternTintAndShade = 0
End With
With Selection.Font
    .ColorIndex = xlAutomatic
    .TintAndShade = 0
End With
Cells.Delete shift:=xlUp
Range("A1").Select

'Plaats gegevens in de titelrij
Range("A1").Value = "Datum"
Range("B1").Value = "Tijd"

For i = 1 To Sheets.Count 'doorloop alle aanwezige werkbladen en kopieer gegevens naar het verzamelblad als dat van toepassing is
    Sheets(i).Select
    If ActiveSheet.Name <> "StartBlad" And ActiveSheet.Name <> "Verzamelblad" Then 'deze werkbladen bevatten geen loggegevens en moeten dus worden overgeslagen
        Call PlaatsGegevens
    End If
Next i

Call SorteerGegevens
Call ConcentreerGegevens
Call SorteerGegevens
Call ValideerResultaat 'controleren of er geen gegevens verloren zijn gegaan (de som van alle loggegevens op de importbladen moet gelijk zijn aan de som van de meetgegevens op het verzamelblad)


'nog wat opmaak zaken
Columns("A:XFD").EntireColumn.AutoFit

Range("A2").Select
ActiveWindow.FreezePanes = True

Application.ScreenUpdating = True

StopTijd = Time
Duur = StopTijd - StartTijd

'Eindbericht voor de gebruiker:
If checksum1 <> checksum2 Then
    MsgBox "De som van de loggegevens op de importbladen is:" & vbCr & vbLf _
                & checksum1 & vbCr & vbLf _
                & "De som van de loggegevens op het verzamelblad is:" & vbCr & vbLf _
                & checksum2 & vbCr & vbLf & vbLf _
                & "Deze waarden moeten aan elkaar gelijk zijn!" & vbCr & vbLf & vbLf _
                & "Het proces is mislukt. De gegevens zijn NIET BETROUWBAAR", vbCritical, "FOUTMELDING"
                
    Range("A1").Value = "ONBETROUWBARE GEGEVENS!"
    Cells.Font.Color = rgbWhite
    Cells.Interior.Color = rgbRed
    Columns("A:A").EntireColumn.AutoFit
                
Else
    MsgBox "Verwerkingstijd: " & Duur & vbCr & vbLf & vbLf _
                & "De som van de loggegevens op de importbladen is:" & vbCr & vbLf _
                & checksum1 & vbCr & vbLf _
                & "De som van de loggegevens op het verzamelblad is:" & vbCr & vbLf _
                & checksum2 & vbCr & vbLf & vbLf _
                & "Deze waarden zijn aan elkaar gelijk en dat is goed." & vbCr & vbLf & vbLf _
                & "De verwerkte gevens lijken betrouwbaar.", vbInformation, "Proces gereed"

End If
        


End Sub

Sub PlaatsGegevens()
'Deze sub kopieert loggegevens naar het verzamelblad. Datum en tijd komen steeds in kolom A en B. De loggegevens zelf worden naar latere kolommen verschoven.
'Het doel is dat gegevens van 2 verschillende logbestanden nooit in dezelfde kolom komen te staan.

Dim BovensteRij As Long
Dim ondersterij As Long
Dim LaatsteKolom As Long

Dim BronNaam As String

Dim i As Integer 'hulpteller

ondersterij = Range("A" & Rows.Count).End(xlUp).Row 'leg vast tot aan welke rij de loggegevens doorlopen

'Gegevens opslaan in computergeheugen
BronNaam = Range("G1").Value
Range("A1:D" & ondersterij).Select
Selection.Copy

'Gegevens plaatsen op het verzamelblad
Sheets("Verzamelblad").Activate

'hier leg ik wat informatie vast van het bereik waarin de nieuwe gegevens komen te staan
BovensteRij = Range("A" & Rows.Count).End(xlUp).Row + 1
ondersterij = ondersterij + BovensteRij - 1

With ActiveSheet
    LaatsteKolom = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With

'Hier plaats ik de naam van de bron van de loggegevens in rij 1. Iedere groep gegevens komt in een aparte kolom, zodat de zaken niet door elkaar gaan lopen
If LaatsteKolom = 2 Then
    Cells(1, LaatsteKolom + 1).Value = BronNaam
Else
    Cells(1, LaatsteKolom + 2).Value = BronNaam
End If

'Hier worden de gegevens echt geplakt in het werkblad
Range("A" & BovensteRij).Select
ActiveSheet.Paste

'Hier voeg ik lege cellen toe zodat de meetgegevens in de juiste kolomen komen te staan. De bedoeling is dat er nooit gegevens van meerdere bronnen in dezelfde kolom komen te staan.
If LaatsteKolom > 2 Then
    Range("C" & BovensteRij & ":C" & ondersterij).Select
    For i = 1 To LaatsteKolom - 1
        Selection.Insert shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Next i

End If

End Sub

Sub SorteerGegevens()
'Deze sub sorteert alle gegevens eerst op datum en dan op tijd.

Dim ondersterij As Long
Dim LaatsteKolom As Long

ondersterij = Range("A" & Rows.Count).End(xlUp).Row
With ActiveSheet
    LaatsteKolom = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With
LaatsteKolom = LaatsteKolom + 1

Range(Cells(2, 1), Cells(ondersterij, LaatsteKolom)).Select

'Range("A2:L560139").Select Dit is niet goed. Zie hieronder de correctie.....
Range(Cells(2, 1), Cells(ondersterij, LaatsteKolom)).Select

    ActiveWorkbook.Worksheets("Verzamelblad").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Verzamelblad").Sort.SortFields.Add2 Key:=Range( _
        Cells(2, 1), Cells(ondersterij, 1)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets("Verzamelblad").Sort.SortFields.Add2 Key:=Range( _
        Cells(2, 2), Cells(ondersterij, 2)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Verzamelblad").Sort
        .SetRange Range(Cells(2, 1), Cells(ondersterij, LaatsteKolom))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End Sub


Sub ConcentreerGegevens()
'Deze sub "concentreert" de gegevens, zodat voor iedere datum & tijd maar 1 rij met loggegevens overblijft

'Werkwijze:
'alle rijen met gegevens op het verzamelblad worden van boven naar beneden doorgelopen
'Zodra de rij onder de actieve rij dezelfde datum en tijd bevat start een loop die de gegevens in een array plaatst en ze daarna verwijdert uit de actieve rij
'Deze loop springt steeds een rij naar beneden tot er een rij met een andere datum en/of tijd aangetroffen wordt
'Als dat gebeurt, dan worden de gegevens van het array in het werkblad gezet.
'Dit wordt herhaald tot alle rijen met gegevens bekeken zijn.

Dim ondersterij As Long
Dim LaatsteKolom As Long
Dim Gegevens() As Variant 'dit is een arrayvariabele waarin de loggegevens geconcentreert worden

Dim ConcentreerGegevens As Boolean

Dim i As Long

'vastleggen tot aan welke rij en tot aan welke kolom loggegevens voorkomen
ondersterij = Range("A" & Rows.Count).End(xlUp).Row
With ActiveSheet
    LaatsteKolom = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1
End With

'initialiseren van de array
ReDim Gegevens(1, LaatsteKolom)

Range("A2").Activate

Do
    If Range("A" & ActiveCell.Row) = Range("A" & ActiveCell.Row + 1) And Range("B" & ActiveCell.Row) = Range("B" & ActiveCell.Row + 1) Then
        
        ConcentreerGegevens = True
        
        If ConcentreerGegevens = True Then
            
            'Loggegevens in array laden
            For i = 1 To LaatsteKolom
                Cells(ActiveCell.Row, i).Activate
                If ActiveCell.Value <> vbNullString Then
                    Gegevens(1, i) = ActiveCell.Value
                End If
            Next i

            Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, LaatsteKolom)).ClearContents 'Gegevens uit actieve rij wissen
            
            Do
                Range("A" & ActiveCell.Row + 1).Activate
                If Range("A" & ActiveCell.Row) = Gegevens(1, 1) And Range("B" & ActiveCell.Row) = Gegevens(1, 2) Then

                    'Loggegevens in array laden
                    For i = 1 To LaatsteKolom
                        Cells(ActiveCell.Row, i).Activate
                        If ActiveCell.Value <> vbNullString Then
                            Gegevens(1, i) = ActiveCell.Value
                        End If
                    Next i

                    Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, LaatsteKolom)).ClearContents 'gegevens uit actieve rij wissen
                
                Else
                    ConcentreerGegevens = False
                    
                    'Plaats de gegevens van het array in het werkblad
                    ActiveCell.Offset(-1, 0).Activate
                    For i = 1 To LaatsteKolom
                        Cells(ActiveCell.Row, i).Value = Gegevens(1, i)
                    Next i
                    
                    'Zorg ervoor dat er een schoon, nieuw array klaar staat voor de volgende actie
                    Erase Gegevens() 'wis array
                    ReDim Gegevens(1, LaatsteKolom) 'initialiseer een nieuw, schoon array
                    
                    'opmaak zaken
                    Range("A" & ActiveCell.Row).NumberFormat = "m/d/yyyy"
                    Range("B" & ActiveCell.Row).NumberFormat = "[$-x-systime]h:mm:ss AM/PM"
                    Range(Cells(ActiveCell.Row, 3), Cells(ActiveCell.Row, LaatsteKolom)).NumberFormat = "General"
                    
                End If
            Loop Until ConcentreerGegevens = False
        End If

    End If

    ActiveCell.Offset(1, 0).Activate

Loop Until ActiveCell.Row > ondersterij


End Sub


Sub ValideerResultaat()
'Deze sub controleert of er geen geen gegevens corrupt zijn geworden nadat alles verzameld en "geconcentreerd" is
'op werkblad "Verzamelblad"

'Eerst wordt de som van de loggegevens van alle werkbladen van de geïmporteerde gegevens bepaald
'Dan wordt de som van de loggegevens op werkblad "Verzamelblad" bepaald.
'Als deze twee sommen aan elkaar gelijk zijn, dan neem ik aan dat er geen fouten gemaakt zijn en dat alle gegevens kloppen.

Dim i As Integer

'Ga er voor de zekerheid eerst van uit dat er fouten zijn gemaakt. Ik dwing dus af dat checksum1 ongelijk is aan checksum2:
checksum1 = 0
checksum2 = 1

For i = 1 To Sheets.Count
    
    Sheets(i).Activate
    If ActiveSheet.Name <> "StartBlad" And ActiveSheet.Name <> "Verzamelblad" Then
        
        checksum1 = checksum1 + WorksheetFunction.Sum(Range("C:D"))
        
    End If

Next i

Sheets("Verzamelblad").Activate

checksum2 = WorksheetFunction.Sum(Range("C:XFD")) 'de som van alle waarden in de kolommen C tot en met XFD.
                                                    'Dit kan eleganter (de titelrij negeren. Minder kolommen gebruiken), maar het werkt goed genoeg.


End Sub
Progress isn't made by early risers. It's made by lazy men trying to find easier ways to do something. - Robert Heinlein
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Sorry.... was ff vergeten te kijken... Ik heb het ook zo druk...

Maar ik ga nu gelijk het verhaal bekijken.... heel erg bedankt....

Ik ga ook weer een nieuw topic openen over een programmeer vraagje.... misschien kan je daar ook mee helpen.... :-)
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

moet er weer ff in komen.... ff kijken wat ik moet knippen/plakken... en waar... :-)

ik had het ff werkend... maar omdat ik een paar routines dubbel had... heb ik het een beetje zitten opschonen... en nu werkt het niet meer...

verzamelblad word niet gemaakt.... ff kijken waar dat ook alweer zat... :-)

onee... die had ik gewist.... die moet er van het begin af gelijk inzitten? ik dacht dat hij telkens opnieuw gemaakt werd, maar hij word gewist
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Ja.. Werkt...

ben er heel blij mee... misschien niet de beste manier... maar ik kan wat laten zien... (zal het doen met Born vermelding :-) )
en als het wat is, kan ik altijd later kijken hoe het op te poetsen.... voordat ik er veel tijd in stop, en de heren het niets vinden... :-)
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Rocnc
Berichten: 312
Lid geworden op: 02 dec 2008 20:39

Re: csv Log vraagje

Bericht door Rocnc »

Leuk dat je er wat aan hebt.
Ook bij mij begint de stoom een beetje uit mijn oren te komen op het werk. :lol:
Ik kan proberen te helpen als je een vraag hebt, maar het kan nu even duren.....
Progress isn't made by early risers. It's made by lazy men trying to find easier ways to do something. - Robert Heinlein
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Rocnc schreef: 28 okt 2020 20:25 Leuk dat je er wat aan hebt.
Ook bij mij begint de stoom een beetje uit mijn oren te komen op het werk. :lol:
Ik kan proberen te helpen als je een vraag hebt, maar het kan nu even duren.....
Super bedankt....
is altijd gezeik.... ze willen van alles..... en altijd iets bijzonders.... en het mag niets kosten....
willen ze logging... in het systeem zit logging... maar ja dan krijg je hele lange lijsten met data, want dat is logging....

maar ja nu willen ze weer iets heel anders, dat is de presentatie van de log... want ja... wat hebben we nu aan al die getalletjes... :-)
en dat eigenlijk zo dat het bijna vanzelf gaat.... maar ze kunnen eigenlijk niet eens zeggen welke data ze nu in 1 trend willen zien... :-)
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: csv Log vraagje

Bericht door hugo stoutjesdijk »

Ja, managers willen statistiek, die zijn niet geïnteresseerd in de juiste cijfers. :lol:
https://www.scientias.nl/waarom-statist ... rouwen-is/
dus logisch dat ze ook niet weten welke data.....enz.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Rocnc
Berichten: 312
Lid geworden op: 02 dec 2008 20:39

Re: csv Log vraagje

Bericht door Rocnc »

maar ja nu willen ze weer iets heel anders, dat is de presentatie van de log... want ja... wat hebben we nu aan al die getalletjes... :-)
en dat eigenlijk zo dat het bijna vanzelf gaat.... maar ze kunnen eigenlijk niet eens zeggen welke data ze nu in 1 trend willen zien... :-)
Dus toch die grafieken?
Dat zou je ook kunnen automatiseren in VBA. Maar als je dat wilt, dan is er wat afstemming vooraf nodig. En tijd...... Laat maar weten of je er nog energie in wil steken.

Om de een of andere reden ziet dit forum er op mijn telefoon vreemd uit. Ergens is er wat mis. Ik moet echt op zoek naar dit draadje. Er is geen lijstje met nieuwste posts meer.
Progress isn't made by early risers. It's made by lazy men trying to find easier ways to do something. - Robert Heinlein
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Ik wacht even af waar ze mee komen....

Ze hebben ook een bedrijf ingeschakeld..... maar ik denk niet dat dat wat word....
die leveren een of ander online dashbord... maar daar moet ook dmv een script verhaal aangegeven word wat je wil zien ...

en ze moeten voor elke installatie een apart dashbord maken... je heb een licnetie nodig...
en ook je moet de data koppelen... en meeste van onze installatie zitten aan boord van zee schepen... en dan is internet en oninkoppeing toch nog een lastig verhaal....

maar eerst maar eens afwachten.....
maar toch alvast heel erg bedankt....

en wie weet word vervolgd...
http://www.arjan-swets.com (met cnc filmpjes)
Plaats reactie