Hvordan stoppe Excel fra tilskyndelse til å åpne en arbeidsbok?

stemmer
5

Jeg har en skrivebeskyttet Excel-arbeidsbok som inneholder en VBA-programmet. Applikasjonen lagrer alle data som må lagres i en database, og arbeidsboken er alltid lukket uten å lagre (ved å sette ThisWorkbook.Saved = Sant i BeforeClose).

Jeg har følgende problem:

  • Brukeren dobbeltklikker på arbeidsboken i Windows Utforsker, åpnes arbeidsbok.

  • Brukeren dobbeltklikker en gang til på arbeidsboken i Windows Utforsker.

  • Excel ber: MyWorkbook.xls er allerede åpen Gjenåpning vil føre til at eventuelle endringer du har gjort i kastes Ønsker du å gjenåpne MyWorkbook.xls..?

  • Hvis brukeren klikker på Ja, vil arbeidsboken gjenåpnet uten å utføre BeforeClose hendelseshåndterer av forekomsten som allerede var åpen .

Dette er et problem i søknaden min, fordi det betyr at noen viktige opprydding kode i BeforeClose hendelsesbehandling ikke blir henrettet.

Kan noen foreslå en VBA løsning på dette. Som kan være:

  • Undertrykke bedt om å åpne arbeidsboken. I stedet stille bruke den allerede åpen eksempel.

  • Somehow få BeforeClose eller noen andre hendelseshåndterer å kjøre i den opprinnelige forekomsten før den er lukket, slik at jeg kan kjøre min opprydding kode.

Oppdater:

Dette er Excel 2003.

Jeg kan bli kvitt den uønskede teksten ved å sette ThisWorkbook.Saved = True i Workbook_SheetChanged hendelseshåndterer (VBA app er ansvarlig for lagring av data som må lagres i en database, så jeg bryr meg ikke om å ha Excel lagre endringer).

Men dette løser ikke mitt problem: hvis jeg gjør dette, og dobbeltklikke på arbeidsbok i explorer stille gjenåpner arbeidsboken, men likevel gjør dette uten å ringe etter BeforeClose hendelsesbehandling.

Så for å omformulere spørsmålet:

  • Er det allikevel å bruke VBA til å oppdage og fange en arbeidsbok som blir gjenåpnet på denne måten?

Update 2

Akseptere BKimmel svar - det virker er det ingen VBA måte å fange opp denne hendelsen fra i arbeidsboken.

Den løsningen jeg vil gjennomføre vil være å flytte programmet koden i en XLA add-in, som lastes automatisk (hvis det ikke allerede lastet) når arbeidsboken er lastet. Tillegget kan håndtere Åpne og BeforeClose hendelser, og lagre informasjonen den trenger for å gjøre opprydding.

Publisert på 09/10/2008 klokken 10:07
kilden bruker
På andre språk...                            


3 svar

stemmer
2

Du kan bruke noen spesielle program hendelser å håndtere når en arbeidsbok åpnes på nytt og manuelt brann Workbook_Close kode:

Lag en klasse modul kalt ApplicationController med følgende kode:

Public WithEvents CApp As Application
Public CurrentWB as Workbook

Private Sub CApp_WorkbookOpen(ByVal wb As Excel.Workbook)


Dim sPathName As String
sPathName = wb.Name
if sPathName = CurrentWB.Name then CallSomeMethod()

End Sub

deretter på workbook_load tilfelle gjøre noe sånt som:

Public controller as new ApplicationController
Private Sub Workbook_Open()
set controller.CApp = Excel.Application
set controller.CurrentWB = ThisWorkbook
End Sub

nå når excel går for å åpne en ny arbeidsbok du vil fange hendelsen og kjøre sikkerhetsmetode. Du kan til og med forhindre det gjenåpning arbeidsboken hvis du ønsket.

Svarte 09/10/2008 kl. 14:55
kilden bruker

stemmer
2

Man ... dette virker lett, men det er en tøff en. Jeg lekte rundt med hver hendelse og application / arbeidsbok egenskap som jeg kunne tenke på i min 7 eller så års erfaring med Excel VBA, og jeg kunne ikke komme opp med noe elegant i det hele tatt ... Jeg tror det korte svaret er at det er ikke egentlig en kort elegant løsning på dette problemet (Hvis det er, ville jeg virkelig liker å se det). Det er dårlige nyheter.

Den gode nyheten er at det jeg tror det er måter å omgå problemet ... en er litt mer elegant, men vil kreve at du revurdere noen av dine metoder og den andre er skitne, men trolig litt enklere.

Jo mer elegant måte ville innebære å tenke nytt og ommøblerer dine metoder ... Jeg tror grunnen til at jeg aldri har kjørt inn i dette problemet i mitt arbeid er at på slutten av hver av mine metoder er arbeidsboken igjen i en "god" tilstand ... eller med andre ord, hvis det er "opprydding" å gjøre så er det gjort på slutten av hver metode. Hvis det er en stor overhead ytelse hit i dette, kan du vurdere å sette en boolsk flagg og begrense hvorvidt det kjøres på slutten av hver av dine andre metoder. (dvs. runCleanup = ReturnTrueIfCleanupIsNeeded () If (runCleanup = true) Deretter CleanupMethod () End If)

Jo skitnere måten ville innebære å gjøre hele arbeidsbok seg til en slags "ad-hoc mutex" av
1) kopiere hele ( opprinnelige ) arbeidsbok ved WorkBookOpen arrangement til et annet ( temp ) boken, og ved hjelp av "Lagre som" -metoden på temp for å plassere den i et separat sted.
2) Lagring av ( opprinnelige ) bane.
3) tilsetning av koden til arbeidsboken åpent arrangement som sjekker for ( temp ) og enten A) lukker seg straks og aktiverer temp eller B) Skriver seg med ( temp ) og deretter benytter SaveAs
4) Catch arrangementet før brukeren lagrer arbeidsboken og lagre den på både den opprinnelige plasseringen, og temp plassering.
5) På WorkBookClose arrangementet, kjøre noen opprydding du trenger til og lagre temp tilbake til sin opprinnelige plassering.

Poenget med alt dette er å stigtrinn på "kollisjonen" som skjer når du åpner arbeidsboken to ganger - i hovedsak, ved å opprette en temp arbeidsbok når du åpner den første gang og lagre det på et annet sted (kanskje du kan selv skjule filen?) du at når brukeren klikker på originalen, vil den ikke kolliderer med de dataene de allerede jobber med i søknaden. (Selvfølgelig har dette sine egne problemer / spørsmål som "Hva om jeg ikke vet hvilke baner brukeren har tilgang til å redde temp til" eller "Hva hvis brukeren åpner temp XLS fil ... men det er derfor jeg kalte det skitt vei)"

jeg vet det er mye, spesielt hvis du ikke er vant til å arbeide med VBA; Hvis du vil at jeg skal legge ut noen kode for å hjelpe deg med noen av disse trinnene, legg igjen en kommentar og jeg vil.

Takk for interessant spørsmål.

Svarte 09/10/2008 kl. 20:36
kilden bruker

stemmer
1

Du kan også undertrykke teksten ved å:

Dette vil gjenåpne en åpen fil uten advarsler .. men merk at eventuelle endringer blir forkastet!

Application.DisplayAlerts = False
Workbooks.Open (sPath)
Application.DisplayAlerts = True

Fra Excel Forum

Denne løsningen fungerte for mine behov

Svarte 09/03/2018 kl. 09:21
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more