Avatar billede fojensen Nybegynder
25. marts 2005 - 13:17 Der er 14 kommentarer og
1 løsning

Afvikle makro efter genåbning af fil

På et regneark der deles af en masse brugere, har jeg lavet et check med brugernavnet (fra windows-login), for at kontrollere om brugeren må redigerings-adgang - hvis ikke, så genåbnes filen som skrivebeskyttet.

Dette virker alt sammen, men filen plejer at åbne en userform (uanset redigeringsadgang eller skrivebeskyttet), men efter genåbning køres makroen Workbook_Open() ikke, så nu får mine brugere med skrivebeskyttet adgang ikke userformen.

Kan dette problem løses på andre måder end at brugerne åbner userform med et klik på værktøjslinie eller lignende ?
Avatar billede bak Forsker
25. marts 2005 - 13:50 #1
Mon ikke det er fordi at brugerne har slået makroer fra`?
Avatar billede fojensen Nybegynder
26. marts 2005 - 08:10 #2
Undskyld jeg først er tilbage nu...

Det er ikke fordi brugeren har slået makroer fra fordi:
- for at nå frem til genåbning af filen, er der afviklet en makro der kontrollerer brugernavn.
- det er stadig på testplan, og foreløbig er det mig selv der er testbruger.

min sub slutter sådan:
----kode----
If Betingelse = True Then
' hvis Sand genåbnes filen skrivebeskyttet.
  Workbooks.Open Filename:=FilNavn, ReadOnly:=True
End If

' derefter vis userform
    frmFind.Show

End Sub
----/kode----

hvis jeg opstiller betingelsen sådan at den ikke afvikler linien: Workbooks.Open Filename:=FilNavn, ReadOnly:=True
så afvikles linien: frmFind.Show som den skal, og userformen vises

mvh Folmer
Avatar billede kabbak Professor
26. marts 2005 - 23:45 #3
når du bruger koden:

If Betingelse = True Then
' hvis Sand genåbnes filen skrivebeskyttet.
  Workbooks.Open Filename:=FilNavn, ReadOnly:=True
End If

er det jo en ny mappe du åbner og det er jo ikke dens kode du kører, men jeg ved ikke lige hvorden du kan styre det.

Fra hjælpen:

det lader til at hvis mappen åbnes via VBA, så køres de automatiske open makroer ikke.

If the workbook being opened has any Auto_Open macros in it, they won’t be run when you open the file from Visual Basic. If you want to run the Auto_Open macro, you must use the RunAutoMacros method.
Avatar billede fojensen Nybegynder
27. marts 2005 - 10:49 #4
kender du så noget til den metode...
jeg har forsøgt med denne test-makro lavet ud fra koden på http://www.mvps.org/access/modules/mdl0007.htm ...
---- kode ----
Sub ReadOnlyVersion()
Dim objXL As Object, x
    On Error Resume Next
    Set objXL = CreateObject("Excel.Application")
    With objXL.Application
        .Visible = True
        'Open the Workbook
  FilNavn = "minfil.xls"
  Workbooks.Open Filename:=FilNavn, ReadOnly:=True
        'forsøger at køre makroen Auto_open()
      .ActiveWorkbook.RunAutoMacros xlAutoOpen
        'forsøger at køre makro der viser userform
        x = .Run("FindForm", 0)
    End With
    Set objXL = Nothing
End Sub
---- /kode ----
den åbner filen som readonly, men kører hverken den ene eller den anden makro...
hvad gør jeg mon galt...
jeg har også læst lidt på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/off2000/html/xlmthRunAutoMacros.asp, men kan ikke finde det der slår igennem
Avatar billede kabbak Professor
27. marts 2005 - 11:21 #5
i den du åbner

Private Sub Workbook_Open()
If ThisWorkbook.ReadOnly Then
UserForm1.Show
End If

'og resten af evt.anden kode
End Sub

den anden kode

Sub ReadOnlyVersion()
Dim objXL As Object, x
    On Error Resume Next
    Set objXL = CreateObject("Excel.Application")
    With objXL.Application
  Filnavn = "minfil.xls" 'Open the Workbook
  Workbooks.Open Filename:=Filnavn, ReadOnly:=True
    End With
    Set objXL = Nothing
    ThisWorkbook.Close
    Workbooks(Filnavn).Visible = True
End Sub
Avatar billede kabbak Professor
27. marts 2005 - 11:27 #6
vi skal lige have den til at hoppe over anden kode ved skrivebeskyttet

Private Sub Workbook_Open()
If ThisWorkbook.ReadOnly Then
UserForm1.Show
Exit Sub
End If
'og resten af evt.anden kode
End Sub
Avatar billede kabbak Professor
27. marts 2005 - 12:04 #7
jeg har testet en anden ting, hvor jeg kun bruger disse koder

i et modul
Global ReadOnlyVersion As Boolean


og i ThisWorkbook


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If ReadOnlyVersion Then
Cancel = True ' annulerer gem og gør at man hverken kan gemme eller gem som
ThisWorkbook.Saved = True ' hvis der ændres kommer den ikke og spørger om gem
End If
End Sub

Private Sub Workbook_Open()
ReadOnlyVersion = False
If Application.UserName <> "Kabbak" Then' lav det om til din test på brugere
ReadOnlyVersion = True
UserForm1.Show
Exit Sub
End If
End Sub
Avatar billede fojensen Nybegynder
27. marts 2005 - 12:17 #8
Tak ind til videre - har først mulighed for at teste lidt senere - der er travlt på arbejdet nu, og produktionen kommer først.
vender tilbage senere eller i morgen...
Avatar billede fojensen Nybegynder
27. marts 2005 - 14:14 #9
Er tilbage (et øjeblik) og ser lidt på sagerne...

Den sidste løsning - betyder det at jeg kan undgå genåbning af fil, men bare teste om brugeren har skriveadgang, og så lave en anden slags readonly-version med:
Cancel = True ' annulerer gem og gør at man hverken kan gemme eller gem som
ThisWorkbook.Saved = True ' hvis der ændres kommer den ikke og spørger om gem

er det rigtigt forstået?
mvh Folmer
Avatar billede kabbak Professor
27. marts 2005 - 14:35 #10
ja det er rigtig
Avatar billede kabbak Professor
27. marts 2005 - 14:38 #11
men, alle brugere kan disable makroer, ved at holde SHIFT nede, mens man åbner filen, eller hvis man har makro sikkerheden høj, så køres makrorne heller ikke.
Avatar billede fojensen Nybegynder
27. marts 2005 - 17:27 #12
ang. problemet med at brugeren evt prøver at disable makroafvikling, så har jeg tænkt mig at løse det ved at bruge...
-----
Sub ProtectSheet()
  Sheets("Arknavn").Protect Scenarios:=True, UserInterfaceOnly:=True, Password:="password"
End Sub
-----
og
-----
Sub UnProtectSheet()
  Sheets("Arknavn").Unprotect Password:="password"
End Sub
-----
ved hhv. åbning og lukning af arket, fordi de brugerdefinerede visninger man kan lave, kan ikke laves i et beskyttet ark.

Hvis det lykkes brugeren at undvige makroafviklingen vil arket være beskyttet.
derudover passwordbeskytter jeg selvfølgelig vba-projektet.

Arbejder videre med det i morgen på arbejdet...
...men foreløbig tak for hjælpen til at finde en i sidste ende bedre løsning.

mvh Folmer
Avatar billede fojensen Nybegynder
07. april 2005 - 07:41 #13
Løsningen som jeg forsøgte med beskyttelse af arket inden luk og fjernelse beskyttelse efter åbning fungerer ikke godt i praksis, fordi de mange brugere der bare skal læse, blokerer for den der skal skrive.

Jeg har lavet en løsning hvor den fil brugerne åbner kun udfører adgangskontrollen, hvorefter de sendes videre til den rigtige excel-fil (arbejdsplan) vha. den metode kabbak foreslår.

---- kode ----
Sub ReadOnlyVersion()
Dim objXL As Object, x
    On Error Resume Next
    Set objXL = CreateObject("Excel.Application")

    With objXL.Application
    Filnavn = "minfil.xls" 'Open the Workbook
        If Superuser = True Then
    Workbooks.Open Filename:=Filnavn, ReadOnly:=False, WriteResPassword:=" mit_password ", Notify:=True
        Else
    Workbooks.Open Filename:=Filnavn, ReadOnly:=True
        End If
    End With

    Set objXL = Nothing
    ThisWorkbook.Close
    Workbooks(Filnavn).Visible = True
End Sub
---- /kode ----

Nogle brugere får så ReadOnly-version, og andre fåer filen åbnet for redigering. Den rigtige excel-fil har selvfølgelig stadig en adgangskode for redigering, men den sender jeg med ved åbning af filen. I den fil der udfører adgangskontrollen er VBA-koden selvfølgelig også beskyttet med adgangskode.

Der er dog stadig et par punkter der ikke fungerer optimalt. Hvis Excel-filen (arbejdsplanen) i forvejen er optaget af en bruger med skriveadgang, så får den næste bruger med skriveadgang bare en ReadOnly-version uden yderligere besked. Hvis filen var blevet åbnet manuelt ville der normalt komme en meddelelse om 'File in use', og mulighed for at vælge 'Notify', så sendes der en meddelelse når arbejdsplanen er fri til redigering. Det har jeg klaret ved at tilføje 'Notify:=True' i min 'Open filename osv.' men jeg mangler stadig at gøre brugeren opmærksom på at han ikke fik en skrive-version som forventet.

Hvordan tester jeg (i arbejdsplanen) om brugheren er sat til at få meddelelse når arbejdsplanen er fri til redigering ?
Jeg har forsøgt med  denne kode i Workbook_Open() ...
---- kode ----
With ActiveWorkbook
    If .WriteReserved = True Then
        MsgBox "Please contact " & .WriteReservedBy & Chr(13) & _
            " if you need to insert data in this workbook."
    End If
End With
---- /kode ----
men den reagerer åbenbart på om der er adgangskode på projektmappen.
jeg har også forsøgt med
    If .Notify = True Then
og
    If .Notification = True Then
men den fejler - det er der åbenbart ikke noget der hedder.

Hvis det er muligt vil jeg gerne både kunne teste om den er optaget, og hvem den er optaget af. Excel kan det jo i forvejen hvis man manuelt åbner filen, så det må også kunne lade sig gøre med VBA - eller hva' ?

mvh Folmer
Avatar billede fojensen Nybegynder
07. april 2005 - 07:44 #14
Kabbak - du har jo også snart fortjent nogle points - og det kan vel ikke længere gøre det med de 30 points.
Avatar billede kabbak Professor
25. januar 2006 - 22:48 #15
marker mit navn og tryk accepter, hvis det virkede
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