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

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Application.EnableEvents = False
Dim TargetBook As Workbook
Set TargetBook = Workbooks.Open(ファイルパス)
Windows("2.xlsm").Visible = False
TargetBook.Sheets(1).Cells(1, 1) = ThisWorkbook.Sheets(1).Cells(1, 1)
TargetBook.Close SaveChanges:=True
Application.EnableEvents = True
End If
End Sub


このコードを両方のブックのSheet1に書き込んだ状態で1.xlsmのセルA1の値を変更すると2.xlsmが開けなくなります(その逆も)。原因がわかる方、教えていただけると嬉しいです。

A 回答 (3件)

こんにちは、


専門家でないので正しい回答でない可能性がありますが
Windows("2.xlsm").Visible = False 又は
Windows("1.xlsm").Visible = False により設定された設定が
Excelインスタンスが終了するまで残る(有効)なのでは無いでしょうか?
従ってCloseの前で一瞬表示する必要があると思いますね

Windows("2.xlsm").Visible = True
TargetBook.Close SaveChanges:=True

ちなみに、Windowにかかっているので、開いていると思います
VBエディターにはインスタンスされると思いますので確認してみてください

不具合なのか仕様なのか・・設定しているのだから当然なのか?
良く分かりません
    • good
    • 0

#2


確認の為、少し調べました
間違いがありましたので訂正します
>Excelインスタンスが終了するまで残る(有効)
見当違いでした。非表示WindowはOS側の制御のようですね

Excelを終了しても 表示Windowとして実行されないようです

Windows("2.xlsm").Visible = True で 表示されるのが嫌な場合や
不具合、デバッグなどで終了してしまう場合の取り合えずなら
各対象ブックに
Private Sub Workbook_Open()
Windows(ThisWorkbook.Name).Visible = True
End Sub
なんて方法も・・と力業や体裁を考えない私は有かな?と
(当然として設定を戻すのが良いと思います)
    • good
    • 0

ご存じのように、Cell(1,1)のアドレスはA1ですので、両方のブックにある


Private Sub Worksheet_Change(ByVal Target As Range)
・・・
TargetBook.Sheets(1).Cells(1, 1) = ThisWorkbook.Sheets(1).Cells(1, 1)
・・・
※この時点で他方のPrivate Sub Worksheet_Changeが発動
End Sub
が無限に互いを呼び出しあっているのはないですか?
ただし、エンドレスなだけであって、ファイルが開けなくことはないと思います。
原因は
Set TargetBook = Workbooks.Open(ファイルパス)
ではないでしょうか?
このコマンドはすでに開いているファイルに対してはエラーを起こします。
    • good
    • 0

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