Avatar billede biscon Nybegynder
28. juni 2005 - 18:53 Der 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.
Avatar billede joern Nybegynder
28. juni 2005 - 19:27 #1
Hej.

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.

M.v.h. Jørn
Avatar billede bak Forsker
28. juni 2005 - 19:28 #2
Jeg forstår ikke lige det med at arrays ikke kan være public
det her går da fint

Public MyArray(4)

Sub nr1()
MyArray(0) = "nul"
MyArray(1) = "et"
MyArray(2) = "to"
MyArray(3) = "tre"
End Sub

Sub nr2()
MsgBox MyArray(2)
End Sub
Avatar billede martin_moth Mester
28. juni 2005 - 19:59 #3
Jeg tror bare at arrays ikke må være erklæret som public i moduler? Eller?

Nå, ser vi lige fbort fra arrays, kan jeg nu ikke se problemet i at have globale variable.

Hvorfor er følgende så slemt:

Hav et modul med alle de globale variabler erklæret i. F.eks. "ModulGlobal". Hav også en form, "MinForm", og en Sub, "MinSub".

I ModulGlobal Skriver du:
  Public A as integer 'Erklærer alle globale variable her

I MinSub skriver du:
  ModulGlobal.A = 5  'Laver bereginger på globale variable

I MinForm skriver du
  Msgbox "Værdien af A er : " & ModulGlobal.A 'Bruger de globale variable

Kan ikke se at det store problem i at gøre ovenstående...
Avatar billede martin_moth Mester
28. juni 2005 - 20:00 #4
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
Avatar billede bak Forsker
28. juni 2005 - 20:11 #5
må og må.... man kan. Der er ingen problemer med at overføre mellem moduler eller forms/klassemoduler indenfor samme workbook.
Avatar billede martin_moth Mester
28. juni 2005 - 23:11 #6
ok. Mente "kan" :o). Og det er åbenbart ikke noget problem. Jeg synes ikke ovenstående princip er hverken rodet, grim, dårlig eller uoverskuelig...
Avatar billede biscon Nybegynder
29. juni 2005 - 03:40 #7
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.

tak for responsen alle sammen :)
Avatar billede martin_moth Mester
29. juni 2005 - 09:26 #8
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
Avatar billede biscon Nybegynder
29. juni 2005 - 16:04 #9
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?.

Tak for hjælpen alle
Avatar billede martin_moth Mester
29. juni 2005 - 22:58 #10
Hvis du vil fordele points, kræver det at dem du vil fordele imellem alle har givet svar, og ikke kommentarer. Tak for points
Avatar billede martin_moth Mester
29. juni 2005 - 22:59 #11
PS. bak/joern. nu fik jeg dem alle - vil I have nogle af dem?
Avatar billede joern Nybegynder
30. juni 2005 - 00:42 #12
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.

M.v.h.  Jørn
Avatar billede martin_moth Mester
30. juni 2005 - 09:06 #13
if-then-else?
Avatar billede bak Forsker
30. juni 2005 - 22:17 #14
nej, ellers tak :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester