Avatar billede perhol Seniormester
05. december 2007 - 22:42 Der er 15 kommentarer og
1 løsning

VBA kode til at skrive på statuslinjen

Eksperten Spørgsmål

Jeg er ved at lave et system til at lave vagtplan på min

arbejdsplads.
I den forbindelse har jeg ledt efter en eller anden måde at holde

øje med hvad hver enkelt ansats timenorm er, hvor mange timer hver

enkelt har i en rulleplan samt hvor mange timer hver enkelt har i en

udfyldt vagtplan.
Det har jeg overhovedet ikke kunnet finde ud af.
Så var det jeg kom i tanker om en metode til at overtage

statuslinjen i Excel ved hjælp af VBA.
Det kan jo nok bruges til mange ting.
Nu bruger jeg det, sådan her, til at vise meddelelser på

statuslinjen når rulleplanen bliver kopieret til vagtplanen:

----------
'VBA overtager kontrollen med statuslinjen
Application.DisplayStatusBar = True
'VBA viser meddelelser i statuslinjen efterhånden som SubRutinen

skrider fremad
Application.StatusBar = "Kopierer Rulleplan til Vagtplan" & " :  Hus

A - Uge 1 "
Application.StatusBar = "Kopierer Rulleplan til Vagtplan" & " :  Hus

A - Uge ...o.s.v "
Application.StatusBar = "Kopiering af Rulleplan til Vagtplan er

færdig"
'VBA venter 2 sekunder
Application.Wait (Now + TimeValue("00:00:02"))
'VBA giver kontrollen med Statuslinjen tilbage til Excel
    Application.StatusBar = False
----------

Det må da kunne bruges til at hente navn på ansat samt tilhørende

timenorm, rulleplantimer og vagtplantimer i perioden og vise det på

statuslinjen. Så ville det heller ikke tage ret meget plads op på

skærmen.

Det skulle gerne hente data når man markerer en celle på arket

[Uge1] i området [B4:AJ41]. Navnet der skal bruges står i kolonne

[A] i den række hvor man markerer en celle.

Alle data findes på arket [Ansatte].

De ansattes navne i området [A4:A41]

Timenormer i området [D4:D41].

Rulleplantimer i området [E4:E41]

Vagtplantimer i området 8F4:F41]

Jeg forestiller mig at VBA koden erklærer 3 variabler, [TN], [RP] og

[VP], ved hjælp af lookup henter de værdier der tilhører navnet i

kolonne [A] i samme række som den markerede celle og tildeler dem

til variablerne.

Kan det lade sig gøre?
Avatar billede excelent Ekspert
05. december 2007 - 23:14 #1
Noget i denne stil - indsættes i arkets kodemodul (uge1)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
navn = Cells(Target.Row, 1)
TimeNorm = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 3)
Rullepl = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 4)
Vagtpl = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 5)
Application.StatusBar = navn & " TimeNorm " & TimeNorm & " Rulleplan " & Rullepl & " Vagtplantimer " & Vagtpl
End Sub
Avatar billede excelent Ekspert
05. december 2007 - 23:17 #2
variabler forkortet, hjælper nok på de lange linier

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
navn = Cells(Target.Row, 1)
TN = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 3)
RP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 4)
VP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 5)
Application.StatusBar = navn & " TimeNorm " & TN & " Rulleplan " & RP & " Vagtplantimer " & VP
End Sub
Avatar billede perhol Seniormester
05. december 2007 - 23:56 #3
Jeg får en fejlmelding ved markering af en celle i området på [Uge1]
'Ambigouous name detected: Worksheet_SelectionChange' i linjen
'Private Sub Worksheet_SelectionChange(ByVal Target As Range)'

Kan det være fordi der i forvejen ligger en Sub i arket hvor første linje begynder med
'Private Sub Worksheet_Change(ByVal Target As Excel.Range)'
Avatar billede perhol Seniormester
05. december 2007 - 23:57 #4
Den ser ellers rigtig ud, din kode. Sweet & Short ;-)
Avatar billede excelent Ekspert
06. december 2007 - 00:05 #5
ja der kan kun være 1
Avatar billede perhol Seniormester
06. december 2007 - 00:08 #6
Der er sørme også en Sub med præcis samme startlinje som din !
Den kalder en kalender når området [$B$2:$F$2] markeres.
Avatar billede perhol Seniormester
06. december 2007 - 00:09 #7
Kan jeg så evt sætte koden ind i den jeg nævnte 00:08:40

Her er Sub'ens fulde kode:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Select Case Target.Address
        Case "$B$2:$F$2"
        Call OpenCalendar
    End Select
End Sub
Avatar billede perhol Seniormester
06. december 2007 - 00:11 #8
Sjovt egentlig, at jeg ikke er løbet ind i det før, sådan som jeg ligger og roder rundt med andres koder uden til fulde at forstå dem!
Avatar billede excelent Ekspert
06. december 2007 - 00:28 #9
den skal nok fintunes, men nu er det sengetid :-)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 1 And Target <> "" Then
navn = Cells(Target.Row, 1)
TN = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 3)
RP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 4)
VP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 1).Offset(0, 5)
Application.StatusBar = navn & " TimeNorm " & TN & " Rulleplan " & RP & " Vagtplantimer " & VP
End If
If Target.Row = 2 Then
Call OpenCalendar
End If
End Sub
Avatar billede perhol Seniormester
06. december 2007 - 01:26 #10
Virker ikke.
Nærmere forklaring i morgen eftermiddag.
Godnat
Avatar billede excelent Ekspert
06. december 2007 - 06:31 #11
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column > 1 And Target.Row > 3 And Target.Column < 37 And Target.Row < 42 And Cells(Target.Row, 1) <> "" Then
On Error Resume Next ' hvis navn i uge1 ikke findes i Ansatte
navn = Cells(Target.Row, 1)
TN = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 4)
RP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 5)
VP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 6)
Application.StatusBar = navn & " TimeNorm " & TN & " Rulleplan " & RP & " Vagtplantimer " & VP
End If
If Target.Row = 2 And Target.Column > 1 And Target.Column < 7 Then
Call OpenCalendar
End If
End Sub
Avatar billede perhol Seniormester
06. december 2007 - 16:04 #12
Nu virker det  -  sådan da.
Det er de rigtige værdier der hentes og min kalenderkontrol virker.
Værdierne vises bare forkert.
Sådan her skulle de se ud:
Per - Timenorm = 148:00 - Rulleplan = 142:30 - Vagtplantimer = 142:30

Sådan her ser de ud nu:

Per - Timenorm = 6,16666666666667 - Rulleplan = 5,9375 - Vagtplantimer = 5,9375

Ganger jeg tallene med 24 får jeg det korrekte tal, men som decimaltal.
Er det muligt at sætte formatet til [t]:mm i statusbaren?

Desuden mangler der noget der kan give kontrollen over statuslinjen tilbage til Excel (altså fjerne værdierne i statuslinjen igen), men det har jeg løst ved at indsætte 'Application.Statusbar = False' et par steder. Det skal jeg nok så gøre først i arkkoden på hvert ark. Koden ser derefter sådan her ud:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.StatusBar = False
If Target.Column > 1 And Target.Row > 3 And Target.Column < 37 And Target.Row < 42 And Cells(Target.Row, 1) <> "" Then
On Error Resume Next ' hvis navn i uge1 ikke findes i Ansatte
navn = Cells(Target.Row, 1)
TN = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 4)
RP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 5)
VP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 6)
Application.StatusBar = navn & " - TimeNorm = " & TN & " - Rulleplan = " & RP & " - Vagtplantimer = " & VP
End If
If Target.Row = 2 And Target.Column > 1 And Target.Column < 7 Then
Application.StatusBar = False
Call OpenCalendar
End If
Avatar billede excelent Ekspert
06. december 2007 - 17:36 #13
prøv denne :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column > 1 And Target.Row > 3 And Target.Column < 37 And Target.Row < 42 And Cells(Target.Row, 1) <> "" Then
On Error Resume Next ' hvis navn i uge1 ikke findes i Ansatte
navn = Cells(Target.Row, 1)
TN = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 4).Text
RP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 5).Text
VP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 6).Text
Application.StatusBar = navn & " TimeNorm " & TN & " Rulleplan " & RP & " Vagtplantimer " & VP
End If
If Target.Row = 2 And Target.Column > 1 And Target.Column < 7 Then
Call OpenCalendar
End If
End Sub

m.h.t. nustilling af statusbar, så har du fat i det rigtige
se her hvad F1-HJÆLP skriver.

This example sets the status bar text to "Please be patient..." before it opens the workbook Large.xls, and then it restores the default text.

oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = "Please be patient..."
Workbooks.Open filename:="LARGE.XLS"
Application.StatusBar = False
Application.DisplayStatusBar = oldStatusBar
Avatar billede perhol Seniormester
06. december 2007 - 20:30 #14
Fantastisk. Akkurat som jeg havde tænkt det skulle virke. Bare .Text efter variablerne. Så lidt der skal til når man ved hvordan. Jeg har ændret en lille smule i visningen på statuslinjen og tilføjet en enkelt Application.StatusBar = False. Her er den færdige kode:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column > 1 And Target.Row > 3 And Target.Column < 37 And Target.Row < 42 And Cells(Target.Row, 1) <> "" Then
        On Error Resume Next ' hvis navn i uge1 ikke findes i Ansatte
            navn = Cells(Target.Row, 1)
            TN = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 4).Text
            RP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 5).Text
            VP = Sheets("Ansatte").Cells(Sheets("Ansatte").Range("A4:A41").Find(navn, LookIn:=xlValues).Row, 6).Text
            Application.StatusBar = navn & " - TimeNorm " & TN & " timer  -  Rulleplan " & RP & " timer  -  Vagtplan " & VP & " timer"
    End If
    If Target.Row = 2 And Target.Column > 1 And Target.Column < 7 Then
        Application.StatusBar = False
            Call OpenCalendar
    End If
End Sub

Nu skal jeg bare have lagt koden i fire andre ark.
Så mangler jeg kun at lave en fornuftig udskrift.
Tak for hjælpen. Læg et svar.
Avatar billede excelent Ekspert
06. december 2007 - 20:39 #15
velbekom
Avatar billede perhol Seniormester
06. december 2007 - 21:08 #16
Nå ja forresten, så ændrede jeg også lige din 'On Error Resume Next' til 'On Error GoTo Blank' og satte dette ind lige før 'End Sub':

Blank:
        Application.StatusBar = False
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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