06. maj 2021 - 17:50Der 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
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
#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
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
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
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.....
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
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 :-)
Synes godt om
Ny brugerNybegynder
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.