Excel importeren en meerdere tabs omzetten naar 1 sheet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Microman
  • Registratie: Augustus 2024
  • Laatst online: 12-09-2024
Hallo

Via een computersysteem krijg ik maandelijks een automatisch gegenereerde excel.
De excel bevat per werknemer een tab. Deze tab kan leeg zijn of vol info doorgestuurd van de machine waarmee gewerkt wordt.
Bedoeling is dat deze excel kan geïmporteerd worden en omgezet in een ander format.

Ik wil dat alle namen in één sheet komen, behalve namen van de lege tabs.
In die ééne sheet wil ik van de 20 kolommen naar 8 relevante kolommen gaan (deel elimineren dus)
Zodanig dat alle info in één oogopslag te lezen is.

Bvb Jan Janssen heeft in zijn tab op 25/6 10x zijn machine geactiveerd (dus 10 lijnen in excel met verschillende actieve tijden (bvb samen 10.6u))

Dus op mijn sheet komt: Jan Janssen | 25/6 | 10.6 u | type machine

Ik ken maar een heel klein beetje van excel, dus ik heb een duw in de rug nodig. Maar ik ben er wel van overtuigd dat het mogelijk is in excel.

Ik heb zulks een bestuurderlijst op mijn computer, weet alleen niet hoe deze hier te posten.

Groet Microman

code:
1
2
3
4
5
6
7
Achternaam  Voornaam    Machine Datum, inschakeltijd    Inschakeltijd   Datum, uitschakeltijd   Uitschakeltijd  Duur    Duur (Dagen)    Actieve duur    Actieve duur (Dagen)    Schok
Takla   Riad    FM-X-14 (91327) 26-07-2024  14:02:08    26-07-2024  15:40:04    01:37:56    ,06801  00:48:19    ,03355  0
Takla   Riad    FM-X-14 (91327) 26-07-2024  15:41:10    26-07-2024  17:47:08    02:05:58    ,08748  01:06:19    ,04605  0
Takla   Riad    FM-X14 (94502)  26-07-2024  15:54:13    26-07-2024  15:55:37    00:01:24    ,00097  00:01:07    ,00078  0
Takla   Riad    FM-X-14 (91327) 26-07-2024  18:15:27    26-07-2024  20:04:32    01:49:05    ,07575  00:58:29    ,04061  0
Takla   Riad    FM-X-14 (91327) 26-07-2024  20:09:20    26-07-2024  21:04:00    00:54:40    ,03796  00:27:24    ,01903  0
Takla   Riad    FM-X-14 (91327) 26-07-2024  21:05:38    26-07-2024  21:52:16    00:46:38    ,03238  00:27:33    ,01913  0



...

[ Voor 27% gewijzigd door Microman op 03-08-2024 23:47 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Alle bladen doorlopen, met vba via een for-nextlus bv. en de gegevens kopiëren naar Blad1 .
Bij kopiëren van een volgend blad telkens de laatste rij in Blad1 bepalen en daar de gegevens plakken.
Kolommen verwijderen kan handmatig (door ze eerst te selecteren en daarna te verwijderen) of ook automatisch via vba, als het steeds dezelfde kolommen zijn.

Acties:
  • +1 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Microman schreef op zaterdag 3 augustus 2024 @ 23:42:
Ik ken maar een heel klein beetje van excel, dus ik heb een duw in de rug nodig. Maar ik ben er wel van overtuigd dat het mogelijk is in excel.
Eerlijk gezegd (en niet onaardig bedoeld :* ): beter is dan om of de opdracht terug te geven of eerst een cursus doen in de baas zn tijd. Het wordt namelijk kostbaar als later blijkt dat er een foutje in zat, bijv. bij een uitzonderingssituatie. Iets zegt me dat met die machines werken ook niet gebeurt door iemand die niet weet hoe het werkt en alleen een duwtje in de rug.

In welke mate moet het volautomatisch? Zijn het altijd dezelfde tabbladen? Misschien kan je het doen met een simpele ALS() functie die de regel leeg laat als er geen data is. En dan achteraf de lege regels uitfilteren.

Met VBA kan inderdaad "alles".

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


Acties:
  • 0 Henk 'm!

  • Microman
  • Registratie: Augustus 2024
  • Laatst online: 12-09-2024
Eerlijk gezegd (en niet onaardig bedoeld :* ): beter is dan om of de opdracht terug te geven of eerst een cursus doen in de baas zn tijd. Het wordt namelijk kostbaar als later blijkt dat er een foutje in zat, bijv. bij een uitzonderingssituatie. Iets zegt me dat met die machines werken ook niet gebeurt door iemand die niet weet hoe het werkt en alleen een duwtje in de rug.
ik doe dit uit eigen interesse. Voor mezelf wat slimmer te maken zeg maar. Het verhaal is wel begonnen met één enkele klant die me vroeg: Is het niet mogelijk dat.... en vanaf daar kan ik het moeilijk loslaten. Dat ken je ongetwijfeld wel ;)

Het systeem werkt eigenlijk als volgt: Heftrucks in een bedrijf worden bediend door verschillende chauffeurs. Deze hebben elk een eigen opstart badge (rfid). Allerlei gegevens worden vanaf de machine doorgestuurd via GSM netwerk naar cloud. Met een internetportaal kan de beheerder van de vloot machines data sturen en ontvangen. Er kan ook voor gekozen worden dat het portaal bvb om de maand / week / dag een excel lijst doorstuurt naar diens e-mail adres. Big brother zeg maar. Zelfs als er gebotst wordt met de machine is hier melding van. Allemaal heel mooi, maar ook te veel nutteloze informatie + lege tabs wegens niet gewerkt,

Dus als die per e-mail ontvangen excel makkelijk te importeren en bewerken is naar eigen wens zou dat fantastisch zijn. Nu ben ik zelf al vele jaren microcontrollers aan het programmeren in basic en in C, dus ik ben niet geheel vreemd aan de programmeertaal. Maar in excel niet veel ervaring.

Voor de moment gebruik ik de google excel (=heel clean en leesbaar) op mijn persoonlijke computer. Via bestand > importeren heb ik eigen excel kunnen combineren met de machine-excel. Er zijn ook ongelooflijk veel functies en mogelijkheden.

Hoe ik hier de Visual Basic in excel moet toepassen moet ik nog uitvogelen. Dat heb ik nog nooit gedaan.
Ik ga op ontdekking :) :)

Microman

Acties:
  • +1 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 22:42
Microman schreef op zondag 4 augustus 2024 @ 11:52:
[...]
Voor de moment gebruik ik de google excel (=heel clean en leesbaar) op mijn persoonlijke computer. Via bestand > importeren heb ik eigen excel kunnen combineren met de machine-excel. Er zijn ook ongelooflijk veel functies en mogelijkheden.

Hoe ik hier de Visual Basic in excel moet toepassen moet ik nog uitvogelen. Dat heb ik nog nooit gedaan.
Ik ga op ontdekking :) :)

Microman
Gebruik je nou Excel of Google Sheets? Maakt nogal wat uit voor de aan te dragen oplossing. VBA werkt niet in Google Sheets, die kent wel App Script.
Microman schreef op zondag 4 augustus 2024 @ 11:52:
[...]
ik doe dit uit eigen interesse. Voor mezelf wat slimmer te maken zeg maar.
Uit eigen interesse ga je persoonsgegevens verwerken? En dat ook nog eens in de Google Cloud als je inderdaad Google Sheets gebruikt? Ik ken natuurlijk de context niet, maar hier gaan wel een paar alarmbellen af. Eigenlijk gaan die al af bij de mogelijkheid voor een maandelijkse email met die persoonsgegevens gekoppeld aan het gebruik van machines. Lijkt verdacht veel op controle van werknemers.

Acties:
  • +2 Henk 'm!

  • BlackMonkey
  • Registratie: December 2013
  • Laatst online: 00:30
Als je MS Excel gebruikt, kan je het vrij eenvoudig met Power Query doen:

1) Plaats de individuele bestanden in 1 map.
2) Open excel, tabblad gegevens, ophalen uit map
3) Klik op gegevens transformeren
4) Zorg dat alle gegevens als losse rijen in 1 query/tabel komen
5) Filter de rijen met lege uren
6) Pivot je tabel om de gegevens per medewerker samen te vatten

Acties:
  • 0 Henk 'm!

  • fre_
  • Registratie: April 2015
  • Laatst online: 15-05 10:28
Met VBA is dit niet een zo moeilijke klus.
Gebruik misschien ChatGPT om je hierin te helpen mocht je VBA nog niet kennen.
Er zijn veel dingen waarvoor ik AI niet zou gebruiken, maar voor het leren van een programmeertaal vind ik dit een goede tool.

Acties:
  • 0 Henk 'm!

  • Microman
  • Registratie: Augustus 2024
  • Laatst online: 12-09-2024
Uit eigen interesse ga je persoonsgegevens verwerken? En dat ook nog eens in de Google Cloud als je inderdaad Google Sheets gebruikt? Ik ken natuurlijk de context niet, maar hier gaan wel een paar alarmbellen af. Eigenlijk gaan die al af bij de mogelijkheid voor een maandelijkse email met die persoonsgegevens gekoppeld aan het gebruik van machines. Lijkt verdacht veel op controle van werknemers.
Even duiden: Elke klant koopt en beheert zijn eigen internet-portaal. Via dat portaal bepaalt hij wie met machine mag rijden en hoe snel (rijbewijs, interim, contractor, etc). De gegevens die de machine naar portaal doorstuurt (draaiuren, hoeveel uur gereden die dag, gebotst, naam persoon ). De naam SOMS dus ook. Dit is interne keuken (akkoord personeel, vakbond) Dus ja, zoals ik al zei is het systeem beetje big brother.

Ikzelf ben een helpdesk, main user van alle systemen. (Hulp voor de klant bij problemen, of opzetten nieuw systeem.)

De info dat het "systeem" uitstuurt is zeer veel, deels nutteloos, moeilijk te interpreteren.
Een veel terugkomende vraag van de klanten zijn dus: kunnen we de excel info customizen ??
Niet binnen het bestaande systeem dus.. Daarom denk ik aan de vraag te kunnen voldoen via een aparte excel oplossing (en eigen interesse om dit opgelost te krijgen)

Dus eens een excel oplossing gemaakt is krijgt de klant deze volledig in eigen beheer (om zijn data beter te kunnen begrijpen)

Ik was mogelijkheden in google sheet aan het bekijken. Nu ga ik dan verderdoen in excel microsoft.

Thx Microman

Acties:
  • +1 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 22:42
In plaats van VBA heb je tegenwoordig in Excel de mogelijkheid om Power Query te gebruiken om data in te lezen. Zelf vind ik dat meestal een betere manier, omdat je daar in losse stapjes van een bron (je excel bestand met verschillende tabbladen per medewerker) via verschillende transformaties naar je eindresultaat toe werkt. VBA is een generieke taal die niet specifiek bedoeld is om met gegevens te werken dus imho is dat vaak omslachtiger. Als is de leercurve voor VBA misschien wat kleiner dan die voor Power Query.

Hier staat een mooie tutorial hoe je gegevens uit verschillende tabbladen en werkboeken kan combineren in één overzicht.
Belangrijkste aanname daarbij is dat alle sheets met data dezelfde structuur hebben. Maar als ik je verhaal lees lijkt dat inderdaad het geval te zijn.

Acties:
  • 0 Henk 'm!

  • Microman
  • Registratie: Augustus 2024
  • Laatst online: 12-09-2024
Update

Het werkt al grotendeels, alhoewel dat ik alles nog ga veranderen.
Ik heb gebruik gemaakt van VBA visual basic omdat ik dat nog wat ken. Ik heb gewoon alles in stapjes aan CHATGPT gevraagd. Dat is gewoon een superprogramma. Het is precies of ik met een specialist aan het praten ben die per direct doet wat je vraagt. Crazy gewoon !!!

