プロが教えるわが家の防犯対策術!

いつもお世話になっております。
遣りたいことは

book1
book2
があります。


book1には
Application.Run "'C:\Users\user\OneDrive\デスクトップ\B2.xlsm'!fe"

book2 には
Sub fe()
If Application.Wait(Now + TimeValue("0:00:10")) Then
Workbooks("B2.xlsm").Close
End If
End Sub

が記述されています。
book2 にのほうに

book2がひらかれていなければ、なにもしないという
条件をつけたいのですが、わかる方おしえてくれませんでしょうか

質問者からの補足コメント

  • へこむわー

    いつもお世話になっております。
    Sub fe()
    If Application.Wait(Now + TimeValue("0:00:10")) Then
    Workbooks("B2.xlsm").Close
    End If
    End Sub
    実をいいますと、これを実行するとWorkbooks("B2.xlsm")が
    一度開いて閉じてしまいます。
    それが、よくなく質問をいたしました。
    なかなか いいコードないでしょうか

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/05/18 21:18
  • へこむわー

    以下のように実行しました。
    アプリケーション定義エラーとなりました。
    おしえてくれませんでしょうか
    Sub te1()
    Dim flag As Boolean
    Dim wb As Workbook

    flag = False

    For Each wb In Workbooks
    If wb.Name = "B2.xlsm" Then flag = True: Exit For
    Next wb

    If flag Then Workbooks("B2.xlsm").Close Else MsgBox "開いていない"
    End Sub

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/05/18 22:02

A 回答 (6件)

こんにちは。



On Error Resume Next
Dim book As Workbook
Set book =Workbooks("ブック名")
On Error Goto 0

If book is Nothing Then
ブックは開いていない
End If

みたいに参照でエラーになるかで判定するとか。

または、そのブックのディレクトリーに∽$で始まるアーカイブ、隠し属性の一時ファイルが存在してるかチェックとかでもできそうな気がします。
    • good
    • 0
この回答へのお礼

いろいろ試してみます。
ありがとうございます。

お礼日時:2022/05/18 21:16

#5


またやってしまった
#5のコードを試す場合は Exit Function の上に閉じるコードと解放コードを 必ず 加えてください。。。

task_check = True
WD.Quit
Set WD = Nothing
Exit Function

タスクと書いてしまいましたが、Wordが取得するプロセスコレクションです
すみません。
    • good
    • 0

こんばんは 


すでに#2様が当回しに回答は出されていますが
明確に出来ないとの回答が無いので改めて

>book2 にのほうに
これは、Application.Runなので閉じていても開かれるので・・・無理です。
従って、book1でApplication.Run実行前に検証し分岐処理するしかないです
少なくとも、私は知りません

開かれているかどうかを検証する方法はすでに回答が出ておりますしご存知かもしれませんが色々あります。
一般的には開かれているブック名を調べる方法
あとは、開かれているブックに対して出来ないメソッドや逆に閉じてるブックにはできないメソッドでエラーを返す方法、変わり種ではタスクを確認する方法などです。

で、一応、反則ギリ?の方法(環境によっては処理時間が大きい)
Sub sample()
Dim bkname As String
bkname = "B2.xlsm"
If task_check(bkname) Then Application.Run "'C:\Users\user\OneDrive\デスクトップ\" & bkname & "'!fe"
End Sub

Function task_check(bkname As String) As Boolean
Dim WD, task
Set WD = CreateObject("Word.Application")
For Each task In WD.Tasks 'Word VBA Tasksコレクション
If task.Visible = True Then
If task.Name = bkname & " - Excel" Then
task_check = True
Exit Function
End If
End If
Next
WD.Quit
Set WD = Nothing
End Function

Wordが必須
値は B2.xlsm - Excel で良かったと思いますが違っていたら
ごめんなさい。
    • good
    • 0
この回答へのお礼

いつもお世話になっております。
参考にいたします。
いつもありがとうございます。

お礼日時:2022/05/19 07:49

良くわかりませんが、、



book1 = B1.xlsm
book2 = B2.xlsm

と前提します。

B2.xlsm がオープンしてなければ Book2 の マクロ fe() を
実行させないということかな。

単純ブック名だと被る可能性がある気がするのでパス付きで
調べてます。

' Book1側
Sub testProc()

  Dim filename As String: filename = "C:\temp\B2.xlsm"
  
  Dim book As Workbook, check As Boolean
  '
  For Each book In Workbooks
    If StrComp(book.FullName, filename, vbTextCompare) = 0 Then
      check = True
      Exit For
    End If
  Next
  '
  If check Then
    Application.Run "'" & filename & "'!fe"
  Else
    MsgBox filename & "が開いていない"
  End If

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考にいたします。

お礼日時:2022/05/18 22:33

こんばんは



すでに回答が出ていますが、別法です。
「開いているブックを順に調べて、対象のブックが存在するかどうかを見る」という方法です。

flag = False
For Each wb In Workbooks
 If wb.Name = "探索ブック名" Then flag = True: Exit For
Next wb

If flag Then MsgBox "開いている" Else MsgBox "開いていない"
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/05/19 07:49

book1に記載するならわかるのですが、book2の方にってなるとマクロが呼び出されている時点で内部的にでも開かれるものではないのかな?


⇒経験はありませんから憶測です。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!