Avatar billede bufli Mester
06. maj 2021 - 17:50 Der er 14 kommentarer og
1 løsning

VBA (Excel): Kan public variabler holde en public værdi?

Hej,

Jeg kunne godt tænke mig indenfor et modul at kunne angive en værdi for mine public variabler, således jeg i hver makro i modulet ikke behøver at sætte værdien for variablerne, men jeg indenfor modulet kan gøre det en gang for alle.

Jeg har lavet et simplificeret eksempel herunder

I makroen "Multiply" sætter jeg værdien for 2 variable - hhv. BLUECELL og REDCELL.
I makroen "Divide" gør jeg det en gang mere.
Det jeg gerne vil opnå er, at værdierne for variablerne gælder i alle makroer indenfor modulet, således jeg kan fjerne de 2 første linkjer i makroerne "Multiply" og "Divide"

Brugsanvisning for eksemplet herunder:
1: Kør makroen "Farver" først
2: Kør makroen "Values" bagefter
3: Kør makroerne "Multiply" og "Divide" i vilkårlig rækkefølge

Option Explicit
    Public BLUECELL As Double
    Public REDCELL As Double
    Public GREENCELL As Double
    Public YELLOWCELL As Double
Sub Values()
    Sheets("Test").Range("C3").Value = 30
    Sheets("Test").Range("C5").Value = 20
End Sub
Sub Multiply()
    BLUECELL = Worksheets("Test").Range("C3").Value
    REDCELL = Worksheets("Test").Range("C5").Value
    GREENCELL = BLUECELL * REDCELL
    Sheets("Test").Range("J3").Value = GREENCELL
End Sub
Sub Divide()
    BLUECELL = Worksheets("Test").Range("C3").Value
    REDCELL = Worksheets("Test").Range("C5").Value
    GREENCELL = BLUECELL / REDCELL
    Sheets("Test").Range("J3").Value = GREENCELL
End Sub
Sub Farver()
    Range("C3").Select
    With Selection.Interior
        .Color = 15773696
    End With
    Range("C5").Select
    With Selection.Interior
        .Color = 255
    End With
    Range("J3").Select
    With Selection.Interior
        .Color = 5287936
    End With
    Range("J5").Select
    With Selection.Interior
        .Color = 65535
    End With
End Sub
Avatar billede store-morten Ekspert
06. maj 2021 - 20:46 #1
Prøv at lægge denne kode på arket: Test (ikke i et Modul)

Option Explicit
    Public BLUECELL As Double
    Public REDCELL As Double
    Public GREENCELL As Double
    Public YELLOWCELL As Double
   
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$3" Then BLUECELL = Worksheets("Test").Range("C3").Value
If Target.Address = "$C$5" Then REDCELL = Worksheets("Test").Range("C5").Value
End Sub
   
Sub Values()
    Sheets("Test").Range("C3").Value = 30
    Sheets("Test").Range("C5").Value = 20
End Sub

Sub Multiply()
    GREENCELL = BLUECELL * REDCELL
    Sheets("Test").Range("J3").Value = GREENCELL
End Sub

Sub Divide()
    GREENCELL = BLUECELL / REDCELL
    Sheets("Test").Range("J3").Value = GREENCELL
End Sub

Sub Farver()
    Range("C3").Interior.Color = 15773696
    Range("C5").Interior.Color = 255
    Range("J3").Interior.Color = 5287936
    Range("J5").Interior.Color = 65535
End Sub
Avatar billede bufli Mester
06. maj 2021 - 21:56 #2
#1
Tak Store-Morten. Det ser lovende ud. Det virker i hvert tilfælde i mit simplificerede eksempel.

I den virkelige verden, skal jeg have værdien mine variable tildeles være det range jeg har curseren stående i - det vil sige værdien skal ændre sig når jeg står i en celle og skifter til en anden.
Eksempelvis står curseren i A1. Så skal variablen have værdien A1. Curseren flyttes til A2, og variablens værdi ændres til A2.

Umiddelbart kan jeg ikke lige gennemskue hvordan dette kan indbygges, da den kode du har lavet, jo "låser fast" på værdien i en celle hvis du forstår hvad jeg mener
Avatar billede store-morten Ekspert
06. maj 2021 - 22:28 #3
Så kun på den ene variable?

Private Sub Worksheet_Change(ByVal Target As Range)
BLUECELL = Target
End Sub
Avatar billede store-morten Ekspert
06. maj 2021 - 22:53 #4
Det virker desværre ikke
Avatar billede bufli Mester
07. maj 2021 - 09:07 #5
Hej har prøvet med denne - det nærmer sig

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    BLUECELL = ActiveCell.Row
    MsgBox (BLUECELL)
End Sub
Avatar billede bufli Mester
07. maj 2021 - 09:34 #6
Jeg har simplificeret eksemplet. Jeg ønsker at en messagebox viser mig værdien i variablen TypeCell.

Værdien skal være "J" & "ActiveCell.Row"

2 eksempler
Hvis man står i celle C74, skal messagebox vise J74
Hvis man står i celle B78, skal messagebox vise J78

Jeg har i mit modul denne super simple makro:

Sub Test()
    MsgBox (TypeCell)
End Sub

På sheetet har jeg denne makro:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim TypeCell As String
    TypeCell = "J" & ActiveCell.Row
End Sub

Jeg ønsker altså at jeg i arket dimmer variablen og sætter værdien, så flere makroer i mit modul kan bruge disse, og jeg ikke behøver at dimme og sætte værdien i flere makroer

Men ovenstående virker ikke. Nogen gode ideer?
Avatar billede store-morten Ekspert
07. maj 2021 - 10:54 #7
Sub test()
MsgBox "J" & ActiveCell.Row
End Sub
Avatar billede bufli Mester
07. maj 2021 - 11:10 #8
Det jeg gerne vil have er, at rækkenummeret er gemt en gang for alle til alle makroer i modulet - hvad hedder dette? En Public variable value?

Ovenstående eksempel er stærkt simplificeret, men for at blive i eksemplet, vil jeg ikke skrive "MsgBox "J" & ActiveCell.Row" i 8 forskellige makroer i modulet, men derimod dimme TypeCell som String og derefter sætte den til f.eks. værdien J74.

Så vil jeg i hver af de 8 makroer skrive

Sub test()
MsgBox (TypeCell)
End Sub

I det virkelige eksempel er der mange variable og mange makroer der bruger de mange variable hvilket er årsagen til at det vil gøre mine makroer meget kortere hvis jeg ikke skal dimme variablerne i alle makroerne og så derefter sætte værdien for variablerne i alle makroerne.

Første skridt er at dimme variablen med "Public TypeCell As String". Så skal jeg ikke dimme i hver makro

Næste skridt er det som dette spørgmål går på, om jeg en gang for alle kan definere værdien af TypeCell, så jeg ikke skal sætte værdien for TypeCell 8 gange i 8 makroer
Avatar billede store-morten Ekspert
07. maj 2021 - 11:36 #9
Det er ikke nemt når du ændre eksempler :-)

Men tænk på du skal have indlæst dine variabler.
1. Når arket åbnes, eller
2. Når variablerne sættes, eller
3. Når de ændres, eller
4. Når du skifte celle, osv.....
Avatar billede bufli Mester
07. maj 2021 - 11:56 #10
Sorry - det er åbenbart ikke så let at forklare. Men helt simpelt:

Hvis min makro ser sådan ud:

Sub test()
MsgBox (TypeCell)
End Sub

Hvis vi så siger, at denne makro må vi ikke ændre på. Jeg skal have værdien på TypeCell stående som en public værdi i modulet eller sheetet
Avatar billede store-morten Ekspert
07. maj 2021 - 12:08 #11
Option Explicit
    Public BLUECELL As Double
    Public REDCELL As Double
    Public TypeCell As String
   
   
Private Sub SetVariabler()
BLUECELL = ActiveCell.Value
REDCELL = Worksheets("Test").Range("C5").Value
TypeCell = "J" & ActiveCell.Row
End Sub

Sub Sæt()
Call SetVariabler
End Sub
Avatar billede bufli Mester
07. maj 2021 - 12:21 #12
Det er faktisk ret godt tænkt. Det er lidt en workaround, men brugbart hvis man ikke kan sætte variabel værdierne public ligesom man kan dimme dem public - jeg prøver det lige af. Tak
Avatar billede bufli Mester
07. maj 2021 - 12:57 #13
Jeg kan ikke finde ud af hvorfor en af 3 variabler får sin værdi retur fra "SetVariabler" makroen, mens de 2 andre ikke gør.

Hvad kan det være?
Avatar billede store-morten Ekspert
07. maj 2021 - 13:30 #14
Jeg kan ikke gætte hvilken der gør hvad? ;-)
Avatar billede bufli Mester
07. maj 2021 - 15:42 #15
Nej - jeg forsøgte at lægge SetVariable makroen i et andet modul - jeg har nogle moduler der gør nogle ting men anvender et "globalt" modul der indeholder nogle makroer jeg kan kalde igen og igen.

Jeg kunne ikke få det til at køre når SetVariable lå i et andet modul, men da jeg kopierede det over i samme modul som de makroer der kalder SetVariable - så virkede det.

Mange tak for hjælpen. Mine 100 km. VBA kode bliver markant kortere nu :-)
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

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