Dus hier zijn we vandaag.. na een hele dag testen en aanpassen

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Sub PIVOT_TABEL_MAKEN()
    Dim ws As Worksheet
    Dim wsDest As Worksheet
    Dim LastRow As Long
    Dim LastRowDest As Long
    Dim ColumnsToCopy As Variant
    Dim col As Variant
    Dim DestCol As Integer
    Dim HeaderTitles As Variant
    Dim i As Integer
    Dim TotalHours As Double
    
    ' Kolommen die gekopieerd moeten worden
    ColumnsToCopy = Array("B", "C", "E", "F", "H", "I", "K", "M")
    
    ' Koptekst titels
    HeaderTitles = Array("Achternaam", "Voornaam", "Datum", "Begin uur", "Eind uur", "Verschil uur", "Verschil Actieve duur", "Schok")
    
    ' Maak een nieuw tabblad voor de samengevoegde gegevens
    Set wsDest = ThisWorkbook.Sheets.Add
    wsDest.Name = "PIVOT TABEL"
    
    ' Zet de kopteksten in de eerste rij van het nieuwe tabblad
    For i = 0 To UBound(HeaderTitles)
        wsDest.Cells(1, i + 1).Value = HeaderTitles(i)
    Next i
    
    ' Formatteer de kopteksten
    With wsDest.Range("A1:H1")
        .Font.Size = 14
        .Font.Bold = True
        .Interior.Color = RGB(255, 255, 0) ' Geel
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .WrapText = True
    End With
    
    ' Start de samengevoegde gegevens vanaf de 4de rij
    LastRowDest = 4
    
    ' Loop door alle tabbladen en kopieer de specifieke kolommen zonder de kopteksten
    For Each ws In ThisWorkbook.Sheets
        If ws.Name <> wsDest.Name Then
            LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
            DestCol = 1
            For Each col In ColumnsToCopy
                If LastRow > 1 Then ' Controleer of er gegevens zijn om te kopiëren
                    ws.Range(ws.Cells(2, col), ws.Cells(LastRow, col)).Copy Destination:=wsDest.Cells(LastRowDest, DestCol)
                End If
                DestCol = DestCol + 1
            Next col
            LastRowDest = wsDest.Cells(wsDest.Rows.Count, "B").End(xlUp).Row + 1
        End If
    Next ws

    ' Pas de kolombreedte aan naar de best fit
    wsDest.Columns("A:H").AutoFit
    
    ' Maak cellen in kolom I rood als de waarde groter is dan 0
    For i = 4 To LastRowDest - 1
        If wsDest.Cells(i, 8).Value > 0 Then ' Kolom I is nu de 8ste kolom
            wsDest.Cells(i, 8).Interior.Color = RGB(255, 0, 0) ' Rood
        End If
    Next i

    ' Centreer de tekst in kolom G
    wsDest.Columns("G").HorizontalAlignment = xlCenter

    MsgBox "De PIVOT TABEL is klaar!"
End Sub


Bedankt al voor de goede tips !!! Maar ik heb nog niet volledig bereikt wat ik in gedachten had.

Dus.. i'll be back.

Groet Microman

Acties:
  • 0 Henk 'm!

  • Microman
  • Registratie: Augustus 2024
  • Laatst online: 12-09-2024
Hey, me again

Mijn programma in visual basic werkt perfect. Vele delen geschreven door chatgpt en nadien alle stukken aan mekaar getoverd. Ik ken gelukkig wel klein woordje basic.

Maar hetgene waar ik niet zo goed aan uit kan is het opslaan en vervolgens delen met anderen zodat ze dit VB kunnen gebruiken. Ik heb VB opgeslagen als .XLAM Add-in.
Maar als ik deze dan op andere computer wil invoegen, of gewoon open, dan zie ik de code in de uiterst linkse button VB. Maar niet in de lijst van macro's ?

En als ik dan toch de code lopende krijg komen er errors op banale stukken code.

Ik vermoed dat de oplossing niet zo moeilijk is, maar ik zie het gewoon effe niet meer.

Kunnen jullie even bijstaan aub ??

Groet Microman

Acties:
  • 0 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 22:42
Macro's in XLAM bestanden worden niet getoond in de lijst met beschikbare macro's. Dat is standaardgedrag van Excel. Als ik het me goed herinner kan je ze wel starten via dat venster als je de naam exact weet.

Een XLAM is bedoeld als add-in op Excel. MS verwacht dat je dus een manier inbouwt om de functionaliteit aan te roepen, bijvoorbeeld via een custom menu item.

De errors lijken me los te staan van dit issue. Wat voor foutmeldingen krijg je? Als je code nog enigszins lijkt op die in je post hierboven mis ik basale checks of wel aan jou uitgangspunten is voldaan. Je maakt een nieuw tabblad "PIVOT TABEL". Als die al bestaat gaat je code fout. Maar zonder meer informatie over de foutmelding is het lastig gokken wat er mis gaat.

Acties:
  • 0 Henk 'm!

  • Microman
  • Registratie: Augustus 2024
  • Laatst online: 12-09-2024
Hey

Op de computer waar ik deVB code gemaakt heb werkt het programma goed. Zal het straks eens doorsturen.
Maar als ik programma via xlam transporteer en werkende krijg. Dan komt er bvb een error op regel code om de freezpane 1ste lijn te blokkeren.

