[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『クイック起動バーからブックを起動する』(のらじろう)
下記のマクロは指定のブック(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.