[VBA EXCEL] modules overzetten naar ander bestand?

Pagina: 1
Acties:
  • 561 views sinds 30-01-2008
  • Reageer

  • chicky
  • Registratie: Augustus 2001
  • Laatst online: 01-06 15:35
Hoi,

Ik heb voor mijn werk een calculatie programma gemaakt om bij een bepaald staalprofiel een bepaalde bekledingsdikte uit te rekenen en nog veel meer.

Als je niet geintresserd bent in de achtergrond, ga naar VRAAGSTELLING

In het Excel bestand is onder andere een blad met daarin ongeveer 2000 verschillende staalprofielen met specifieke bijbehorende gegevens zoals hoogte, breedte enz. enz.
Ook is er een invul blad waar je een bepaald profiel kan selecteren (middels een combo box), waarna bepaalde data in bepaalde cellen wordt gezet.

Tot nu toe allemaal erg simpel en standaard Excel.

Om een bepaalde bekledingsdikte bij een bepaald staalprofiel uit te kunnen rekenen (wat dan ook nog eens voor 12 verschillende bekledings soorten kan) heb ik allerlei grafieken omgerekend naar 4de machtsvergelijkingen en deze in VBA gegooid, waarna er van alles wordt uitgerekend.

Nu alles werkt hartstikke goed, maar als een calculatie wordt gemaakt en wordt opgeslagen, dan wordt het gehele Excel bestand opgeslagen.
Wijzigingen van bijv. prijzen worden in de reeds opgeslagen bestanden niet meer meegenomen (logisch) en de Excel bestanden worden ondertussen een beetje te groot, 2Mb per stuk, mede doordat er allerlei data zoals de afmetingen en soorten profielen en ongeveer 5000 regels VBA steeds opnieuw worden opgeslagen.

VRAAGSTELLING

1. Kan ik in Excel modules aanroepen uit een ander Excel bestand dan waar ik in aan het werk ben, zo ja hoe? (met als doel een klein bestandje over te houden waarin alleen de ingevulde en de uitgerekende data zich bevind), of wordt het geheel heel langzaam omdat er constant naar een ander bestand moet worden geschakeld?

2. Is het mogelijk en zinvol om in ACCESS zeer grote en complexe berekeningen uit te laten voeren, zoals 4de machts vergelijkingen oplossen en interpoleren tussen verschillende vergelijkingen? (voordeel is bijvoorbeeld dat ik de data dan in een externe tabel makkelijk kan opslaan en de modules e.d. makkelijk up to date kan houden)

Graag gefundeerd advies.

Als jullie nog iets willen weten hoor ik het graag.

  • WillyF
  • Registratie: Augustus 2003
  • Laatst online: 10-04-2024
Ik kan je alleen een beetje behulpzaam zijn bij vraag 1.

Als ik dat zo lees, heb je alles in één excel-bestand staan.

Eenzelfde probleem heb ik gehad bij het opzetten van een soort urenregistratiesysteem in excel.
Het bestand werd echter veel te groot, wat het constant opslaan niet ten goede kwam.

Uiteindelijk ben ik ertoe overgegaan om het bestand te splitsen in
- een bestand met VBA-code en userforms
- een bestand met de gegevens van werknemers
- een bestand met werkbladen voor mogelijke werkzaamheden en allerlei codereingen daarvoor
- een bestand waar hun uren met werkzaamheden worden opgeslagen.

Wijzigde je gegevens van werknemers, dan hoefde enkel het werknemersbestand te worden opgeslagen. En na het invullen van hun werkzaamheden en de daaraan bestede tijd, hoefde alleen het urenbestand te worden opgeslagen.

In jouw geval, is het daarom waarschijnlijk ook zinvol, om het bestaande excel bestand te splitsen, in bijv.
- bestand met enkel VBA-code (codebestand)
- bestand met staalprofielen (staalbestand)
- bestand met een invulformulier (formulierbestand)
- bestand met uitkomsten van berekeningen (uitkomstenbestand)

Als je het codebestand opent, moeten de andere 3 bestanden ook worden geopend:

Bij ThisWorkbook van codebestand,
code:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Workbook_Open()

    strCodebestandPad = ThisWorkbook.Path
    Workbooks.Open (strCodebestandPad & "\" & strNaamVanStaalBestand)
    Set WbStaalBestand = Workbooks(strNaamVanStaalBestand)
    set WsStaal = WbSTaalBestand.Worksheets(strNaamVanWerkbladMetStaalProfielen)

    Workbooks.Open(strCodebestandPad & "\" & strNaamVanFormulierbestand)
    Set WbFormulier = Workbooks(strNaamVanFormulierbestand)
    Set WsFormulier = WbFormulier.Worksheets(strNaamVanWerkbladMetFormulier)
    ... etc ....
End Sub


Als je een bepaald staalprofiel hebt gekozen (bijv. dmv een combobox in een userform) kun je de gegevens van dat staalprofiel overbrengen naar een werkblad op het formulierbestand, waar nog wat andere parameters kunnen worden ingevuld.
code:
1
2
3
4
5
6
7
8
9
10
Private Sub KopieerGelezenGegevens()
    lngRijVanStaal = lngWelkeRij
    Set rnStaalDikteUItGelezen = wsStaal.Cells(lngRijVanStaal, lngKolomMetStaalDikte)
    lngStaalDikte = rnStaalDikteUitGelezen

    Set rnStaalDikteOpFormulier = wsFormulier.Range("F6")
    rnStaalDikteOpFormulier = lngStaalDikte

    ... etc ....
End Sub


Op dat werkblad van het formulierbestand moet dan wel een knop geplaatst zijn. Hieraan kan een public sub uit het codebestand worden toegewezen (alsof het een macro is), voor het maken van de berekening. Deze public sub kan je toewijzen aan die knop op het werkblad, wanneer het codebestand en het formulierbestand beide open zijn.

Deze public sub (uit het codebestand) moet dan alle nodige gegevens uitlezen van het werkblad in het formulierbestand, de berekeningen erop loslaten, en de uitkomsten wegschrijven op een werkblad in het uitkomstenbestand.

En alleen het uitkomstenbestand wordt dan opgeslagen.

The trouble of being a troubleshooter is when trouble starts to shoot back


  • chicky
  • Registratie: Augustus 2001
  • Laatst online: 01-06 15:35
[/quote]
Op dat werkblad van het formulierbestand moet dan wel een knop geplaatst zijn. Hieraan kan een public sub uit het codebestand worden toegewezen (alsof het een macro is), voor het maken van de berekening. Deze public sub kan je toewijzen aan die knop op het werkblad, wanneer het codebestand en het formulierbestand beide open zijn.

Deze public sub (uit het codebestand) moet dan alle nodige gegevens uitlezen van het werkblad in het formulierbestand, de berekeningen erop loslaten, en de uitkomsten wegschrijven op een werkblad in het uitkomstenbestand
[quote]

Wat ik vergeten ben te melden is dat ik geen sub's heb gemaakt, maar alleen maar functions.
In mijn werkbladen worden alle waarden uitgerekend door gebruik te maken van functions.

Ik heb geprobeerd om functions als Public te definieren, maar dat lukt niet.
Het voorstel wat je geeft, is eigenlijk precies wat ik bedoel, nu nog de uitvoering.

  • Boss
  • Registratie: September 1999
  • Laatst online: 21:43

Boss

+1 Overgewaardeerd

Ik zou de boel naar Access overzetten, of in een andere taal iets maken. Heb wel eens iets soortgelijks gemaakt voor een dozen fabrikant die eerst ook in Excel bezig was. En ja, alle problemen die jij beschrijft: te veel data, onoverzichtelijk, lastig bij te werken... Excel is hier in ieder geval zeker niet de juiste tool hiervoor.

Je zou eens kunnen kijken of je een add-in kan maken voor Excel, maar ik denk dat je daar niet ver mee komt.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • WillyF
  • Registratie: Augustus 2003
  • Laatst online: 10-04-2024
OK,

Dan komen er dus extra stappen tussen.

Ik ga ervan uit dat de Public Sub DoeDeBerekening in het codebestand staat.
Deze Publieke Sub is dan ook zichtbaar in het formulierbestand.
WsFormulier is dan het werkblad in het Invulformulierbestand.
WsUitkomst is het werkblad in het uitkomstenbestand.

In de Private Sub MaakBerekendeWaardes worden de berekende waardes m.b.v. je functies gemaakt.
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
Public Sub DoeDeBerekening()
    LeesWaardenUItWsFormulier
    MaakBerekendeWaardes
    SchrijfWaardenNaarWsUitkomst
End Sub

Private Sub LeesWaardenUitWsFormulier()
    With WsFormulier
        GelezenWaarde1 = .Cells(Rij1,Kolom1)
        GelezenWaarde2 = .Cells(Rij2,Kolom2)
        'enzovoorts ....
    End With
End Sub

Private Sub MaakBerekendeWaardes()
    BerekendeWaarde1 = FunctieDinges(GelezenWaarde1)
    BerekendeWaarde2 = FunctieDinges(GelezenWaarde2)
    'enzovoorts ...
End Sub

Private Sub SchrijfWaardenNaarWsUitkomst
    With WsUitkomst
        .Cells(UItkomstRIj1, UItkomstKolom1) = BerekendeWaarde1
        .Cells(UitkomstRij2, UItkomstKolom2) = BerekendeWaarde2
        'enzovoorts
    End With
End Sub

The trouble of being a troubleshooter is when trouble starts to shoot back