Avatar billede h_s Forsker
30. juni 2007 - 16:59 Der er 48 kommentarer og
1 løsning

Tjek om filen er åben med makro

Hvordan tjekker man om en excelfil allerede er åben med en makro?
Avatar billede gider_ikke_mere Nybegynder
30. juni 2007 - 17:07 #1
Den omvendte verden:

On Error Resume Next
Windows("mappederikkeeksisterer").Activate
Avatar billede word-hajen Nybegynder
30. juni 2007 - 17:08 #2
Åbnet af samme bruger, som kører makroen eller åbnet af "alle mulige andre"?
Avatar billede gider_ikke_mere Nybegynder
30. juni 2007 - 17:21 #3
Du tænker på en Excelfil der ligger på et netværk?

Så burde du kunne:

On Error Resume Next
Workbooks.Open Filename:= _
        "G:\nymappe.xls"
If Err.Number = 1 Then
    Err.Clear
    MsgBox "noget"
End If

Hvad err.Number skal være, ved jeg ikke, men det nummer får du ved i første omgang at skippe "On Error Resume Next".
Avatar billede gider_ikke_mere Nybegynder
30. juni 2007 - 17:24 #4
Der burde så komme forskellig error nummer, alt efter om filen eksisterer, er åbnet af dig, eller af andre (låst).
Avatar billede h_s Forsker
30. juni 2007 - 17:32 #5
alyne> makrostumpen skal indgå i en større makro.

Hvis filen ikke er åben i forvejen skal den åbnes.

I dag åbnes den sådan:
Workbooks.Open Filename:= _
        "C:\Data.xls"

Jeg får en fejl, hvis den er åben i forvejen. Kan du prøve at skrive den If-sætning der skal bruges (hvis det er en if-sætning :-) )
Avatar billede h_s Forsker
30. juni 2007 - 17:44 #6
word-hajen > Den kan være åbnet af "alle umige andre"!
Avatar billede gider_ikke_mere Nybegynder
30. juni 2007 - 18:17 #7
Det kunne gøres således:

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
Avatar billede h_s Forsker
30. juni 2007 - 18:29 #8
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.

Hvormeget kan jeg slette?
Avatar billede gider_ikke_mere Nybegynder
30. juni 2007 - 22:22 #9
Du kan egentlig ikke undvære noget. Med mindre din kode skal kikse og gå i fejl, hvis filen ikke eksisterer.
Avatar billede cool_m_f Nybegynder
30. juni 2007 - 22:35 #10
det er nu ikke nødvendigt at sætte 'on error resume next' to gange med mindre man slår den fra igen med 'on error goto 0'
Avatar billede h_s Forsker
03. juli 2007 - 16:34 #11
Jeg kan ikke få den til at virke.

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?
Avatar billede word-hajen Nybegynder
03. juli 2007 - 17:13 #12
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?
Avatar billede h_s Forsker
03. juli 2007 - 18:02 #13
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!
Avatar billede gider_ikke_mere Nybegynder
03. juli 2007 - 18:27 #14
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!
Avatar billede gider_ikke_mere Nybegynder
03. juli 2007 - 18:27 #15
... og besked når de andre lukker den, og du kan skrive i den.
Avatar billede h_s Forsker
03. juli 2007 - 18:37 #16
Der skal ikke skrives i den - Der skal kun hentes data. Derfor betyder det ikke noget at den er skrivebeskyttet.

I den makro, der køres står følgende:

Sheets("Beregninger").Range("C25:C29").Copy

Workbooks.Open Filename:= "C:\data.xls"

Sheets("Beregninger").Range("C25:C29").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=False, Transpose:=False

Når Data.xls er åben i forvejen, fejler makroen i

Sheets("Beregninger").Range("C25:C29").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

.. med Run-time error: 1004 som du skriver i din makro-stump
Avatar billede h_s Forsker
03. juli 2007 - 18:38 #17
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!
Avatar billede word-hajen Nybegynder
03. juli 2007 - 18:56 #18
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 :-)
Avatar billede h_s Forsker
03. juli 2007 - 19:03 #19
Det er kun her i produktionen den ligger på C-drevet. I produktionen ligger den på et G-drev.
Avatar billede h_s Forsker
10. juli 2007 - 18:30 #20
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.

Håber det hjælper og i stadig kan/vil hjælpe mig!
Avatar billede word-hajen Nybegynder
10. juli 2007 - 20:00 #21
Bør du så ikke bare åbne filen read-only? Da du ikke skal gemme i den, betyder det jo ikke noget.
Avatar billede h_s Forsker
10. juli 2007 - 20:29 #22
word-hajen> det var en god ide! Hvordan gør jeg det. Pt. bruger jeg:

Workbooks.Open Filename:= "G:\Data.xls" .. til at åbne filen.

Hvad skal ændres?
Avatar billede h_s Forsker
10. juli 2007 - 20:31 #23
Kommer der så ingen meddelelse når den åbnes om at den åbnes i skrivebeskyttet stand og/eller i forvejen er åben af en anden- Det skal der helst ikke
Avatar billede word-hajen Nybegynder
10. juli 2007 - 21:00 #24
Nej, for du åbner den jo selv som read-only.

Workbooks.Open Filename:="G:\Data.xls", ReadOnly:=True
Avatar billede h_s Forsker
10. juli 2007 - 21:18 #25
prøver lige og vender tilbage!
Avatar billede h_s Forsker
12. juli 2007 - 10:59 #26
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

Er det en ide? Hvis det er hvad gør jeg så?
Avatar billede word-hajen Nybegynder
12. juli 2007 - 11:40 #27
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.
Avatar billede h_s Forsker
12. juli 2007 - 22:31 #28
Super - kunne jeg få dig til at sætte det op i en if-sætning ala:

If Data.xls = Open then
  Workbook("Data.xls").Activate
Else
  Workbooks.Open Filename:="G:\Data.xls", ReadOnly:=True
End if

På forhånd tak!
Avatar billede word-hajen Nybegynder
13. juli 2007 - 08:12 #29
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.....
Avatar billede h_s Forsker
13. juli 2007 - 20:39 #30
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.

Hvordan skrives det i VBA?
Avatar billede word-hajen Nybegynder
13. juli 2007 - 22:19 #31
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:

objWB.activate
Avatar billede h_s Forsker
17. juli 2007 - 21:33 #32
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
Avatar billede word-hajen Nybegynder
17. juli 2007 - 23:39 #33
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.
Avatar billede h_s Forsker
21. juli 2007 - 16:01 #34
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?
Avatar billede word-hajen Nybegynder
21. juli 2007 - 16:39 #35
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.
Avatar billede h_s Forsker
25. juli 2007 - 14:25 #36
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:

Sheets("Beregninger").Range("C25:C29").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Arket Beregninger er et ark i Data.xls.

Den fejler ikke når den er lukket og åbnes af makroen. Ved du hvad der kan være galt her?
Avatar billede h_s Forsker
25. juli 2007 - 14:28 #37
Fejlen der opstår er en runtime error: 1004!
Avatar billede word-hajen Nybegynder
25. juli 2007 - 14:45 #38
Jeg går ud fra, at:

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

hvis du foretrækker at arbejde med det.
Avatar billede h_s Forsker
25. juli 2007 - 20:19 #39
Dine forudsætninger er rigtige, men jeg får stadig den samme fejl!

Det skal siges at jeg har sat dette foran:

Workbooks("Stamdata.xls").Sheets("Beregninger")...

Årsagen er den, at din kode står i en makro for sig selv som jeg kalder lige før indsættelsen foretages!
Avatar billede h_s Forsker
25. juli 2007 - 20:34 #40
ups. fejl - Der skal selvfølgelig stå:

Workbooks("Data.xls").Sheets("Beregninger")...

Får stadig samme fejl!
Avatar billede word-hajen Nybegynder
25. juli 2007 - 21:31 #41
Så aktivér arket og brug:

ActiveWorkbook.Sheets("Beregninger")...

Ellers skal du sørge for at få returneret objWB til din egen procedure, så du har dit objekt med.

Men hvorfor har du splittet koden op og ikke bare indsat det, som jeg har lavet i din procedure? Du gør det i hvertfald ikke nemmere for dig selv.
Avatar billede h_s Forsker
25. juli 2007 - 21:45 #42
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!

Kan det hjælpe dig at se hele koden?
Avatar billede word-hajen Nybegynder
25. juli 2007 - 22:03 #43
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.
Avatar billede h_s Forsker
25. juli 2007 - 22:17 #44
filer sendt!
Avatar billede word-hajen Nybegynder
26. juli 2007 - 18:18 #45
Æ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.
Avatar billede h_s Forsker
26. juli 2007 - 20:34 #46
DET VIRKER :-) TAK - Men hvorfor?

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!
Avatar billede word-hajen Nybegynder
26. juli 2007 - 21:18 #47
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.
Avatar billede h_s Forsker
26. juli 2007 - 21:36 #48
Tak for hjælpen!
Avatar billede word-hajen Nybegynder
26. juli 2007 - 21:42 #49
Velbekomme.
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