Je weet wel, het programma gaat in debug mode en de fout wordt in geel ge'highlight.

gr Microman

Acties:
  • 0 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 22:42
Microman schreef op woensdag 14 augustus 2024 @ 17:16:

Je weet wel, het programma gaat in debug mode en de fout wordt in geel ge'highlight.

gr Microman
Nee, ik weet niet ;)

Zonder fatsoenlijke foutafhandeling zal hij inderdaad je debug pane openen en op de foutieve regel gaan staan. Handig! Dan weet je waar het fout gaat. Het mooie is dat er ook nog een foutmelding bij gegeven wordt. Dan weet dus dus ook wát er fout gaat. Zonder de foutmelding hier te posten kunnen wij je niet helpen, we kunnen niet op je scherm kijken.

In de code die je eerder postte staat helemaal geen freeze pane instructie dus zo is het helemaal koffiedik kijken.

  • Microman
  • Registratie: Augustus 2024
  • Laatst online: 12-09-2024
hey

Dit is mijn macro. Die werkt zoals het hoort. Zonder fouten. Hij maakt een nieuw tabblad. Bovenste rij met benamingen wordt geblokkeerd (freezpane) Een deel van de kolommen van elke tab wordt gekopieerd. Nadien nog wat kaders getrokken, datums bij geplaatst en wat sommetjes gemaakt.

