< návrat zpět

MS Excel


Téma: Chráněné zobrazení ? rss

Zaslal/a 17.4.2017 0:07

Ahoj lidi! (E2010) Poraďte jak se odkazovat ve VBA na sešit, který je otevřený v "Chráněném zobrazení/Povolit úpravy". ActiveWorkbook ani ActiveWindow to nebere. Mám otevřený sešit a v něm nějakou rutinu pro Deactivate. Otevřu další sešit, ale ten je v Chráněném zobrazení.
No a jak kód v Dectivate narazí na ActiveWorkbook, nebo ActiveWindow končí chybou.
A co fčil?

Zaslat odpověď >

#036095
elninoslov
Ono sa to asi v Chránenom zobrazení otvorí v druhej inštancii Excelu, čistý tip. Čo potrebujete robiť v tej Deactivate ? Či sa to nedá len preskočiť v On Error, alebo treba podúmať nad API, alebo či nemôžete proste Chránené zobrazenie úplne vypnúť.citovat
#036100
avatar
Ne, neotvírá se druhá instance. Mám nějaké sešity ve kterých při Activate kódem upravuji prostředí a chování Excelu. Když z tohoto prostředí přepnu na jiný sešit, má se v Deactivate vše uvést do normálního nastavení. To znamená zapamatovat si ActiveWindow(v Chráněném zobrazení), přepnout zpět do Thisworkbook, upravit prostředí Excelu a přepnout zpět na nově otevřený sešit. Řada z příkazů v Deactivate vyžaduje odkaz ActiveWindow a některé lze provést pouze v ActiveWorkbook tady konkrétně v ThisWorkbook. Jistě můžu tento chybový stav ošetřit On Error. Procedura se zastaví, k úpravě prostředí nedojde, ale jinak OK. Následně v novém sešitu povolím úpravy, znovu přepnu sem a tam a je hotovo.
Ale celé to nabourá koncepci Deactivate. No a protože některé takové sešity používají i mí znamí a protože se snažím, pokud to jde, dotahovat vše do detailu, proto se ptám, zda a jak, pokud vůbec, se lze odkázat na takový sešit otevřený v Chráněném zobrazení. Api nepohrdnu.
UF!citovat
#036101
elninoslov
Tak potom by mohol pomôcť takýto test
Private Sub Workbook_Deactivate()
Dim wbAct As Workbook, wbOld As Workbook

Set wbOld = ThisWorkbook 'Ak potrebujete niečo robiť s Vašim pôvodným zošitom
Set wbAct = ActiveWorkbook 'Aktívny zošit (chránený zošit sa nepriradí)

If wbAct Is Nothing Then Set wbAct = Application.ActiveProtectedViewWindow.Workbook 'Ak je chránený zošit, treba urobiť priradenie inak

wbOld.Worksheets("Log").Cells(wbOld.Worksheets("Log").Rows.Count, 1).End(xlUp).Offset(1).Value = wbAct.Name 'Logovanie mena aktívneho zošitu, do aktívneho listu vo Vašom zošite

Set wbOld = Nothing
Set wbAct = Nothing
End Sub


