2015-12-25 14 views
5

Il mio recente aggiornamento a Office 365/Excel 2016 ha causato alcune modifiche comportamentali indesiderate. La cartella di lavoro ("Apprezzamento del portafoglio") contiene una procedura Workbook_open che controlla se la cartella di lavoro ("Resi dell'indice") è aperta; se non lo è, aprirà quel libro di esercizi.Finestra di Excel errata a fuoco dopo la cartella di lavoro

Con Excel 2007, Index Returns si apre in background e resta lì, che è il comportamento desiderato. Sarebbe "in una finestra" e potrebbe essere visualizzato, nella stessa finestra di Excel, utilizzando l'opzione Arrange All nella scheda Window della barra View.

Con Excel 2016, se viene aperto dalla procedura Workbook_Open, Index Returns si apre nella relativa finestra di Excel e si conclude davanti. (Non può più essere visualizzato nella stessa finestra di Excel come Portfolio Appreciation).

Il fatto che Index Returns sia davanti è il problema.

Ho provato a selezionare e deselezionare l'opzione per ignorare altre applicazioni utilizzando DDE; Ho provato il metodo AppActivate (mostrato nel codice di seguito) e verificato, utilizzando un MsgBox, che l'argomento corrisponde alla barra del titolo pertinente.

Non so dove andare dopo. Suggerimenti apprezzati.

Inoltre: Index Returns non contiene macro o connessioni. Portfolio Appreciation non contiene macro diverse da Workbook_Open e ha una query Web che viene aggiornata quando si apre (la query scarica alcune informazioni sull'indice azionario).


Option Explicit 
Private Sub Workbook_Open() 
    Dim wbs As Workbooks, wb As Workbook 
    Dim IndexReturns As String 
    Dim re As RegExp 
    Const sPat As String = "(^.*\\DATA\\).*" 
    Const sRepl As String = "$1EHC\Investment Committee\indexreturns.xlsb" 
    Dim sTitle As String 

sTitle = Application.Caption 

Set wbs = Application.Workbooks 
Set re = New RegExp 
With re 
    .Pattern = sPat 
    .Global = True 
    .IgnoreCase = True 
End With 
IndexReturns = re.Replace(ThisWorkbook.FullName, sRepl) 

For Each wb In wbs 
    If wb.FullName = IndexReturns Then Exit Sub 
Next wb 

Application.ScreenUpdating = False 

wbs.Open (IndexReturns) 
Set re = Nothing 

AppActivate sTitle 'sTitle contains title of thisworkbook 

'The below doesn't work either 
'AppActivate ThisWorkbook.Application.Caption 

Application.ScreenUpdating = True 

End Sub 

risposta

1

Quando il codice di Comintern non ha modificato il comportamento, mi sono concentrato su se si trattasse di un problema di temporizzazione, con IndexReturns non avendo una finestra attiva fino a dopo il codice Attivato l'altra cartella di lavoro. E il codice per regolare per questo sembra aver risolto il problema.

Ho aggiunto un ciclo per verificare la presenza di una finestra di IndexReturns prima di eseguire il metodo AppActivate.

Set wb = wbs.Open(IndexReturns) 

Do 
    DoEvents 
Loop Until wb.Windows.Count > 0 

AppActivate sTitle 

Per buona misura, ho fatto anche quella finestra invisibile, come non ho bisogno di accedervi per scopi diversi da quelli di debug:

wb.Windows(1).Visible = False 

Questo sembra aver risolto il problema causato da Excel Apertura 2016 dei file in modo diverso rispetto al 2007.

0

Io, ovviamente, non posso provare nel proprio ambiente, ma mi piacerebbe provare a bypassare qualunque Excel sta facendo e l'utilizzo di una chiamata a BringWindowToTop o SetForegroundWindow invece di AppActivate:

#If VBA7 Then 
    Public Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal _ 
      hwnd As LongPtr) As Boolean 
    Public Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal _ 
      hwnd As LongPtr) As Boolean 
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias _ 
      "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName _ 
      As Any) As LongPtr 
#Else 
    Public Declare Function BringWindowToTop Lib "user32" (ByVal _ 
      hwnd As Long) As Boolean 
    Public Declare Function SetForegroundWindow Lib "user32" (ByVal _ 
      hwnd As Long) As Boolean 
    Public Declare Function FindWindow Lib "user32" Alias _ 
      "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName _ 
      As Any) As Long 
#End If 

Quindi ...

Dim hwnd As Long 
    hwnd = FindWindow(vbEmpty, sTitle) 'sTitle contains title of thisworkbook 
    BringWindowToTop hwnd  
    '...or... 
    SetForegroundWindow hwnd 
+0

Grazie per il consiglio. L'ho provato, e non ha cambiato il comportamento. Tuttavia, mi ha portato a fare alcuni test che indicavano un problema di temporizzazione. Vedi la mia risposta. –

Problemi correlati