Als ik deze VBA dan opsla met extentie XLAM om dan elders te gebruiken, dan krijg ik deze wel te zien in de VBE visual basic editor. Maar niet in de lijst Macro's (alt+F8). En als ik wat kopie paste werk doe om deze daar toch te zien te krijgen en de macro run krijg ik dikwijls een fout op die freezpane 2:2. Ben nu al zo lang aan het zoeken en cirkels aan het draaien, wordt er gek van.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
Sub PIVOT_TABEL_MAKEN()

    Dim ws As Worksheet
    Dim wsDest As Worksheet
    Dim LastRow As Long
    Dim LastRowDest As Long
    Dim ColumnsToCopy As Variant
    Dim col As Variant
    Dim DestCol As Integer
    Dim HeaderTitles As Variant
    Dim i As Long
    Dim TotalHours As Double
    Dim TotalG As Double
    Dim TotalF As Double
    Dim TotalL As Double
    Dim TotalM As Double
    
    ' Kolommen die gekopieerd moeten worden
    ColumnsToCopy = Array("B", "C", "E", "F", "H", "I", "K", "M")
    
    ' Koptekst titels
    HeaderTitles = Array("Achternaam", "Voornaam", "Datum", "Begin uur", "Eind uur", "Aanlog duur", "Actieve duur", "Schok", ">>>>>", "Aanlog duur", "Actieve duur")
    
    ' Maak een nieuw tabblad voor de samengevoegde gegevens
    Set wsDest = ThisWorkbook.Sheets.Add
    wsDest.Name = "PIVOT TABEL"
    
    ' Zet de kopteksten in de eerste rij van het nieuwe tabblad
    For i = 0 To UBound(HeaderTitles)
        wsDest.Cells(1, i + 1).Value = HeaderTitles(i)
    Next i
    
    ' Formatteer de kopteksten
    With wsDest.Range("A1:M1")
        .Font.Size = 14
        .Font.Bold = True
        .Interior.Color = RGB(255, 255, 0) ' Geel
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        '.WrapText = True
         wsDest.Columns("A:M").AutoFit
         wsDest.Columns("A:M").HorizontalAlignment = xlCenter
    End With
    
        
    
    ' Start de samengevoegde gegevens vanaf de 4de rij
    LastRowDest = 4
    
    ' Loop door alle tabbladen en kopieer de specifieke kolommen zonder de kopteksten
    ' Alle tabs kopieeren ,behalve Tab 1 (Index 1) met de Evaluatiegegevens
    For Each ws In ThisWorkbook.Sheets
        If ws.Name <> "Evaluatieparameters" And ws.Name <> wsDest.Name Then
            LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
            DestCol = 1
            For Each col In ColumnsToCopy
                If LastRow > 1 Then ' Controleer of er gegevens zijn om te kopiëren
                    ws.Range(ws.Cells(2, col), ws.Cells(LastRow, col)).Copy Destination:=wsDest.Cells(LastRowDest, DestCol)
                End If
                DestCol = DestCol + 1
            Next col
            LastRowDest = wsDest.Cells(wsDest.Rows.Count, "B").End(xlUp).Row + 3  ' +3 voor TWEE lege regels toe te voegen tussen tabs
        End If
    Next ws

    wsDest.Columns("A:M").AutoFit
    
    ' Maak alle sckokken in kolom H zichtbaar door rood te kleuren + vette cijfer
    For i = 5 To LastRowDest - 1
      If wsDest.Cells(i, 8).Value > 0 Then
         wsDest.Cells(i, 8).Interior.Color = RGB(250, 0, 0) 'Maak cel Rood
         With wsDest.Range("H" & i & ":H" & i)
         .Font.Bold = True
         .Font.Color = RGB(255, 255, 255)       ' Maak cijfer wit
         End With
      End If
    Next i
    
    ' Centreer de tekst in kolom G ,H ,I
    wsDest.Columns("D:I").HorizontalAlignment = xlCenter

        ' Centreer de tekst in kolommen G tot en met P
    wsDest.Columns("G:P").HorizontalAlignment = xlCenter
    
    ' Freeze de eerste rij
    wsDest.Rows("2:2").Select
    ActiveWindow.FreezePanes = True
   
    
       
    Dim StartRow As Long
    Dim EndRow As Long
    Dim DataRange As Range
    
    ' Gebruik het actieve werkblad
    Set ws = ActiveSheet
    
    ' Bepaal de laatste rij met gegevens in kolom A
    LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' Begin bij de 4de rij, omdat de 1ste rij waarschijnlijk kopteksten bevat, 2de & 3de rij blank
    StartRow = 4
    
    For i = 4 To LastRow
        ' Als cel leeg is spring  dan 3 rows
        If ws.Cells(i, 1).Value = "" Then
                       
            With wsDest.Range("L" & EndRow - 1 & ":M" & EndRow - 1)
                 .Font.Size = 12
                 .Font.Bold = True
                 .Value = "Datums Totaal"
                 .Interior.Color = RGB(100, 250, 0)      ' geel
            End With
            
            i = i + 2
            StartRow = i
        End If
        
        ' Vergelijk waarden in kolommen A, B en C met de volgende rij
        If ws.Cells(i, 1).Value = ws.Cells(i + 1, 1).Value And _
           ws.Cells(i, 2).Value = ws.Cells(i + 1, 2).Value And _
           ws.Cells(i, 3).Value = ws.Cells(i + 1, 3).Value Then
            ' Groep gaat door, ga naar de volgende rij
            
        ' Bereken de som van de waarden in kolom G en F ALS naam, voornaam en datum hetzelfde zijn (SOM als ABC=)
        If ws.Cells(i, 1).Value = ws.Cells(i + 1, 1).Value And _
           ws.Cells(i, 2).Value = ws.Cells(i + 1, 2).Value And _
           ws.Cells(i, 3).Value = ws.Cells(i + 1, 3).Value Then
           
            TotalG = Application.WorksheetFunction.Sum(ws.Range(ws.Cells(StartRow, 7), ws.Cells(i + 1, 7)))
            TotalF = Application.WorksheetFunction.Sum(ws.Range(ws.Cells(StartRow, 6), ws.Cells(i + 1, 6)))
        End If
        
         ' Bereken de som van de waarden in kolom G en F ALS naam, voornaam hetzelfde zijn  (SOM als AB=)
         ' Zo krijg je maandtotaal van deze persoon
        If ws.Cells(i, 1).Value = ws.Cells(i + 1, 1).Value And _
           ws.Cells(i, 2).Value = ws.Cells(i + 1, 2).Value Then
                       
            TotalL = Application.WorksheetFunction.Sum(ws.Range(ws.Cells(StartRow, 6), ws.Cells(i + 1, 6)))
            TotalM = Application.WorksheetFunction.Sum(ws.Range(ws.Cells(StartRow, 7), ws.Cells(i + 1, 7)))
            
        End If
            
            EndRow = i + 1
        Else
            ' Stel de eindrij in als de huidige rij
            EndRow = i
            
            ' Trek een vetgedrukt kader rond de groep in kolommen A tot en met H
            Set DataRange = ws.Range("A" & StartRow & ":H" & EndRow)
            With DataRange.Borders(xlEdgeLeft)
                .LineStyle = xlContinuous
                .Weight = xlThick
            End With
            With DataRange.Borders(xlEdgeTop)
                .LineStyle = xlContinuous
                .Weight = xlThick
            End With
            With DataRange.Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlThick
            End With
            With DataRange.Borders(xlEdgeRight)
                .LineStyle = xlContinuous
                .Weight = xlThick
            End With
            With DataRange.Borders(xlInsideVertical)
                .LineStyle = xlContinuous
                .Weight = xlThin
            End With
            
            '  KLeur alle kolommen van G licht blauw
            With wsDest.Range("G" & StartRow & ":G" & EndRow)
                  .Interior.Color = RGB(170, 216, 230) ' Licht_Blauw
            End With
            
            '  KLeur alle kolommen van F licht groen
            With wsDest.Range("F" & StartRow & ":F" & EndRow)
                  .Interior.Color = RGB(144, 238, 144) ' Licht_Groen
            End With
            
            '  Verander eigenschappen voor cel J  (Cel = Totaal Aangelogd duur)
            With wsDest.Range("J" & EndRow - 1 & ":J" & EndRow)
                 .Merge
                 .HorizontalAlignment = xlCenter
                 .VerticalAlignment = xlCenter
                 .Font.Size = 14
                 .Font.Bold = False
                 .Interior.Color = RGB(144, 238, 144) ' Licht_Groen
            End With
            
            '  Verander eigenschappen voor cel K  (Cel = Totaal Active duur)
            With wsDest.Range("K" & EndRow - 1 & ":K" & EndRow)
                 .Merge
                 .HorizontalAlignment = xlCenter
                 .VerticalAlignment = xlCenter
                 .Font.Size = 14
                 .Font.Bold = False
                 .Interior.Color = RGB(170, 216, 230) ' Licht_Blauw
            End With
            
            
            ' vette kader rond J
            Set Cell = ws.Range("J" & EndRow - 1 & ":J" & EndRow)
            With Cell.Borders
                .LineStyle = xlContinuous
                .Weight = xlThick
                .ColorIndex = xlAutomatic
            End With
            
            ' vette kader rond K
            Set Cell = ws.Range("K" & EndRow - 1 & ":K" & EndRow)
            With Cell.Borders
                .LineStyle = xlContinuous
                .Weight = xlThick
                .ColorIndex = xlAutomatic
            End With
            
            '  Verander eigenschappen voor cel L en M
            '  Value = datums gekopieerd uit aatse Row, kolom C
            With wsDest.Range("L" & EndRow - 1 & ":M" & EndRow)
                 .Merge
                 .HorizontalAlignment = xlCenter
                 .VerticalAlignment = xlCenter
                 .Font.Size = 12
                 .Font.Bold = False
                 .Value = ws.Cells(EndRow, "C").Value
            End With
            
            ' vette kader rond L en M
            Set Cell = ws.Range("L" & EndRow - 1 & ":M" & EndRow)
            With Cell.Borders
                .LineStyle = xlContinuous
                .Weight = xlThick
                .ColorIndex = xlAutomatic
            End With
           
            
            ' Zet de som in kolom K voor kolom G en in kolom J (Totaal Aanlog duur)
            ' voor kolom F (Totaal Atieve duur)in de laatste rij van de groep
            ws.Cells(i - 1, 11).NumberFormat = "[h]:mm:ss"
            ws.Cells(i - 1, 11).Value = TotalG
            ws.Cells(i - 1, 10).NumberFormat = "[h]:mm:ss"
            ws.Cells(i - 1, 10).Value = TotalF
                          
            
        End If
    Next i
    
   
    MsgBox "De PIVOT TABEL is klaar ! Groeten Microman "
End Sub

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 22:42
code:
1
 Set wsDest = ThisWorkbook.Sheets.Add

"ThisWorkbook" verwijst naar het workbook waar de macro in zit.
Als XLAM is dat een niet zichtbaar workbook. Vervolgens probeer je in dat onzichtbare workbook rijen te bevriezen. Daar gaat het op fout want onzichtbare rijen kan je niet bevriezen.

Zorg dat je wsDest niet je XLAM bestand is door een nieuwe te maken of naar je actieve werkboek te verwijzen.
Maar niet in de lijst Macro's (alt+F8).
Zoals gezegd, dat gedrag is by design. Je zal zelf een nieuw menu item of knop in de werkbalk moeten toevoegen om de macro's netjes aan te roepen.
Pagina: 1