Just nu i M3-nätverket
Gå till innehåll

VBA: infoga data i dolt blad, .select fungerar ej


FridaBergelin

Rekommendera Poster

FridaBergelin

Hej,

 

Har, med min light-kunskap i VBA, skapat ett makro som skickar inskrivna värden i ett antal celler till en annan flik för "datalagring" genom att trycka på en knapp.

 

Mitt problem är att jag skulle vilja dölja datalagringsfliken för att den inte ska kunna gå att ändra men jag får då ett felmeddelande att den select-metod som jag använt för att förflytta mig mellan flikarna inte fungerar. Finns det någon annan funktion eller ett sätt att komma runt detta?

 

Tacksam för hjälp!

 

MVH Frida Bergelin

 

Länk till kommentar
Dela på andra webbplatser

Bort med Select- och Activate-satser.

 

Alltså kod som

Blad1.Activate
Range("A1").Select
Selection = 5

bort bort bort

 

skriv istället

With Blad1
   .Range("A1") = 5
End With

Utan att se din kod kan jag inget mer ge.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

FridaBergelin

Tack T för snabbt svar. Jag är inte helt säker på att jag förstår så jag skickar lite kod:

 

Här börjar problemen i mitt makro. Jag har fram till hit haft det arbetsblad aktiverat där knappen till makrot är placerad (bladet heter "FM"). Här försöker jag byta arbetsblad för att kunna skriva in den data jag lagrat i Indata1-11. När "Datalagring FM" är dold fungerar detta inte.

 

 

 

'Gå till databladet
Sheets("Datalagring FM").Select

'Hitta första tomma rad
For i = 2 To 101
   If Not Cells(i, "G") = "" Then
       Index = Index + 1
   End If
Next i

'Skriv in data på första tomma rad
Cells(Index, "G") = Indata1
Cells(Index, "H") = Indata2
Cells(Index, "J") = Indata3
Cells(Index, "K") = Indata4
Cells(Index, "L") = Indata5
Cells(Index, "M") = Indata6
Cells(Index, "N") = Indata7
Cells(Index, "O") = Indata8
Cells(Index, "P") = Indata9
Cells(Index, "Q") = Indata10
Cells(Index, "R") = Indata11


'Gå tillbaka till inmatningsbladet
Sheets("FM").Select

 

-

 

Återigen, tacksam för hjälp

 

MVH Frida

ed av moderator - kod-taggar

 

 

[inlägget ändrat 2009-03-10 10:50:09 av Monshi]

Länk till kommentar
Dela på andra webbplatser

Som sagt, Select satser ska man inte använda. Enda tillfället de ska användas är när man ska uppmärksamma användaren på något, tvinga fokus till något som användaren ska använda. Annars är den bara resurskrävande.

 

Din kod är enkel att transformera till

'Adressera  databladet
With Worksheets("Datalagring FM")

'Hitta första tomma rad
Index = .cells(range("a:a").Cells.count, 7).end(xlUp).Offset(1)


'Skriv in data på första tomma rad
.Cells(Index, "G") = Indata1
.Cells(Index, "H") = Indata2
.Cells(Index, "J") = Indata3
.Cells(Index, "K") = Indata4
.Cells(Index, "L") = Indata5
.Cells(Index, "M") = Indata6
.Cells(Index, "N") = Indata7
.Cells(Index, "O") = Indata8
.Cells(Index, "P") = Indata9
.Cells(Index, "Q") = Indata10
.Cells(Index, "R") = Indata11


'Avsluta adressering
End With

sedan kan sägas att

Index - inte ett bra variabelnamn.

"G" osv, i sig bättre, enklare, med kolumnnumret

Indata1? Vad?

Kanske går att ersätta alla .Cells-anrop med en for-sats?

For clIndex = 7 to 17
  .Cells(rwIndex, clIndex) = ....
Next clIndex

 

sista ord, definiera alltid alla variabler. Se till att VBA kräver det. Ta upp alternativ för VBA-editorn och kryssa för Variabler måste deklareras. Då skrivs raden Option Explicit in överst i alla nya moduler.

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

FridaBergelin

Hej igen,

 

Jag har försökt infoga de rekommenderade ändringarna stegvis men får det tyvärr inte att fungera men jag är inte säker på att jag använder With-kommandot rätt. Jag får inget felmeddelande när jag kör makrot nedan, inte ens om "Datalagring FM" är dold vilket är bra, men jag får inte kopieringen av cellerna in i "Datalagring FM" att fungera. Från vad jag kan se läggs datan i de celler jag vill kopiera in i "Datalagring FM" i celler i ursprungsfliken "FM" där knappen med makrot sitter. Det blir alltså något fel i bytet mellan flikarna i koden.

 

Är det någon som kan se vad jag gör för fel eller komma med övriga tips?

 

Tack

 

//Frida

 

Sub RapporteraAFM()

If Range("D32") = "" Then
   If MsgBox("Du har inte angivit stopporsak", vbOKOnly, "Felmeddelande") = vbOK Then
           Exit Sub
   End If
End If

If Range("C38") = "0" Then
   If MsgBox("Du har inte angivit stopptid", vbOKOnly, "Felmeddelande") = vbOK Then
           Exit Sub
   End If
End If

'Definiera variabler
Index = 2
Indata1 = Range("C32")
Indata2 = Range("D32")
Indata3 = Range("F32")
Indata4 = Range("G32")
Indata5 = Range("H32")
Indata6 = Range("I32")
Indata7 = Range("J32")
Indata8 = Range("K32")
Indata9 = Range("L32")
Indata10 = Range("M32")
Indata11 = Range("N32")


'Adressera  databladet
With Worksheets("Datalagring FM")

'Hitta första tomma rad
For i = 2 To 101
   If Not Cells(i, "G") = "" Then
       Index = Index + 1
   End If
Next i

'Skriv in data på första tomma rad
Cells(Index, "G") = Indata1
Cells(Index, "H") = Indata2
Cells(Index, "J") = Indata3
Cells(Index, "K") = Indata4
Cells(Index, "L") = Indata5
Cells(Index, "M") = Indata6
Cells(Index, "N") = Indata7
Cells(Index, "O") = Indata8
Cells(Index, "P") = Indata9
Cells(Index, "Q") = Indata10
Cells(Index, "R") = Indata11

End With

'Gå till inmatningsbladet
With Worksheets("FM")

'Radera indatan
Range("C32") = ""
Range("F32") = ""
Range("G32") = ""
Range("H32") = ""
Range("I32") = ""
Range("J32") = ""
Range("K32") = ""
Range("L32") = ""
Range("M32") = ""
Range("N32") = ""

End With

End Sub

 

 

[inlägget ändrat 2009-03-13 10:47:39 av FridaBergelin]

 

ed av moderator:

Pls - kod-taggar vid kod!

 

 

 

[inlägget ändrat 2009-03-13 12:00:15 av Monshi]

Länk till kommentar
Dela på andra webbplatser

När man skriver en With-sats så sker adresseringen vidare på det objekt man använt vid deklarationen genom att inleda raden med .

 

dvs

With Blad1
  .Range("A1") = ""
End With

arbetar på Blad1

 

Om du skriver fel, som

With Blad1
   Range("A1") = ""
End With

 

kommer adresseringen ske likt du skrivit

ActiveSheet.Range("A1") = ""

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

FridaBergelin

Hej igen,

 

På grund av olika omständigheter har jag varit tvungen att ta bort de dolda arbetsbladen och försöker istället jobba med att låsa upp bladen i koden men nu har jag stött på problem, vad det beror på vet jag inte. Jag (och övriga som ger mig tips) är inte bekanta med With-kommandot därför har jag tvingats plocka bort det.

 

Mitt nuvarande problem: Efter att första tomma raden hittats ska det kopierade området klistras in med ActiveSheet.Paste men det fungerar inte. Varför?

 

Kan man skydda blad med lösenord och ändå låsa upp det i VBA-koden utan att lösenordet behöver knappas in?

 

Finns det en möjlighet att skriva motsvarande kod med With-kommandot så gör jag gärna det

 

Tack på förhand

 

MVH Frida

------------------------------------------------

 

Sub AvslutaskiftFM()

'Definiera variabler
Indata1 = Range("E24")
Indata2 = Range("F24")
Indata3 = Range("G24")
Indata4 = Range("H24")
Indata5 = Range("I24")
Indata6 = Range("J24")
Indata7 = Range("K24")
Indata8 = Range("L24")
Indata9 = Range("E28")
Indata10 = Range("F28")
Indata11 = Range("G28")
Indata12 = Range("H28")
Indata13 = Range("I28")
Indata14 = Range("J28")
Indata15 = Range("K28")
Indata16 = Range("L28")
Dim i As Integer


If Range("J19") = "Välj" Then
   If MsgBox("Du har inte angivit datum", vbOKOnly, "Felmeddelande") = vbOK Then
           Exit Sub
   End If
End If

If Range("J19") = "" Then
   If MsgBox("Du har inte angivit datum", vbOKOnly, "Felmeddelande") = vbOK Then
           Exit Sub
   End If
End If

If Range("H19") = "Välj" Then
   If MsgBox("Du har inte angivit skiftlag", vbOKOnly, "Felmeddelande") = vbOK Then
           Exit Sub
   End If
End If

If Range("H19") = "" Then
   If MsgBox("Du har inte angivit skiftlag", vbOKOnly, "Felmeddelande") = vbOK Then
           Exit Sub
   End If
End If

If Range("F19") = "Välj" Then
   If MsgBox("Du har inte angivit maskin", vbOKOnly, "Felmeddelande") = vbOK Then
           Exit Sub
   End If
End If

If Range("F19") = "" Then
   If MsgBox("Du har inte angivit maskin", vbOKOnly, "Felmeddelande") = vbOK Then
           Exit Sub
   End If
End If

'Gå till databladet
Sheets("Utfall").Select

ActiveSheet.Unprotect

'Skriv in värden
Cells(2, "K") = Indata1
Cells(3, "K") = Indata2
Cells(4, "K") = Indata3
Cells(5, "K") = Indata4
Cells(6, "K") = Indata5
Cells(7, "K") = Indata6
Cells(8, "K") = Indata7
Cells(9, "K") = Indata8
Cells(2, "L") = Indata9
Cells(3, "L") = Indata10
Cells(4, "L") = Indata11
Cells(5, "L") = Indata12
Cells(6, "L") = Indata13
Cells(7, "L") = Indata14
Cells(8, "L") = Indata15
Cells(9, "L") = Indata16

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

'Gå till Datalagring FM
Sheets("Datalagring FM").Select

ActiveSheet.Unprotect

AntRaderFM = WorksheetFunction.CountA(Sheets("Datalagring FM").Range("G2:G101"))

Range(Cells(2, 2), Cells(1 + AntRaderFM, 17)).Select

Selection.Copy

'Gå till Stopploggar
Sheets("Stopploggar").Select

ActiveSheet.Unprotect

'Hitta första tomma rad
Index = 1
For i = 1 To 302
   If Not Cells(i, "G") = "" Then
       Index = Index + 1
   End If
Next i

Cells(Index, "B").Select
[color="#ff0000"]ActiveSheet.Paste[/color]

Range("A1").Select

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True


'Gå till datalagring
Sheets("Datalagring FM").Select

Application.CutCopyMode = False
Range("A1").Select

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

'Gå till inmatningsbladet
Sheets("FM").Select

End Sub

 

Länk till kommentar
Dela på andra webbplatser

Select-satser ska ENBART användas när du behöver ta fram något för användaren. Aldrig annat

 

ActiveSheet-satser är som gjorda för att skapa fel! Inte alls trevligt om VBA-koden plötsligt skriver till fel blad.

 

Mina tips är enkla

1: Allockera alltid blad med With sats eller med deras VBA-namn

2: Alternativt, skapa namngivna unika referenser till celler, då räcker detta.

3: försök att alltid när du ska arbeta mot ett blad, arbeta med namngivna referenser.

4: For-satser är trevliga

5: Upprepa aldrig samma kod, skapa en subrutin som du anropar istället.

 

With är enkelt!

With myObject

ger att du kan nå detta objekts egenskaper via att inleda anropet med .

dvs

With Blad1
   .Range("A1") = "Hej"
End With

är exakt samma som att skriva

Blad1.Range("A1") = "Hej"

det förra är dock mycket enklare att hantera.

 

Första tomma rad?

Spela in ett makro när du står i en cell och trycker CTRL-Pil ned exempelvis. Den koden kan destilleras till:

Set myRn = Blad1.range("A1").End(xlDown)

så har du sista raden, eller första lediga på

myRn.Offset(1,0)

 

Paste?

Vi använder myRn

myRn.PasteSpecial xlPasteAll

 

jobba alltid med absoluta referenser. ALDRIG SELECT-satser. ALDRIG!

 

Låsa blad? Visst går det. Du får dock spara lösenordet i ditt VBA-projekt, som en variabel. Rekommenderas då att du skyddar projektet med lösenord också.

 

Exempelvis

Private Const BookPass = "dummy"
Private Sub SkyddaBlad(bl As Boolean)
   If bl Then
       Me.Protect BookPass
   Else
       Me.Unprotect BookPass
   End If

End Sub

där då ovanstående rutin finns på bladets kodblad. Me refererar till bladet koden står på, kan bytas ut mot annan referens om det står på annan plats

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

FridaBergelin

Hej,

 

Jag har försökt ta till mig tipsen men inser att jag inte kan tillräckligt än (har iaf beställt en bok). Nedanstående kod fungerar inte, jag försöker undvika att adressera ett blad med .Select men hittar ingen bra ersättningskod för den kod som fungerade när jag använde .Select.

 

Har rödmarkerat det som jag är osäker på och som jag tror eller vet inte fungerar

 

Tacksam för all hjälp!

 

Frida

 

'Gå till Datalagring FM
With Worksheets("Datalagring FM")

[color="#006400"]'Denna fungerar bra![/color]
AntRaderFM = WorksheetFunction.CountA(Sheets("Datalagring FM").Range("G2:G101"))

[color="#ff0000"]'Denna fungerar inte, vill markera området som innehåller text
.Range(Cells(2, 2), .Cells(1 + AntRaderFM, 17)).Select[/color]

[color="#ff0000"]'Vet inte om denna fungerar
Selection.Copy[/color]

End With

'Gå till Stopploggar
With Worksheets("Stopploggar")


'Hitta första tomma rad
'Index = 1
'For i = 1 To 302
   'If Not Cells(i, "G") = "" Then
       'Index = Index + 1
   'End If
'Next i

[color="#ff0000"]'Är detta rätt?
Set myRn = Stopploggar.Range("G1").End(xlDown)
Tomrad = myRn.Offset(1, 0)

Cells(Tomrad, "B").Paste[/color]

[color="#ff0000"]'Hur kan denna ersättas för att slippa .Select?
Range("A1").Select[/color]


End With

'Gå till datalagring
With Worksheets("Datalagring FM")

Application.CutCopyMode = False
Range("A1").Select


End With


End Sub

 

Länk till kommentar
Dela på andra webbplatser

Okej, har kommenterat i koden nedan:

'Gå till Datalagring FM
With Worksheets("Datalagring FM")

'Denna fungerar bra!
AntRaderFM = WorksheetFunction.CountA(Sheets("Datalagring FM").Range("G2:G101"))

   'ändring - Select är helt onödigt!
   .Range(Cells(2, 2), .Cells(1 + AntRaderFM, 17)).Copy

End With

'Gå till Stopploggar
With Worksheets("Stopploggar")


'Är detta rätt?
'korrekt - fungerar om det finns två värden i G, dvs ett i G1 och G2. Annars
' hamnar du på sista raden. Ja, testa med CTRl+pil ned
Set myRn = Stopploggar.Range("G1").End(xlDown)
'hämta rad förslagsvi
Tomrad = myRn.Offset(1, 0).Row
'missad . - adressering samt PasteSpecial krävs vid denna typ av kopiering
.Cells(Tomrad, "B").PasteSpecial xlPasteAll

'Hur kan denna ersättas för att slippa .Select?
'BORT BORT - varför Select?
'Range("A1").Select


End With

Application.CutCopyMode = False

 

samt en lite kompaktare kod:

 Dim rnTarget As Range, rnSource As Range
   Dim rwCount As Integer
   'hitta källa
   With Worksheets("Datalagring FM")
       rwCount = WorksheetFunction.CountA(Sheets("Datalagring FM").Range("G2:G101"))
       Set rnSource = .Range(Cells(2, 2), .Cells(1 + rwCount, 17))
   End With
   'hitta mål
   With Worksheets("Stopploggar")
       Set rnTarget = .Range("G1").End(xlDown).Offset(1)
   End With
   'kopiera allt
   rnSource.Copy rnTarget
   'eller kopiera bara värden, snabbt:
   'rnTarget.Resize(rnSource.Rows.Count, rnSource.Columns.Count) = rnSource

 

Deklarera alltid dina variabler, ställ in VBA-editorn så att den kräver det.

 

Och ja, finns det inte alltid två värden i tabellen så finns det andra metoder.

Exempelvis

.Cells(Range("a:a").Cells.Count, 7).End(xlUp).Offset(1)

eller

.Cells(.Range("g1").CurrentRegion.Rows.Count + 1, 7)

fungerar oftast.

 

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

FridaBergelin

Hej igen,

 

Det går sakta men säkert framåt men jag stöter på lite problem som jag inte lyckas lösa, se nedan.

 

Tack igen!

 

'Gå till Datalagring FM
With Worksheets("Datalagring FM")


AntRaderFM = WorksheetFunction.CountA(Sheets("Datalagring FM").Range("G2:G101"))

'Jag får felmeddelandet "program- eller objektidentifierat problem" på denna rad när jag kör koden. Om jag däremot stegar mig igenom och efter att AntRaderFM är satt går över till filen och byter blad till "Datalagring FM" (koden körs via en knapp på ett annat blad) så fungerar det. Vad gör jag fel?
[color="#ff0000"].Range(Cells(2, 2), .Cells(1 + AntRaderFM, 8)).Copy[/color]

End With

'Gå till Stopploggar
With Worksheets("Stopploggar")


'Hitta första tomma rad
'Index = 1
'For i = 1 To 302
   'If Not Cells(i, "G") = "" Then
       'Index = Index + 1
   'End If
'Next i

'Denna får jag inte heller att fungera, felmeddelande "objekt krävs". Ville bara dubbelkolla: jag behöver ett kommando som hittar första tomma raden oavsett hur många rader som är upptagna, det kan vara ingen eller 200. Funkar detta då?
[color="#ff0000"]Set myRn = Stopploggar.Range("G1").End(xlDown)
Tomrad = myRn.Offset(1, 0).Row[/color]

.Cells(Tomrad, "B").PasteSpecial xlPasteAll

End With

'Gå till datalagring
With Worksheets("Datalagring FM")

Application.CutCopyMode = False


End With


End Sub

 

Länk till kommentar
Dela på andra webbplatser

Sub test()
   'Gå till Datalagring FM
   With Worksheets("Datalagring FM")
       AntRaderFM = WorksheetFunction.CountA(Sheets("Datalagring FM").Range("G2:G101"))

       'Missad punkt på första Cells
       .Range([color="#ff0000"].[/color]Cells(2, 2), .Cells(1 + AntRaderFM, 8)).Copy

   End With

   'Gå till Stopploggar
   With Worksheets("Stopploggar")
       'testa istället
       Tomrad =[color="#0000ff"] .Range("G1").CurrentRegion.Rows.Count + 1[/color]
       .Cells(Tomrad, "B").PasteSpecial xlPasteAll
   End With
   Application.CutCopyMode = False
End Sub

 

borde fungera.

Sorry för den missade punkten...

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

FridaBergelin

Hej igen,

 

Den missade punkten borde jag ha sett och insett! Men tack för hjälpen

 

Det allra mesta fungerar nu, det finns, tro det eller ej ett slut på detta. Alla Select-satser är borta!

 

Tre lite större saker återstår som jag inte har lyckats med själv:

 

1. Jag får inte koden till att låsa upp och låsa bladen med lösenord som jag fick tips om tidigare. Vad jag förstod ska jag skriva in koden på bladets kodblad. Gäller det för alla blad? Jag vill ha alla blad låsta men för att kunna klistra in data i bladen måste de ju låsas upp. Jag visste inte om jag skulle skriva den kod jag fick tidigare i alla blad eller vilka?

 

2. Jag kan göra en vanlig message-box med information men hur gör jag en JA/Nej-fråga som kommer upp där koden endast fortsätter köras om man klickar JA?

 

3. Hur kan man ställa in automatsparning, alltså inte backup-kopia var 10:e min för det vet jag hur man gör utan Ctrl S av filen exempelvis varje timma?

 

Tack igen!

 

Länk till kommentar
Dela på andra webbplatser

Sant det du skriver. Projekt i Excel, och likväl annan programmering, har sällan något slut. Alltid något mer som kan fixas.

 

1: Du vill låsa/låsa upp alla blad vid behov? Okej, kanske något i stil med detta i en egen modul:

Private Const strPass = "dummy"
Sub MyLocker(ws As Worksheet)
   ws.Protect Password:=strPass
End Sub

Sub MyUnlocker(ws As Worksheet)
   ws.Unprotect Password:=strPass
End Sub

som du sedan vid behov kan anropa med det blad du vill låsa/låsa upp. Anpassa MyLocker så att det du vill ha låset låses. Spela förslagsvis in ett makro när du låser bladet förhand och ta argumenten från makrot.

Anrop, ex.v.

Sub MySub()
   On Error GoTo errHandle
   MyUnlocker Blad1
   'kod
   'kod
errHandle:
MyLocker Blad1
End Sub

Felhanterare inlagd så att även om det går fel av någon anledning så låses bladet igen

 

Exemplet ovan givet att det ska vara lika för alla blad.

 

2:

If MsgBox("Jaha, vill du köra vidare", vbYesNo, "Fråga?") = vbNo Then Exit Sub

om du svarar nej så avslutas rutinen... Missa inte att låsa bladet först om du låst upp det.

 

3: Autosparning... mmh

Vad är det för ark egentligen? Tror det blir till att sätta ett OnTime-event.

Tre sub-rutiner i en modul:

Dim saveTime As Date
Sub MySaver()
   ThisWorkbook.Save
   MyTimer
End Sub

Sub MyTimer()
   saveTime = Now + TimeSerial(1, 0, 0)
   Application.OnTime saveTime, "MySaver"
End Sub

Sub CancelTimer()
   Application.OnTime saveTime, "MySaver", schedule:=False
End Sub

bör fungera.

MyTimer kan du initialt köra när boken öppnas. Samt du bör köra CancelTimer när boken stängs. Exempelvis i ThisWorkbook-bladet:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   Modul1.CancelTimer
End Sub

Private Sub Workbook_Open()
   Modul1.MyTimer
End Sub

 

ja, något sådant....

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

FridaBergelin

Hej igen,

 

Jag har gett mig in på punkt 1 och 2, punkt 2 var ju inga problem, tack för det!

 

Punkt 1 blir däremot inte rätt när jag gör min tolkning, några tips?

 

Tack!

 

Private Const strPass = "dummy"


Sub MyLocker(ws As Worksheet)
   ws.Protect Password:=strPass

   ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

End Sub

Sub MyUnlocker(ws As Worksheet)
   ws.Unprotect Password:=strPass
   ActiveSheet.Unprotect
End Sub

 

Dels så vet jag inte om ActiveSheet.Protect... kommer fungera men det var den kod som kom upp när jag spelade in ett makro.

 

När jag sedan anropar i koden får jag felmeddelande. Denna kod hämtar data från ett blad och kopierar in i det låsta "Datalagring Kväll" men jag kanske har ersatt Blad1 felaktigt med "Datalagring Kväll" för det är där jag får felmeddelandet. Jag kör koden med Datalagring Kväll låst

 

Sub RapporteraAKväll()

On Error GoTo errHandle
   MyUnlocker "Datalagring Kväll"

'kod kod

errHandle:
MyLocker "Datalagring Kväll"

End Sub

 

 

 

Länk till kommentar
Dela på andra webbplatser

Activsheet - en referens till det aktuella bladet. I koden så ska du inte arbeta med aktuellt blad utan med det blad som skickats till rutinen!

Sub MyLocker(ws As Worksheet)
   ws.Protect Password:=strPass DrawingObjects:=True, Contents:=True, Scenarios:=True 
End Sub

dvs koden du spelar, titta där hur argumenten hanteras, vilka saker du vill h låsa och för över till ws.Protect som jag gjort ovan.

 

Anropa funktionen, det ska du göra med en referens till bladet du vill låsa/låsa upp.

Finns tre praktiska sätt att referera till blad beroende på

1: Kod på ett arbetsblad, då kan man referera med Me.

MyUnlocker Me

2: VBA-namnet. Det namn som bladet har i Projektutforskaren, som standars typ Blad1, Blad2

MyUnlocker Blad1

3: I Worksheets-samlingen adressera ett blad med det namn som visas i Excel, det som användaren ser/kan ändra enkel:

MyUnlocker WorkSheets("Blad1")

 

ed: Känns som om du inte har full koll på hur VBA fungerar. Inget ont med det. En bra sida att titta runt lite på för att få lite inspiration och hjälp är XLdennis:

http://www.xldennis.se

kan noga vara till nytta för dig.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2009-03-27 13:41:15 av Monshi]

Länk till kommentar
Dela på andra webbplatser

FridaBergelin

Hej,

 

Du kunde inte ha mer rätt i att jag inte har full koll på hur VBA fungerar! Jag har endast programmerat i JAVA och det var alldeles för länge sedan så jag är evigt tacksam för all hjälp. Jag känner till xldennis men har inte grävt djupare. Det skulle nog vara en bra idé.

Jag har beställt en 1100 sidor tjock bok om Excel och VBA-kod som jag hoppas kommer med posten idag, blir nog också nyttigt...

 

Alla tips jag fått fungerar nu och jag är i stort sett färdig! Jag kan knappt tro det själv.

 

Tusen tack!

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...