Excel bestand traag

Status
Niet open voor verdere reacties.
Vast wel.
Maar mij is nog steeds niet duidelijk wat je nu precies op welk moment wilt laten gebeuren.
En dan met name, op welk moment.
Ga dus na of Excel een event voor dat moment heeft.
 
Laatst bewerkt:
Elke rij is een trein
De invoer gebeurd als volgt:
Het invoerscherm wordt opgeroepen door in cel A1 te klikken.
De gegevens, aanvrager, IP-nummer,..... worden ingegeven in de velden.
Door op de knop datum te klikken kan men de optie “enkele rit” of “periode” aanklikken.
Dan kiest men de datum in de kalender.
De keuze om voor combobox’en te kiezen is om zo veel mogelijk vaste waarden te laten kiezen dit om tijd te besparen en een uniform gebruik te bekomen.
Als alle gegevens ingevuld zijn kan men kiezen voor ADD+NEW om de gegevens weg te schrijven in het werkblad, en meestal om de terugrit in te voeren, vermits deze onder dezelfde aanvrager, ip, Bnx vallen blijven sommige gegevens in het invoerveld staan. Als men de laatste ritten van de aanvrager, bnx(is het document waarop de ritten vermeld staan) ingevuld heeft kiest men voor ADD+CLOSE.
De opmaak van de cellen voor alle rijen dient uitgevoerd te worden de moment dat de gegevens worden weggeschreven in het werkbkad.
Dit om een uniform lay-out te bekomen, tijd en werk te besparen. We krijgen aanvragen binnen maanden op voorhand.

SCHAARB. VORM.- BUND. C is onze werkbasis, en dient vet blauw te zijn ( de terugrit naar c is gewoon zwart). L, P, R, is in de zelfde regio maar zijn andere bundels. Daarom is het belangrijk dat deze een andere kleur hebben omdat deze afwijken van het gebruikelijke.
Zoals je ziet zijn er heel wat ritten, dan is het handig om met vaste kleuren te werken.
Sommige cellen in het weekblad zoals vertrek, aankomstplaats, personeel kan dmv een dubbelklik aangepast worden met een keuzelijst. Omdat dit soms kan wijzigen....
Indien de optie Book in in het invoerveld aangevinkt wordt wil dat zeggen dat deze last minute is aangevraagd en heeft en wijkt dus af van een geplande rit via Bnx. Deze rij wordt dan in het geel gezet.
Dus wanneer men rit(ten) invoert en wegschrijft dient de opmaak voor alle ritten uitgevoerd te worden.
Zoals in mijn code die ik gepost heb, maar die werkt te traag.

Sorry voor heel de tekst, hopelijk weet je het opzet van het bestand.

Johnny
 
Maak in plaats van al die voor de gebruiker onzichtbare gebeurteniscodes een aangepaste werkbalk (commandbar) met knoppen (commandbarcontrols) waarmee de verschillende akties kunnen worden gestart.
Begin eerst met een toepassing zonder toeters en bellen (opmaak), waarin de verwerking van gegevens correct is.
Maak, zoals gezegd, gebruik van een intelligente tabel.
Reduceer het aantal userforms.
En maak gebruik van een eenvoudiger kalender.
 
Laatst bewerkt:
Is er een mogelijkheid om dubbele cellen te voorkomen/verwijderen in een ander werkblad d.m.v. vba?

De inhoud van die cellen wordt weggeschreven door volgende code:

Code:
Code:
With Sheets("Lijsten")
    a = .Range("H" & Rows.Count).End(xlUp).Row + 1
    .Cells(a, "H").Value = cmbaanvrager.Value
    .Range("H1:H1500").Sort key1:=.Range("H1:H1500"), order1:=xlAscending, Header:=xlNo
    a = .Range("K" & Rows.Count).End(xlUp).Row + 1
    .Cells(a, "K").Value = cmbip.Value
    .Range("K1:K1500").Sort key1:=.Range("K1:K1500"), order1:=xlAscending, Header:=xlNo
End With

Kan ik hier ergens de removeduplictates functie tussen zetten?

Of waar zet ik deze?
Code:
If WorksheetFunction.CountIf(zoek range, zoek waarde) = 1 Then Exit Sub

Johnny
 
Dat lijkt me geen reaktie op bijdrage #24.
 
snb,

jouw kalender lijkt idd veel handiger als diegene die ik nu gebruik, ik zou deze graag willen integreren in het bestand al weet ik niet goed hoe, en welke impact dit gaat geven.
Mijn gedacht ga ik daar heel wat aanpassingen moeten doen of mss helemaal opnieuw beginnen...
Zeker als ik Uw suggestie met de commandbar en knoppen in een tabel wil volgen.

Het probleem is dat er momenteel met het bestand wordt gewerkt, ik kan nu dus geen aanpassingen doen enkel als ik vannacht werk.

In grote lijnen werkt het bestand/programma goed buiten een paar aanpassingen die ik graag nog had gezien zoals
- de opmaak voor alle rijen wanneer deze worden weggeschreven.
- het voorkomen van dubbele waarden in kolommen op een ander werkblad.

Als dit nog kan gebeuren kunnen we tijdelijk verder en kan ik aan jou suggestie met de commandbar werken.

Johnny
 
Heb je dit allemaal zelf gemaakt? Voor een onbekende met dit bestand is de code niet te begrijpen of kost veel tijd om alles te analyseren.

Als je zo'n simpel regeltje al niet begrijpt dan wordt het natuurlijk twijfelachtig of je dit geheel wel kan onderhouden.
Code:
If WorksheetFunction.CountIf(zoek range, zoek waarde) = 1 Then Exit Sub
Dus de suggestie van @snb om even van scratch te beginnen lijkt mij nog niet zo'n slecht idee. Om toch een antwoord te geven om dubbele waarden te voorkomen, al begrijp ik niet waar deze vandaan kunnen komen, kan je zoiets proberen.
Code:
  With Sheets("Lijsten")
    If Application.CountIf(.Columns(8), cmbaanvrager.Value) = 0 Then
      .Cells(Rows.Count, 8).End(xlUp).Offset(1) = cmbaanvrager.Value
      .Columns(8).Sort .Cells(1, 8), , , , , , , xlNo
    End If
  
    If Application.CountIf(.Columns(11), cmbip.Value) = 0 Then
      .Cells(Rows.Count, 11).End(xlUp).Offset(1) = cmbip.Value
      .Columns(11).Sort .Cells(1, 11), , , , , , , xlNo
    End If
  End With
 
Beste VenA,

PHP:
Als je zo'n simpel regeltje al niet begrijpt dan wordt het natuurlijk twijfelachtig of je dit geheel wel kan onderhouden.

Iedereen moet leren toch?
Wat voor de ene simpel is kan voor de ander wat moeilijker zijn,......

Met dit stukje code worden de gegevens die ingevuld worden in de keuzelijsten cmbaanvrager en cmbip weggeschreven in werkblad "Lijsten".

Code:
With Sheets("Lijsten")
    a = .Range("H" & Rows.Count).End(xlUp).Row + 1
    .Cells(a, "H").Value = cmbaanvrager.Value
    .Range("H1:H1500").Sort key1:=.Range("H1:H1500"), order1:=xlAscending, Header:=xlNo
    a = .Range("K" & Rows.Count).End(xlUp).Row + 1
    .Cells(a, "K").Value = cmbip.Value
    .Range("K1:K1500").Sort key1:=.Range("K1:K1500"), order1:=xlAscending, Header:=xlNo
End With

Het is echter de bedoeling om alleen nieuwe aanvragers/ipnummers weg te schrijven (nu gebeurt dit door het vinkje nieuw aan te vinken).
Anders krijgt men op de duur een heleboel dubbele cellen in de betrokken kolom(men).

Dus concreet zou het moeten zijn:
(De bedoeling is dat het vinkje "nieuw") weggaat
De gebruiker opent het invoerveld (cel A1)
Bij de keuzelijst van de aanvrager/ip kiest men de juiste aanvrager/ip, wanneer deze niet in de lijst staat typt de gebruiker deze manueel in (in het invoervak(ken) van de keuzelijst(en). Als alle nodige velden zijn ingevuld, klikt de gebruiker op ADD+NEW of ADD+CLOSE.
Wanneer de volgende keer het invoerveld geopend wordt zou de nieuwe aanvrager/ipnummer in de lijst moeten staan.

Zoals het nu in bovenstaande code staat gaan elke keer de gegevens worden weggeschreven worden en dan krijg je dubbele namen en ip nummers.
ik heb dit nu verholpen door enkel wanneer het vinkje nieuw is aangevinkt de gegevens worden weggeschreven.

Bedankt voor Uw reactie.

Johnny
 
Misschien is het goed om de reacties eerst een rustig te lezen en te kijken welke vragen en suggesties erin staan ipv eerst schreeuwerig te reageren om er vervolgens achter te komen dat bepaalde suggesties zo gek nog niet zijn. En ja, iedereen moet leren, maar dat redt je niet met alleen maar panklare oplossingen.
 
In de bijlage een aanzet hoe ik het me voorstel.

In de werkbalk SNB vind je de knop 'treinen' om het userform te openen.

Met het userform kun je treinen toevoegen (new) , verwijderen (delete) en gegevens wijzigen (door in de tekstvakken wijzigingen aan te brengen).
Voor de illustratie-eenvoud heb ik alleen tekstvakken gebruikt.
De code om gegevens op te slaan staan in de Queryclose gebeurtenis van het userform; maar voorlopig even uitgeschakeld.
Kun je naar believen inschakelen.
 
snb,

Alvast bedankt voor Uw suggestie, ik ga dit zeker bekijken en vergelijken!

Misschien een idee hoe ik dit werkend krijg voor meerdere rijen tegelijk?

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  Select Case Target.Column
    Case 1
      If Target.Value >= "0" Then
         Target.Resize(, 19).Borders.Weight = xlThin
         Target.Offset(, 12).Resize(, 3).Borders.Weight = 3
      End If
    Case 6
      If Target.Value = "SCHAARB.-VORM. BUNDEL C" Then Y = 5
      If Target.Value = "SCHAARB.-VORM. BUNDEL R" Then Y = 3
      If Target.Value = "SCHAARB.-VORM. BUNDEL P" Then Y = 10
      If Target.Value = "SCHAARB.-VORM. BUNDEL L" Then Y = 3
         Target.Resize(, 2).Font.ColorIndex = Y
         Target.Resize(, 4).Font.Bold = xlMedium
         Target.Offset(, -5).Resize(, 4).Font.ColorIndex = Y
         Target.Offset(, -5).Resize(, 4).Font.Bold = xlMedium
         Target.Offset(, 2).Resize(, 2).Font.ColorIndex = Y
         Target.Offset(, 8).Font.ColorIndex = Y
         Target.Offset(, 12).Font.ColorIndex = Y
         Target.Offset(, 12).Font.Bold = xlMedium
    Case 7
      If Target.Value = "SCHAARB.-VORM. BUNDEL C" Then Y = 1
      If Target.Value = "SCHAARB.-VORM. BUNDEL R" Then Y = 3
      If Target.Value = "SCHAARB.-VORM. BUNDEL P" Then Y = 10
      If Target.Value = "SCHAARB.-VORM. BUNDEL L" Then Y = 3
         Target.Font.ColorIndex = Y
    Case 11
      Target.Interior.ColorIndex = IIf(Target.Value = "FBN", 43, IIf(Target.Value = "FVV", 45, xlNone))
    Case 12
      Target.Interior.ColorIndex = IIf(Target.Value >= "0", 36, xlNone)
    Case 18
       If InStr(Target.Value, "BOOK IN") Then Target.Offset(, -17).Resize(, 18).Interior.ColorIndex = 20
   End Select
End Sub

Johnny
 
De vraag is opgelost!

Dank aan ieder zijn hulp en bijdrage!

Tot de volgende vraag!!
Johnny
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan