• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Complex en traag excel bestand ombouwen

Status
Niet open voor verdere reacties.
Nu heb je koppelingen naar je brongegevens, als je VBA laat werken, dan neemt hij de gegevens van dat ogenblik, dus veronderstel dat de prijzen zich aanpassen in je bronbestand, dan wordt dat niet meer meegenomen. Nu lijkt me dat bijna meer een voordeel dan een nadeel, maar je moet dat dus weten. Natuurlijk zou je er nadien nog een keer kunnen op gaan staan en iets wijzigen, dan heb je de nieuwe prijzen mee.
Tegelijk zijn we van die lompe indirect-formule af.
Je bronbestand moet eigenlijk ook maar open staan als je zaken gaat veranderen, niet als je zaken opzoekt.

Ik kom niet helemaal uit wat je nu bedoelt met je reactie, jou denkvermogen qua excel ligt iets hoger dan de mijne :rolleyes:

VBA, is voor mij al totaal vreemd. Kun je in wat stappen aangeven wat je nu denkt te kunnen wijzigen? Ik denk dat je nu bedoeld dat je de tabbladen toch allemaal aan het hoofdbestand toe wilt voegen (komen we dan niet met max tabladen in de knoop) en deze wilt synchroniseren met de VBA vanuit de brongegevens als er prijswijzigingen zijn?
 
Laatst bewerkt:
Graag nog de toelichting, zodat ik zelf weer een en ander kan testen.

Alvast bedankt!
 
even nog iets anders voor we over VBA beginnen.

- sla je bestand even op onder een andere naam, zodat we even wat kunnen proberen erop.

- hoe groot is je bestand ?

- in ieder tabblad, ga ergens staan en druk op CTRL+END, kijk nu waar je uitkomt, dat is het laatste punt rechts beneden van al je gebruikte cellen. Ga nu even goed na of dit niet ver beneden je laatst gebruikt rij is. Is dat zo, dan delete je alle rijen vanaf de laatst gebruikte rij tot deze rij. Kijk dan ook eens naar de "volgens jou" laatst gebruikte kolom van dat werkblad. Zijn er volgens CTRL+END nog een boel extra kolommen, delete dan ook die extra kolommen. Let er nu even goed op of er geen foutmeldingen verschijnen, zoja, kijk waarom. Na ieder tabblad sla je de map op. Ik ben even niet zekerof het strikt noodzakelijk is, maar voor de veiligheid sluit je de map gewoon af en heropen je hem onmiddellijk weer, zo zie je gemakkelijk de grootte. en hou je even bij op een papiertje.

- in ieder tabblad, alle cellen selecteren, kopieren en plakken speciaal als waarden

- nu opnieuw je map opslaan, hoe groot is die nu ?

Wat heeft dat opgebracht, ik verwacht van die 1e het meest.
Is de besparing beduidend, dan kunnnen we gaan denken aan VBA, anders zal het alleen de snelheid ten goede komen, niet de omvang.
 
even nog iets anders voor we over VBA beginnen.

- sla je bestand even op onder een andere naam, zodat we even wat kunnen proberen erop.

- hoe groot is je bestand ?

- in ieder tabblad, ga ergens staan en druk op CTRL+END, kijk nu waar je uitkomt, dat is het laatste punt rechts beneden van al je gebruikte cellen. Ga nu even goed na of dit niet ver beneden je laatst gebruikt rij is. Is dat zo, dan delete je alle rijen vanaf de laatst gebruikte rij tot deze rij. Kijk dan ook eens naar de "volgens jou" laatst gebruikte kolom van dat werkblad. Zijn er volgens CTRL+END nog een boel extra kolommen, delete dan ook die extra kolommen. Let er nu even goed op of er geen foutmeldingen verschijnen, zoja, kijk waarom. Na ieder tabblad sla je de map op. Ik ben even niet zekerof het strikt noodzakelijk is, maar voor de veiligheid sluit je de map gewoon af en heropen je hem onmiddellijk weer, zo zie je gemakkelijk de grootte. en hou je even bij op een papiertje.

- in ieder tabblad, alle cellen selecteren, kopieren en plakken speciaal als waarden

- nu opnieuw je map opslaan, hoe groot is die nu ?

Wat heeft dat opgebracht, ik verwacht van die 1e het meest.
Is de besparing beduidend, dan kunnnen we gaan denken aan VBA, anders zal het alleen de snelheid ten goede komen, niet de omvang.

Allereerst bedankt voor je reactie.

Heb eerst alle tabbladen langs gelopen en gecontroleerd met de CTRL + END methode, resultaat is dat dit gelijk loopt aan de huidige opvulling met formules. Dit is dus geen onnodige opvulling.

Daarna alles per tabblad gekopieerd en plakken speciaal als waarden. voor deze stap was de inhoud 13.017 kB, en daarna 8.514 kB.

Tot zover wat ik moest testen volgens mij, kan nog kijken om alle opgevulde cellen even geen opvulling te geven en kijken wat dat opleverd.
 
Even de celopmaak overal op geen opvulling gezet, hier wordt het bestand 150 kB groter van, dus dat haalt ook niets uit...
 
eigenlijk komen we van 19 MB naar8.5 MB, dat is toch al gehalveerd, of vergis ik me ergens.
Dat opvullen, wat bedoel je daarmee, onder de laatste ingevulde rij nog x rijen met alleen maar formules klaar om te reageren op nieuwe input ? Zijn dat er veel ?
 
eigenlijk komen we van 19 MB naar8.5 MB, dat is toch al gehalveerd, of vergis ik me ergens.
Dat opvullen, wat bedoel je daarmee, onder de laatste ingevulde rij nog x rijen met alleen maar formules klaar om te reageren op nieuwe input ? Zijn dat er veel ?

Je hebt helemaal gelijk hoor, zover zijn we idd gekomen!

Opvullen in mijn laatste tekst bedoel ik puur voor de opmaak dus de cellen een kleurtje of bij dingen die nog aandacht vereisen enz.
Nee er staan niet veel rijen met formules klaar, ondanks dat er wekelijke honderden rijen gevuld worden. Dus als het weer zo ver is dan zal maak ik weer wat rijen aan, bijvoorbeeld 2000 erbij.
 
bon, dan veronderstel ik dat je nu 1 rij wil toevoegen aan "hoofdbestand" binnen je "testadministratie" met behulp van VBA ?
Dat is blijkbaar de enige plaats waar je zaken toevoegt.
 
bon, dan veronderstel ik dat je nu 1 rij wil toevoegen aan "hoofdbestand" binnen je "testadministratie" met behulp van VBA ?
Dat is blijkbaar de enige plaats waar je zaken toevoegt.

Sorry voor mijn late reactie even paar dagen erg druk gehad.

Wat ik op dit moment doe is wekelijks een paar honder regels met formules in het hoofdbestand zetten voor het verwerken van de gegevens die de uitvoerders aanleveren. (werken in gelijk opgezet bestand, ik verzamel alles in 1 bestand door de gegevens wekelijk er in te plakken.)
Als ik regels nu toevoeg in tabblad hoofdbestand moeten deze ook toegevoegd worden aan de achterliggende tabbladen, omdat deze dus een weergave zijn van tabblad hoofdbestand maar dat met een andere volgorde en layout, met de daar achterliggende gedachten.

De tabbladen mandagenregister, weekstaat, opdrachtbon en hoeveelheden. is nu ook per rij en per cel 1 formule. Misschien is hier ook wel een andere methode voor met de VBA, maar ik heb totaal geen weet hoe dat werkt.
Maar ook in het hoofdbestand staan natuurlijk diverse formules zoals, verwijzing naar kentekens, sofinummers, tarieven. Dit zijn grote hoeveelheden formules die waarschijnlijk de snelheid en grootte negatief beinvloeden. Ik zie daarin zelf nog geen oplossing.
 
Dus je hebt ergens een hulpbestand van een paar honderd regels, eerst maak je een paar honderd regels formules in het hoofdbestand, dan plak je die paar honderd regels erop en dan ga je de resultaten gaan bekijken op de andere blz.

Heb je anders een voorbeeldje van een 10-tal regels van dat hulpbestandje ? Dan kijk ik even wat ik kan doen
 
Dus je hebt ergens een hulpbestand van een paar honderd regels, eerst maak je een paar honderd regels formules in het hoofdbestand, dan plak je die paar honderd regels erop en dan ga je de resultaten gaan bekijken op de andere blz.

Heb je anders een voorbeeldje van een 10-tal regels van dat hulpbestandje ? Dan kijk ik even wat ik kan doen

Waarschijnlijk is mijn verhaal niet duidelijk geweest, dus zal nog een poging doen.
In mijn eerste post, zijn de bestanden ingevoegd zoals ik die gebruik in sterk vereenvoudigde versie.
Iedere uitvoerder heeft zo een eigen bestand, in mijn voorbeeld het ik slechts rij 6 tot 9 met formules gevuld. In rij 6 staat testbedrijf A ingevuld met de uren die Piet heeft gewerkt en rij 7 testbedrijf B idem.

Nu zou het in dit voorbeeld zou geweest kunnen zijn dat uitvoerder A rij 6 heeft geregistreerd en uitvoerder B rij 7. Die krijg ik dus appart aangeleverd, als ik dus bestand van uitvoerder A open heb ik rij 6, deze zet ik op mijn rechter scherm open en linker scherm de totale administratie.
Vervolgens selecteer ik in bestand van de uitvoerder kolom C tot kolom R, deze plak ik in een lege rij in de totale project adminstratie. Omdat we met dezelfde brongegevens werken vult hij dan direct de tarieven in en voor het projectnummer en weeknummer staat ook een formule.
Deze zelfde stappen onderneem ik voor de andere uitvoerder.

Maar als de rijen met formules op zijn dan ga ik dus rijen bij maken en de formules doortrekken.

Het tabblad hoofdbestand wordt gebruikt als projectadministratie en de inkoopfacturen worden hier ook ingevoerd. De vervolgtabbladen gebruiken we voor het printen van overzichten.

Ik hoop dat ik wat duidelijkheid heb geschept, want wordt wat complex om het op papier helder te maken krijg ik het idee.
 
ik krijg hem niet gerart binnen de max bestandsgrootte van deze site.
Je zult het moeten doen met deze code ofwel je emailadres opgeven
Code:
Option Explicit
Const MijnDir  As String = "c:\"   'verander hier het pad waar je files voor je leveranciersbestanden staan

Sub OphalenGegevens()
  Dim sPath As String, FileToOpen As Variant, DezeDir As String, HulpMap As Workbook, sFile As String, i As Long, j As Long
  Dim sh As Worksheet, Data() As Variant, c As Range, bOpen As Boolean

  sPath = MijnDir                                          'in dit pad staan de leveranciersbestanden
  If Right(sPath, 1) <> Application.PathSeparator Then sPath = sPath & Application.PathSeparator  'zet desnoods een "\" achter je pad
  DezeDir = CurDir                                         'onthoud huidige directory
  ChDir sPath                                              'ga naar leveranciersdirectory
  FileToOpen = Application.GetOpenFilename("Leveranciersbestanden (*.xls*), *.xls*")  'open venster om file te kiezen en laat ze kiezen
  FileToOpen = Replace(FileToOpen, "~$", "")               'in open files staat dit teken soms
  ChDir DezeDir                                            'keer terug naar oorspronkelijke map
  If FileToOpen = False Then                               'kijk wat er geselecteerd is, indien niets (=annuleren)
    MsgBox "je hebt niets gekozen, einde verhaal"          'einde verhaal
    Exit Sub
  Else
    On Error Resume Next                                   'doorgaan bij fouten
    sFile = Mid(FileToOpen, InStrRev(FileToOpen, "\") + 1, 255)  'deel na het laatste "\"-teken in die tekst
    Set HulpMap = Nothing                                  'hulpje resetten
    Set HulpMap = Workbooks(sFile)                         'kijk of geselecteerde map al niet open staan
    bOpen = (Not HulpMap Is Nothing)
    If Not bOpen Then                                      'is hulpje niets, dan is die map niet open
      Workbooks.Open FileToOpen                            'open ze dan
      Set HulpMap = Workbooks(sFile)                       'kijk of geselecteerde map al niet open staan
      If HulpMap Is Nothing Then MsgBox " ik krijg die map niet open": Exit Sub  'hulpje nog altijd niets, dan heb je een probleem = stoppen
    End If
    
    Application.ScreenUpdating = False
    
    With HulpMap                                           'met die map
      For Each sh In .Sheets                               'loop 1 voor 1 alle werkbladen af
        With sh                                            'in dat werkblad
          i = WorksheetFunction.Max(.Range("A" & Rows.Count).End(xlUp).Row, .Range("B" & Rows.Count).End(xlUp).Row, .Range("C" & Rows.Count).End(xlUp).Row, .Range("D" & Rows.Count).End(xlUp).Row, .Range("E" & Rows.Count).End(xlUp).Row)  'laatst gevulde rij voor A tot E
          If i > 3 Then                                    'laatste rij  groter dan 3
            ReDim Data(i - 4, 5)                           'maak een array klaar kwa omvang
            For j = 0 To UBound(Data)                      'rij per rij invoeren
              Data(j, 0) = IIf(.Range("C1").Value = "", "???", .Range("C1").Value)  '1e element = datum, indien niet gekend "???"
              Data(j, 1) = sh.Name                         'leveranciersnaam
              Data(j, 2) = .Cells(j + 4, "A").Value        'machine
              Data(j, 3) = .Cells(j + 4, "E").Value        'werknemer
            Next
          End If
          Set c = ThisWorkbook.Sheets("Hoofdbestand").Range("D" & Rows.Count).End(xlUp).Offset(1)  'eerstvolgende lege cel in de D-kolom van "hoofdbestand"
          If c.Row > 6 Then                                '6 is de 1e rij met gegevens in "hoofdbestand"
            c.Offset(-1).EntireRow.Copy                    'kopieer de ganse rij ervoor
            With c.Resize(UBound(Data) + 1).EntireRow      'naar alle straks in te vullen rijen
              .PasteSpecial xlPasteFormulas                'plak de formules
              .PasteSpecial xlPasteValidation              ' en de validaties
              .SpecialCells(xlConstants).ClearContents     'maak cellen met tekst leeg
              .SpecialCells(xlNumbers).ClearContents       'maak cellen met tekst leeg
            End With
            c.Resize(UBound(Data) + 1, UBound(Data, 2) + 1).Value = Data  'schrijf daar alle gegevens
          End If
        End With
      Next
    End With
    If Not bOpen Then HulpMap.Close False                  'als de map niet open was, dan sluit je hem zonder opslaan
  End If

  With Application
    .CutCopyMode = False
    .Goto ThisWorkbook.Sheets("Hoofdbestand").Range("D" & Rows.Count).End(xlUp).Offset(1)  'eerstvolgende lege cel in de D-kolom van "hoofdbestand"
    .ScreenUpdating = True
  End With

End Sub
 
Laatst bewerkt:
ik krijg hem niet gerart binnen de max bestandsgrootte van deze site.
Je zult het moeten doen met deze code ofwel je emailadres opgeven
Code:
Option Explicit
Const MijnDir  As String = "c:\"   'verander hier het pad waar je files voor je leveranciersbestanden staan

Sub OphalenGegevens()
  Dim sPath As String, FileToOpen As Variant, DezeDir As String, HulpMap As Workbook, sFile As String, i As Long, j As Long
  Dim sh As Worksheet, Data() As Variant, c As Range, bOpen As Boolean

  sPath = MijnDir                                          'in dit pad staan de leveranciersbestanden
  If Right(sPath, 1) <> Application.PathSeparator Then sPath = sPath & Application.PathSeparator  'zet desnoods een "\" achter je pad
  DezeDir = CurDir                                         'onthoud huidige directory
  ChDir sPath                                              'ga naar leveranciersdirectory
  FileToOpen = Application.GetOpenFilename("Leveranciersbestanden (*.xls*), *.xls*")  'open venster om file te kiezen en laat ze kiezen
  FileToOpen = Replace(FileToOpen, "~$", "")               'in open files staat dit teken soms
  ChDir DezeDir                                            'keer terug naar oorspronkelijke map
  If FileToOpen = False Then                               'kijk wat er geselecteerd is, indien niets (=annuleren)
    MsgBox "je hebt niets gekozen, einde verhaal"          'einde verhaal
    Exit Sub
  Else
    On Error Resume Next                                   'doorgaan bij fouten
    sFile = Mid(FileToOpen, InStrRev(FileToOpen, "\") + 1, 255)  'deel na het laatste "\"-teken in die tekst
    Set HulpMap = Nothing                                  'hulpje resetten
    Set HulpMap = Workbooks(sFile)                         'kijk of geselecteerde map al niet open staan
    bOpen = (Not HulpMap Is Nothing)
    If Not bOpen Then                                      'is hulpje niets, dan is die map niet open
      Workbooks.Open FileToOpen                            'open ze dan
      Set HulpMap = Workbooks(sFile)                       'kijk of geselecteerde map al niet open staan
      If HulpMap Is Nothing Then MsgBox " ik krijg die map niet open": Exit Sub  'hulpje nog altijd niets, dan heb je een probleem = stoppen
    End If
    
    Application.ScreenUpdating = False
    
    With HulpMap                                           'met die map
      For Each sh In .Sheets                               'loop 1 voor 1 alle werkbladen af
        With sh                                            'in dat werkblad
          i = WorksheetFunction.Max(.Range("A" & Rows.Count).End(xlUp).Row, .Range("B" & Rows.Count).End(xlUp).Row, .Range("C" & Rows.Count).End(xlUp).Row, .Range("D" & Rows.Count).End(xlUp).Row, .Range("E" & Rows.Count).End(xlUp).Row)  'laatst gevulde rij voor A tot E
          If i > 3 Then                                    'laatste rij  groter dan 3
            ReDim Data(i - 4, 5)                           'maak een array klaar kwa omvang
            For j = 0 To UBound(Data)                      'rij per rij invoeren
              Data(j, 0) = IIf(.Range("C1").Value = "", "???", .Range("C1").Value)  '1e element = datum, indien niet gekend "???"
              Data(j, 1) = sh.Name                         'leveranciersnaam
              Data(j, 2) = .Cells(j + 4, "A").Value        'machine
              Data(j, 3) = .Cells(j + 4, "E").Value        'werknemer
            Next
          End If
          Set c = ThisWorkbook.Sheets("Hoofdbestand").Range("D" & Rows.Count).End(xlUp).Offset(1)  'eerstvolgende lege cel in de D-kolom van "hoofdbestand"
          If c.Row > 6 Then                                '6 is de 1e rij met gegevens in "hoofdbestand"
            c.Offset(-1).EntireRow.Copy                    'kopieer de ganse rij ervoor
            With c.Resize(UBound(Data) + 1).EntireRow      'naar alle straks in te vullen rijen
              .PasteSpecial xlPasteFormulas                'plak de formules
              .PasteSpecial xlPasteValidation              ' en de validaties
              .SpecialCells(xlConstants).ClearContents     'maak cellen met tekst leeg
              .SpecialCells(xlNumbers).ClearContents       'maak cellen met tekst leeg
            End With
            c.Resize(UBound(Data) + 1, UBound(Data, 2) + 1).Value = Data  'schrijf daar alle gegevens
          End If
        End With
      Next
    End With
    If Not bOpen Then HulpMap.Close False                  'als de map niet open was, dan sluit je hem zonder opslaan
  End If

  With Application
    .CutCopyMode = False
    .Goto ThisWorkbook.Sheets("Hoofdbestand").Range("D" & Rows.Count).End(xlUp).Offset(1)  'eerstvolgende lege cel in de D-kolom van "hoofdbestand"
    .ScreenUpdating = True
  End With

End Sub

Liever dan via de mail zodat ik het een en ander kan bekijken, dit komt nog al overweldigend over maar wel interresant :)
Mijn mailadres j(punt)joosse(apestaart)(punt)nl alles wat tussenhaakjes staat natuurlijk even omzetten naar werkelijke leestekens ivm spam.

Gr. Jan
 
vermoedelijk moet er nog iets komen tussen apestaart en nl
 
mijn mail gekregen ?
 
2e poging net vertrokken
 
Helaas is de mail met bijlage nog nooit aangekomen hier.

Zou je nog een poging willen doen?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan