25. marts 2005 - 13:17Der 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 ?
Der bliver investeret massivt i AI. Teknologien er mere tilgængelig end nogensinde, og ambitionerne er høje. Alligevel oplever mange virksomheder, at resultaterne udebliver.
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
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.
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
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
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
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...
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
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.
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.
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' ?
marker mit navn og tryk accepter, hvis det virkede
Synes godt om
Ny brugerNybegynder
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.