28. juni 2005 - 18:53Der er
13 kommentarer og 1 løsning
Global data opbevaring
Hej
Jeg har tilbagevende problem med min alt for intensive og ufrivillige brug af Excel VBA til applikationsudvikling.
Det jeg leder efter er en måde hvorpå jeg kan gemme data i en del af programmet (en sub eller function) og hente det frem i en anden (en form, sub eller funktion). Uden at passe det som argumenter mellem alle funktionerne. Efter hvad jeg har kunnet læse mig til på nettet kan jeg lave en global variabel ved at skrive noget i retning af:
public Tal as Integer
Denne funktionalitet virker dog kun for visse datatyper (blandt andet ikke arrays) og globale variable er designmæssigt en grimt ting.
Mit næste forsøg var at lave et Class Module (VBA's "svar" på en på C++/smalltalk class) og gemme en referencen til den i en global variabel. Det virker heller ikke.
En grim løsning jeg kan komme i tanke om at gemmeværdier i et excel ark og så læse fra det i andre funktioner. Men det er en grim løsning at bruge GUI elementer til at opbevare data hvor det ikke er nødvendigt.
Lad mig prøve at definere mit problem lidt klarere. Forestil jer i har en sub der foretager en masse beregninger og initaliserer en form. Sub'en finder ligeledes en værdi der ikke skal vises på formen, men som skal benyttes når man trykker på en af formens knapper. Du kan ikke flytte udregningen af værdi'en til formen da den hører hjemme i et større beregnings arbejde i sub'en der initialiserer formen. Hvordan overfører du disse data? når du kalder formen med:
MinForm.Show
er det ikke muligt at give den med som argument. Det eneste jeg lige kan finde på er at gemme det i et excelark, men det er en lorteløsning.
Kan finde utrolig meget og god hjælp til VBA på nettet og i bøger men det her problem har jeg ikke kunnet finde et svar på, det må dog være simpelt og mig der ikke har fattet et grundlæggende aspekt af VBA.
Det er fortrinligt at du straks skriver, at det er en VBA-sag. Kategorien her er imidlertid Visual Basic, og VBA er (med det lidt jeg ved) en stakkels amputeret udgave af VB. Så det jeg kunne foreslå, vil ganske sikkert ikke fungere i VBA til Excel. Men kan du definere en global variabel, så gør da det, eller et dynamisk array hvis du har brug for flere værdier. I øvrigt bør du stille spørgsmålet under kategorien Excel, dér får du med større sandsynlighed svar end i denne om VB.
PS: Tror du får mere respons her, da spørgsmålet er mere relateret til VB end til Excel. Skulel du vælge kategorien Excel, ville kategorien Word vel være lige så passende... Men du har da fået et par indspark nu. Og nu vi er ved at rose hinanden, så er det rart at se at du gider beskrive problemet grundigt - og så skal du nok få svar
Måske har jeg lavet en syntax synes bare at huske den kom med en fejlmeddelse om at variabler af den type ikke kunne erklæres public. Tjekker op på det imorgen når jeg kommer på arbejde igen. Er overrasket og glad for den hurtige respons :). Derfor vil jeg snige et spørgsmål til ind. Er et class module det tætteste man kommer på en abstrakt datatype? eller kan man lave dem på en anden måde?.
I ved ala følgende C kode:
struct point { int x,y; };
En anden feature jeg savner men er agter at benytte de class modules der er. Derudover kunne jeg også godt tænke mig at vide om det er muligt at gemme en reference til en instants af et "objekt" i en public variable i et almindeligt modul.
Ikke helt med på hvad du mener med abstrakt datatype...
Du kan lave dine egne datatyper sådan her:
'erklæres i modul: Type Spillekort Farve as String Værdi as Byte End type
'Bruges i f.eks. en sub Dim Kort as spillekort kort.farve = "rød" Kort.værdi = 2
class moduler brues til at definere objekter (selvom VB jo ikke er 100% objektorienteret) Om en instans af et objekt kan være public, elelr erklæret i et modul, ved jeg ikke, men det er jo bare at prøve og se om den melder fejl. Husk når du opretter instanser af objekter, at nedlægge dem efter brug med Set MitObjekt = Nothing
Bak: Ja du har absolut ret, globale arrays er ikke et problem. Tror den gav mig fejl fordi jeg ikke brugte varianter men forsøgte at definere typen. Du skal dog have tak for at pointere det :).
martin_moth: Jeg regner med at benytte din ide med at samle alle public variabler alene i et modul. Så er der også lidt styr på det. Tak for den med Type.. der var præcis hvad jeg mente og kan godt forstå jeg ikke gav mening, men det var sent :).
Giver pointne til Martin da hans svar var mest hjælpfulde man bak og jer andre der har været inde over skal også have tak. Kunne man ikke engang fordele pointene mellem folk herinde?.
Nej Martin, det tror jeg godt du ved, at jeg ikke vil. Mit bidrag i tråden var desuden kun en opfordring til at flytte spørgsmålet. Ang. det med grim eller elegant programmering, er jeg da enig i at noget kan være kluntet og især uoverskueligt, med 7 if-then inden i hinanden. Men det var jo ikke substansen her. Vigtigt er, at der er gode kommentarer i kildeteksten, så man selv - eller andre - kan finde ud af at vedligeholde programmet.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.