[[20150525223752]] 『クイック起動バーからブックを起動する』(のらじろう) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『クイック起動バーからブックを起動する』(のらじろう)

 下記のマクロは指定のブック(Daily xl.xlsm)が既に開いているか否かをチェックし、開いていなかったら起動、というマクロです。

 このコードを記述しているブック(Daily xl_起動)のショートカットファイル(lnk)をクイック起動バーに登録してあります。
 クイック起動バーのアイコンをクリックすることでDaily xl.xlsmを間接的に起動します。

 Daily xl.xlsmのショートカットをクイック起動バーに登録すると、二重に起動してしまったときに
 「Daily xl.xlsm は既に開いています。2 重に開くと、これまでの変更内容は破棄されます。Daily xl.xlsm を開きますか?」という
 メッセージが出てしまうため、間接的に他のブックから既に開いてないかチェックした後に開く、という流れにしています。

 いま問題になっているのは、「Daily xl_起動」をクイック起動バーからクリックで起動したときに「Daily xl.xlsm」が開くまで
 10数秒時間が掛かってしまう、という点です。

 クイック起動バーに「Daily xl.xlsm」のショートカットファイルを登録して直接起動した場合は直ちに開きます。

 直接起動した場合は二重起動の警告が出る、かといって間接的に起動した場合は時間がかかる、というジレンマがあります。
 ちなみに、どちらのブックもクイック起動バーからではなくリンク先の元のブックを直接起動した場合は直ちに起動します。

 クイック起動バーからの起動はアイコンをクリックするか「Windows」+数字キーで行っています。

 デスクトップに「Daily xl.xlsm」のショートカットファイルを作成し起動、とした場合は起動時間はクイック起動バーに
 「Daily xl.xlsm」を直接おいて起動した場合とクイック起動バーから「Daily xl_起動」で間接的に起動した場合の中間くらいの
 時間で起動します。
 なお、デスクトップにショートカットを置いた場合は、プロパティでCtrl+Alt+任意のキーで起動するように設定できますので
 ショートカットキーで起動して試してます。

 クイック起動バーから起動し、かつ、即座に起動するようにするにはどのようしたらいいでしょうか、ご教示お願いいたします。

 '-----------------------

 Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" ( _
      ByVal hWnd As Long, _
      ByVal lpString As String, _
      ByVal cch As Long _
      ) As Long

 Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" ( _
      ByVal hWnd As Long, _
      ByVal lpClassName As String, _
      ByVal nMaxCount As Long _
      ) As Long

 Declare Function EnumWindows Lib "user32.dll" ( _
      ByVal lpEnumFunc As Long, _
      lParam As Long _
      ) As Long

 Dim mydic As Object
 Dim cnta As Integer
 Dim cntb As Integer
 Dim clsA As String
 Dim clsB As String

 Function EnumWindowsProc(ByVal hWnd As Long, lParam As Long) As Long
  Dim mycls As String
  Dim StrCls As String
  Dim StrCap As String
  Dim myttl As String
   StrCap = String(255, Chr(0))
   Call GetWindowText(hWnd, StrCap, Len(StrCap))

   StrCls = String(50, Chr(0))
   Call GetClassName(hWnd, StrCls, Len(StrCls))

   mycls = Left(StrCls, InStr(1, StrCls, Chr(0)) - 1)
   If mycls = clsB Then
      cntb = cntb + 1
      myttl = Left(StrCap, InStr(1, StrCap, Chr(0)) - 1)
      If mydic.exists(myttl) Then
      Else
         mydic.Add myttl, myttl
      End If
    ElseIf mycls = clsA Then
      cnta = cnta + 1
    End If
    EnumWindowsProc = 1
 End Function

 Sub dlopen()
  Dim wbpath As String
  Dim fol As String
  Dim wbmei As String
  Dim kaku As String
   clsA = "XLMAIN"
   clsB = "MS-SDIb"
   cnta = 0
   cntb = 0
   fol = ThisWorkbook.Path
   wbmei = "Daily xl"
   kaku = "xlsm"
   wbpath = fol & "\" & wbmei & "." & kaku
   If Dir(wbpath) <> "" Then
   Else
      AppActivate Application.Caption
      MsgBox wbpath & vbCrLf & "は存在しないファイルです。"
      Exit Sub
   End If
   Set mydic = CreateObject("Scripting.Dictionary")
   Call EnumWindows(AddressOf EnumWindowsProc, 0)
   If cnta <> 1 Then
      MsgBox "エクセルが複数起動しています。"
   End If
   If mydic.exists(wbmei & "." & kaku) Then
      'MsgBox wbmei & "." & kaku & vbCrLf & "は既に開いています。"
   Else
      'MsgBox wbmei & "." & kaku & vbCrLf & "を開きます。"
      Workbooks.Open wbpath
   End If
   ThisWorkbook.Saved = True
   ThisWorkbook.Close
   mydic.RemoveAll
   Set mydic = Nothing
 End Sub

< 使用 Excel:Excel2007、使用 OS:WindowsVista >


 APIを持ち出すまでもなく、単純に、

http://officetanaka.net/excel/vba/tips/tips108.htm

 このページの Sample4 のようなコードで判断してはいかがでしょうか?

(β) 2015/05/25(月) 23:15


 βさん、ありがとうございます。

 下記のように書き換えてみましたが、起動時間は変わりませんでした。

 Sub dnopen()
  Dim wbpath As String
  Dim fol As String
  Dim wbmei As String
  Dim kaku As String
   fol = ThisWorkbook.Path
   wbmei = "Daily xl"
   kaku = "xlsm"
   wbpath = fol & "\" & wbmei & "." & kaku
   If Dir(wbpath) <> "" Then
   Else
      AppActivate Application.Caption
      MsgBox wbpath & vbCrLf & "は存在しないファイルです。"
      Exit Sub
   End If
   On Error Resume Next
   Open wbpath For Append As #1
   Close #1
   If Err.Number > 0 Then
       MsgBox "すでに開かれています"
   Else
       Workbooks.Open wbpath
   End If
   ThisWorkbook.Saved = True
   ThisWorkbook.Close
 End Sub
(のらじろう) 2015/05/25(月) 23:37

 実際に開かれるまでに10秒というのは、へんですよねぇ。
 コードの先頭を含む、要所、要所に Debug.Print 番号 ; Now() といったものをいれておいて
 どこで、時間がかかっているのかを確かめてみてはいかがでしょう。

 ところで、この DoOpen そのものは、どのように実行しているのですか?

 追伸です。

 関連はないかもしれませんが、こんなページがありました。

http://www.saka-en.com/office/excel-open-slow/

(β) 2015/05/26(火) 05:31


 >この DoOpen そのものは、どのように実行しているのですか?

 Daily xl_起動.xlsmのThisWorkbookモジュールに下記のように記述し呼び出しています。

 Private Sub Workbook_Open()
  Call dnopen
 End Sub

 「Daily xl.xlsm」のThisWorkbookモジュールの記述全てをコメントアウトした状態で
 「Daily xl_起動.xlsm」から「Daily xl.xlsm」を起動させてみてもやはり時間がかかります。

 「Daily xl.xlsm」のブックのサイズは249kb有りますし、このブックは作成してから7-8年
 くらいたってます。エクセル2002時代に作成しいろいろ改造を加えながら今日に至っています。
 いろいろゴミが溜まっているのかもしれません。

 一度作成しなおしてみます。
 ありがとうございました。
(のらじろう) 2015/05/26(火) 21:28

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.