Ale asi to nebude fungovať pri deaktivácii na inú inštanciu. To som neskúšal.citovat
#036105
avatar
Elnino díky, fachčí to!
S tou druhou Instancí jsem na vážkách. Správce úloh ukazuje dva EXCELY, ale Funkce kterou používám
pro zjištěni počtu otevřených Instancí vrací jednu, tak nevím co je pravda.Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Function ExcelInstances() As Long
Dim hWndDesk As Long
Dim hWndXL As Long
'Získat popisovac na plochu
hWndDesk = GetDesktopWindow
Do
'Získat další okno aplikace Excel
hWndXL = FindWindowEx(GetDesktopWindow, hWndXL, "XLMAIN", vbNullString)
'Když jsme dostali jeden, zvýšit pocet
If hWndXL > 0 Then
ExcelInstances = ExcelInstances + 1
End If
'Loop, dokud jsme je našli všechny
Loop Until hWndXL = 0
End Function
citovat
#036106
avatar
Pardon, chybička ...hWndXL = FindWindowEx(hWndDesk, hWndXL, "XLMAIN", vbNullString)citovat
#036107
elninoslov
Ja keď chcem vyskúšať Váš kód na zistenie počtu inštancií, tak si to musím upraviť na x64 verziu:
#If Win64 Then
Public Declare PtrSafe Function GetDesktopWindow Lib "User32" () As LongLong
Public Declare PtrSafe Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWnd1 As LongLong, ByVal hWnd2 As LongLong, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongLong
#Else
#If VBA7 Then
Public Declare PtrSafe Function GetDesktopWindow Lib "User32" () As Long
Public Declare PtrSafe Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
#Else
Public Declare Function GetDesktopWindow Lib "User32" () As Long
Public Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
#End If
#End If
'Public Declare PtrSafe Function GetDesktopWindow Lib "User32" () As Long
'Public Declare PtrSafe Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Function ExcelInstances() As Long
#If Win64 Then
Dim hWndDesk As LongLong
Dim hWndXL As LongLong
#Else
Dim hWndDesk As Long
Dim hWndXL As Long
#End If
'Získat popisovac na plochu
hWndDesk = GetDesktopWindow

Do
'Získat další okno aplikace Excel
hWndXL = FindWindowEx(hWndDesk, hWndXL, "XLMAIN", vbNullString)
'Když jsme dostali jeden, zvýšit pocet

If hWndXL > 0 Then
ExcelInstances = ExcelInstances + 1
End If

'Loop, dokud jsme je našli všechny
Loop Until hWndXL = 0

End Function

a to mi vracia počet okien (aj to zvýšených o 5, teda jedna inštancia s jedným súborom vráti číslo 6), nie inštancií.

Našiel som zaujímavý minikód, ktorý skutočne zistí počet inštancií:
Function CountExcelInstances()
strComputer = "."
Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set proc = objWMI.ExecQuery("Select * from Win32_Process Where Name = 'Excel.exe'")
CountExcelInstances = proc.Count
Set proc = Nothing
Set objWMI = Nothing
End Function


Bohužiaľ, ale prepnutie na inú inštanciu Excelu, nevyvolá v predošlej inštancii metódu Deactivate. Takže aj tak prd z toho...

Skúšané na Office 2016 Pro SK x64, Win10 x64 Pro SKcitovat
#036108
avatar
Mně vrací obě Funkce stejný výsledek (bez ohledu na počet otevřených sešitů), ale ten MINIKÓDIK je paráda.
Ano, máš pravdu. Při přepnutí do druhé Instance Deactivate neproběhne, ale to nevadí, protože se sešity nemohou vzájemně ovlivnit. Např. vypnutí EnableEvents, Calculation, konfigurace prostředí atd.
No ale ještě se s tím peru. Nově otevřený Sešit v Chráněném zobrazení už teda mám v "wbAct", ale nedaří se mi zpět aktivovat "ThisWorkbook". Respektive pořád nemůžu použít ActiveWindow ani ActiveWorkbook. Do prkýnka, když to jde manual, proč to nejde VBA?citovat
#036109
elninoslov
Veď sme ho dali do wbOld, tak cez neho skúsit.citovat
#036149
avatar
Mno, tak jsem zrušil v Deactivate přepnutí zpět do Thisworkbook a znova do sešitu v "Chráněném zobrazení". Postupně přepisuju příkazy pro uvedení prostředí Excelu do původního stavu a ochrané nastavení Thisworkbook. Ale nedaří se mi zrušit nastavení "OnKey". Google moc nepomáhá.citovat
#036150
avatar
Tak jsem našel "berličku". Můžu otevřít Nový sešit "Workbooks.Add". Tím se dostanu z "Chráněného zobrazení"! "OnKey" projde! Když Nový sešit zavřu, jsem zpátky v "Chráněném zobrazení". Nesmím přepnout do ThisWorkbook, nedostal bych se zpátky do "Chráněného zobrazení". Jsem zvědavý na co ještě příjdu ...citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje