2015-12-25 16 views
5

最近、Office 365/Excel 2016にアップグレードした結果、動作が変更されました。ワークブック(「ポートフォリオ評価」)には、ワークブック(「インデックス返品」)が開いているかどうかを確認するWorkbook_openプロシージャが含まれています。そうでなければ、そのワークブックを開きます。Workbook_Open後にフォーカスが間違ったExcelウィンドウ

Excel 2007では、Index Returnsはバックグラウンドで開いてそこにとどまり、これが望ましい動作です。これは "ウィンドウ内"で、リボンのWindowタブのArrange Allオプションを使用して、同じExcelウィンドウで表示できます。

Excel 2016では、Workbook_Openプロシージャで開くと、Index Returnsが独自のExcelウィンドウで開き、手前に表示されます。 (これは、Portfolio Appreciationと同じExcelウィンドウでは表示できなくなります)。

Index Returnsが前にあるという事実が問題です。

DDEを使用して他のアプリケーションを無視するオプションを選択して選択を解除しようとしました。私はAppActivateメソッド(以下のコードに示されています)を試して、MsgBoxを使って、引数が関連するタイトルバーと一致することを確認しました。

次にどこに行くのかわかりません。提案は高く評価されました。

また、Index Returnsにはマクロまたは接続が含まれていません。 Portfolio AppreciationにはWorkbook_Open以外のマクロは含まれておらず、開いたときに更新されるWebクエリがあります(クエリーはいくつかの株価情報をダウンロードします)。


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 

答えて

1

Cominternのコードが振る舞いを変えなかったとき、私はこれがタイミングの問題かどうかに焦点を当てました。IndexReturnsはアクティブなウィンドウがないので、コードの後に​​別のブックをアクティブにします。これを調整するコードが問題を解決したようです。

AppActivateメソッドを実行する前に、IndexReturnsのWindowの存在をテストするループを追加しました。良い測定のために

Set wb = wbs.Open(IndexReturns) 

Do 
    DoEvents 
Loop Until wb.Windows.Count > 0 

AppActivate sTitle 

、私はデバッグ目的以外のためにそれにアクセスする必要がないように私も、そのウィンドウが見えないように:

wb.Windows(1).Visible = False 

これは、Excelによってもたらされた問題を解決しているようです2016は2007年とは違ってファイルを開きます。

0

私は明らかに自分の環境でテストすることはできませんが、私はExcelがやっているものは何でも迂回しBringWindowToTopまたはSetForegroundWindowの代わり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 

次に...

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

ありがとうございました。私はそれを試して、それは行動を変更しませんでした。しかし、それはタイミングの問題を指摘していくつかのテストを行うようになった。私の答えを見てください。 –

関連する問題