Sub a() On Error Resume Next Workbooks.Open Filename:= _ "C:\Data.xls" If Err.Number = 1004 Then Err.Clear MsgBox "Filen findes ikke" Else Workbooks("Data.xls").Activate On Error Resume Next ActiveWorkbook.Save If Err.Number = 1004 Then Err.Clear MsgBox "Filen er skrivebeskyttet" ActiveWorkbook.Close End If End If End Sub
Hvad gør err.number = 1004? Der skal ikke tjekkse for andet end om den er åben i forvejen. Det er ok at den tjekker om den eksisterer men IKKE om den er skrivebeskyttet og heller ikke lukke filen.
Jeg synes der står nogle "forkerte" ting i makroen: ActiveWorkbook.Save - Stamdata skal ikke gemmes - kan jeg slette dette? MsgBox "Filen er skrivebeskyttet" - Hvorfor undersøges der for det? ActiveWorkbook.Close - Stamdata skal ikke lukkes - Kan jeg slette det?
1. En Excel-fil vil være skrivebeskyttet, hvis den åbnes, når en anden bruger har åbnet den - derfor tjekkes det, om den er skrivebeskyttet (det kan den selvfølgelig også være af andre årsager).
Er det bare meningen, at du vil åbne filen - og komme uden om en evt. meddelelse, hvis den er åben i forvejen? Er det i øvrigt en fejlmeddelelse, du får eller "bare" en meddelelse om, at den er åben i forvejen og om du vil åbne den som read-only?
Det er helt i orden den er åben i forvejen - Både af mig selv og af andre. Hvis den er åben af andre, må den godt åbnes "skrivebeskyttet". Hvis det er mig selv, der har åbnet den, skal den aktiveres, så jeg kan begynde og bruge den!
jamen så skal du jo egentlig bare checke om filen eksisterer. Det giver da ingen mening. Excel siger selv til, hvis du kommer til at åbne en fil der er åbnet af andre!
Okay - Der skrives i den - men kun midlertidigt. Data, der kopieres over i Data - bruges kun midlertidigt. Når den lukkes igen gemmes den uden ændringer!
Hvis filen er placeret på et C-drev, kan vi så ikke gå ud fra, at den er placeret lokalt på din pc? Og at andre brugere ikke har adgang dertil, og derfor ikke kan have åbnet filen?
*************
Dim objOpenWB As Workbook Dim objWB As Workbook Dim strFilename As String
strFilename = "C:\data.xls"
For Each objOpenWB In Application.Workbooks If objOpenWB.Name = strFilename Then Set objWB = objOpenWB Exit For End If Next
If objWB Is Nothing Then Set objWB = Workbooks.Open(Filename:=strFilename) End If
********** Om du så nu ønsker at aktivere din workbook, eller simpelthen tilgå den ved hjælp af objektet, står dig frit for :-)
Okay, jeg prøver lige at foreklare en gang til - også for min egen skyld, for jeg er også blevet klogere :-)
Filen Data.xls ligger på G-drevet (G:\Data.xls). Den kan godt åbnes fra mange PCere. I min makro åbnes filen og der kopieres et ark over i en anden excel-fil. Hvis Data.xls i forvejen er åben får jeg en fejl i makroen. Den vil jeg gerne undgå. Det betyder ikke noget at filen er åben i forvejen, for den åbnes bare og der kopieres et ark og så lukkes filen uden ændringer igen.
Wrod-hajen> Det virker super, men hvad nu hvis jeg er kommet til at åbne filen på min egen PC og så køre makroen - så opstår der en fejl. Har du en god ide til hvad jeg så gør? Jeg kunne forestille mig noget med at der først tjekkes om filen i forvejen er åben. Hvis den er, så skal den bare aktiveres - ellers køres Workbooks.Open Filename:="G:\Data.xls", ReadOnly:=True
Du skal bruge den procedure, som jeg har angivet i mit indlæg 03/07-2007 18:56:19, hvor jeg netop har lavet denne kode. Husk bare at anføre ReadOnly, der hvor filen bliver åbnet hvis du ikke selv har den åben i forvejen.
Det har jeg mere eller mindre gjort i proceduren 03/07-2007 18:56:19 - omend på en lidt anden måde end du gør. Hvorfor vil du i øvrigt aktivere arket? Du har via objWB en reference til dit ark, så du kan rent faktisk "bare" kode resten derudaf. Så i stedet for f.eks.:
ActiveWorkbook....... (og så hvad du ellers vil) skriver du objWB.....
Nu er det sådan at jeg ikke er så god til at kode VBA, så jeg vil gerne have ekspertens hjælp. Årsagen til at jeg skal have aktiveret arket er, at jeg skal have noget kopieret over i filen midlertidigt, som jeg skal bruge videre i min makro. Så...
Hvis arket er åbnet på min PC, skal arket aktiveres. Ellers skal arket åbnes i skrivebeskyttet tilstand.
Det var ikke et forsøg fra min side på at være hverken smart eller spydig. Men... bær lige lidt over med mig ... jeg forsøgte blot at gøre opmærksom på, at det IKKE er nødvendigt at lave en activate på din workbook.
Du gør f.eks.: Workbooks.Open "Data.xls"
Jeg gør: Set objWB = Workbooks.Open "Data.xls"
På den måde har jeg en reference til filen og jeg kan dybest set have en helt anden fil aktiveret og stadig arbejde med filen. Det er specielt en fordel, hvis man arbejder med flere forskellige åbne filer.
Hvis du så efterfølgende skal skrive til en celle, skriver du:
ActiveWorkbook.etellerandet
hvor jeg skriver objWB.etellerandet
Hvis du er helt vild for at aktivere filen, kan du stadig bruge den kode, som jeg har lavet tidligere og så blot som det sidste efter min del af koden skrive:
Word-hajen> Jeg forstår godt hvad du skriver, men jeg har svært ved at forstå din makro. Vil du prøve at putte lidt tekst ind i makroen, så jeg kan se hvad den gør og hvor den gør det!
Dim objOpenWB As Workbook Dim objWB As Workbook Dim strFilename As String
strFilename = "C:\data.xls"
For Each objOpenWB In Application.Workbooks If objOpenWB.Name = strFilename Then Set objWB = objOpenWB Exit For End If Next
If objWB Is Nothing Then Set objWB = Workbooks.Open(Filename:=strFilename) End If
Må jeg foreslå dig at steppe (F8) dig igennem koden? Gør det både med data.xls åben og så igen med den lukket.
En kort forklaring: I delen For Each løber jeg alle åbne Excel-filer igennem for at tjekke, om en af dem har samme filnavn, som den fil, du skal have fat i. Hvis den er åben, sætter jeg en reference til den.
Hvis den ikke er åben (tjekkes i if-sætningen, hvor objWB vil være ingenting, hvis ikke filen er fundet, jf. For Each-løkken), åbner jeg den.
Jeg har nu afprøvet din makro. Selvom filen er åben, forsøger makroen at åbne den igen - Det skal den ikke. Den skal aktiveres! Kan der være en fejl i "For Each" delen?
Der er ikke fejl i proceduren. Hvis filen er åben, bliver objWB sat lig med den åbne fil. Når koden så kommer til if-sætningen, bliver filen åbnet, hvis objWB er ingenting - og det er den ikke, hvis filen er fundet i For Each.
Step koden igennem og se, hvorfor objWB er ingenting - måske noget med filnavnet, som du ikke har sat rigtigt? Hvis ikke koden går ind i Set objWB = objOpenWB, når du har filen åben, er det filnavnet, den er gal med.
Du har ret. Det ser ikke ud til at der er en fejl. men din makro er en del af en større makro. Når jeg sætter din del ind i makroen fejler den når den er åben i forvejen her:
1. det er i din kodelinje, at den fejler 2. du har benyttet den stump kode, som jeg har lavet 3. din kodelinje står EFTER den stump kode, som jeg har lavet
I så fald skal du ændre din kodelinje til:
objWB.Sheets("Beregninger")...... derudaf eller huske at skrive objWB.Activate
Du har ret. Der er ingen grund til at have koden splittet op, men det er i første omgang den nemmeste måde (for mig) at teste nye procedurer. Jeg er jo ikke så god til VBA!
Nu har jeg prøvet at flytte koden ind i min egen uden de store resultater. Jeg får stadig samme fejl!
Jeg vil meget hellere se dine filer... Send til lemontree""jubii.dk (udskift "" med det lille berømte tegn) - både filen med kode og Data.xls.
Det er i øvrigt fint nok at placere koden, så den er splittet op, både til test og til "rigtig" brug, men hvis du skal bruge proceduren sådan, kræver det, at du kalder den på en anden måde, så du får returneret et objekt til den første procedure.
Ændr linjen: If objOpenWB.Name = strFilename Then til If objOpenWB.FullName = strFilename Then
Noget helt andet - jeg anbefalede dig på et tidspunkt at steppe dig igennem koden; det gjorde du ikke, vel? For i så fald kunne du have opdaget problemet.
Jeg kan også se, at du ikke åbner filen som ReadOnly. Hvorfor ikke? Selv om du ikke selv har den åben, kan du jo risikere, at der er en anden, der har den åben.
Jeg har prøvet at steppe igennem koden - Men jeg er ikke faldet over fejlen! Hvordan ville jeg have opdaget den?
Jeg har ændret til ReadOnly. Det betyder at hvis filen i forvejen er åben på min PC, vil den ændres til at være ReadOnly og de ændringer jeg evt. har lavet ikke bliver gemt. Men man kan jo ikke få det hele! :-)
Word-Hajen smid et svar - Det har du virkelig fortjent!
Hvis den er åben i forvejen (af dig), bliver den ikke åbnet igen - og bliver derfor ikke ReadOnly - så jo, man kan godt få det hele :-)
Mht. at steppe igennem koden, så skal den jo gå ind i Set objWB = objOpenWB, hvis filen er åben i forvejen. Det gjorde den ikke, da jeg forsøgte at sammenligne navnet på filen med den fulde sti, som er sat i strFilename. Når det er ændret til FullName, er det korrekt, idet det så er den fulde sti, der bliver sammenlignet med .... ta-daaa.... den fulde sti.
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.