[[20141028192106]] 『シート切り替え』(YNo) >>BOT

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

 

『シート切り替え』(YNo)

教えてください、、、

シート見出しをクリクしてシートを替えるとき元のシートの選択セル?を「a1」にしてからクリックしたシートに変えることをしたいのですが、、、そのようなきとができますか、、、

よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 シートを切り替えたときに切り替えた「先」のシートのA1にカーソルを移動、ではだめですか?
 シートのActivateイベントなどでは「元」のシートの情報は拾えないです。
 どこかに記録しておけば別ですが。
(カリーニン) 2014/10/28(火) 20:13

 >シートのActivateイベントなどでは「元」のシートの情報は拾えないです。

 Workbook_SheetDeactivateイベントで取得できましたね。
 失礼しました。
(カリーニン) 2014/10/28(火) 20:18

 実験してみました。

 'シートがアクティブになったときに切替「先」のA1セルに飛ぶ
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 Application.Goto Sh.Range("A1"), True
End Sub

 特に問題なし

 'シートが非アクティブになったときに切替「元」のA1セルに飛ぶ
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
 Application.EnableEvents = False
 Application.Goto Sh.Range("A1"), True
 Application.EnableEvents = True
End Sub

 「元」のシートのセルに飛ぶため実質シートの切替出来ず。
(カリーニン) 2014/10/28(火) 20:37

カリーニン さま

返事が遅れてしまいました、お詫びします。
前回は割り込み失礼しました、今回もありがとうございます。
難しいんですね。

> 'シートがアクティブになったときに切替「先」のA1セルに飛ぶ

元のシートのセルを「a1」ではなく、これを利用させていただき何とかできないかトライしてみます。

ありがとうございました。
今後ともよろしく尾根がします。

(YNo) 2014/10/29(水) 16:49


カリーニン さま

教えていただいた、、、

> 'シートが非アクティブになったときに、、、、、
>Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

これを使用して、

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
  Range("A1").Activate
End Sub

としてみましたら、シートは切り替わり、元のシートの「a1」にカーソルが行っている、アクティブになっているようですが、
この様な使い方はNGなのでしょうか?

お教えください、よろしくお願いします。
(YNo) 2014/10/30(木) 13:31


 ちょっとテスト中なのですが、それでいいのかまだ判断がつきません。
 ↓を試してみてください。

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

 Range("A1").Activate
 MsgBox ActiveCell.Address & vbCrLf & ActiveCell.Parent.Name & vbCrLf & Sh.Name
(カリーニン) 2014/10/30(木) 19:06

 そもそも、何故こういうことが必要か、を提示されたら全く別のアプロ−チがあるかもしれません。
(カリーニン) 2014/10/30(木) 19:33

 単純に↓で試しました。

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

 MsgBox ActiveSheet.Name & vbCrLf & Sh.Name
End Sub

 Sheet3からSheet4に切り替えたとき、

 Sheet4
 Sheet3

 と表示されました。

 ですので、

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
  Range("A1").Activate
End Sub

 だと、切り替えた後のアクティブシートのA1セルがアクティブになると思います。
(カリーニン) 2014/10/30(木) 19:38

カリーニン さま

ごめんなさい。よく理解できません。

Sheet1→Sheet2で、、、Msgは $a$1、Sheet2、Sheet1とでます、、、

これは、Sheet1もSheet2もActiveセルは「a1」になっているという理解でいいのでしょうか?
元のシートの「a1」セルにカーソルが行っている?アクティブになって入ればそれでOKなのですが、、、

今のところ問題なく動くようなのですが、もう少しトライしてみます。

ありがとうございました。

ごめんんささい、、、これで送信?しましたら衝突?しました?でダメでした。。。。

やりたいことは前回お教えいただいた選択行に色を付けるで、シートを替えるときシートを保護しているとエラーになってしまうので、エラーを無視して、、、元のシートの選択行に色を付けたまま、シートを替えてしまい強引に元のシートの色のついた行を「a1」に、、、行1にもっていき逃げようと思ったのです。

元のシートのカーソルも「a1」に行っているみたいですが、、、、
もう少しトライしてみます

ありがとうございました。。。

(YNo) 2014/10/30(木) 20:18


 ↓ですね。

[[20141011233727]] 『選択行全体に色をつけたいのですが教えて下さい』(taronippon) 

 >シートを替えるときシートを保護しているとエラーになってしまうので、

 何のエラーでしょう?
 マクロのエラー?それともエクセルが発するエラー?
 何かエラーメッセージが出てるのでしょうか?
(カリーニン) 2014/10/30(木) 20:42

 >Sheet1→Sheet2で、、、Msgは $a$1、Sheet2、Sheet1とでます、、、 
 >これは、Sheet1もSheet2もActiveセルは「a1」になっているという理解でいいのでしょうか? 

 Sheet2のみがA1セルがアクティブになります。
(カリーニン) 2014/10/30(木) 20:59

カリーニン さま

ありがとうございます。
Sheet2のみですか、、、アクティブと言う言い方はまずいのかな、、、よく理解できていません。
カーソルはSheet1もセル「a1」に行っているみたいですが、、、、

混乱してきました、エラーメッセージ等は整理してから載せます。少し時間を下さい。。。

ありがとうございました。

(YNo) 2014/10/30(木) 21:12


 >カーソルはSheet1もセル「a1」に行っているみたいですが、、、、 

 これはどのように確認しましたでしょうか?
 Sheet1をアクティブにしたらSheet1のA1がアクティブになりますので
 これで確認することはできません。

 Sheet1のB3をアクティブにした状態でSheet2に切り替え、上書き保存して閉じる。
 Shiftキーを押しながらブックを起動するとマクロ無効で開けます。
 マクロ無効で開いた状態でSheet1のアクティブセルがどこかを確認してみてください。 
(カリーニン) 2014/10/30(木) 21:22

カリーニン さま
ありがとうございます。

> Sheet1をアクティブにしたらSheet1のA1がアクティブになりますので、、、、、

アクティブにしたらアクティブにしたシートのA1がアクティブになるのでしょうか?

> Sheet1のB3をアクティブにした状態でSheet2に切り替え、上書き保存して閉じる。

 >Shiftキーを押しながらブックを起動するとマクロ無効で開けます。
 >マクロ無効で開いた状態でSheet1のアクティブセルがどこかを確認してみてください。

残念ながらB3のままでした。。。。。

エラーは前回お教えいただいた選択行に色を、、、、で、下記を実行しシートを替えると、
'**の点でエラーになります。実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。 。。とでます。
エラー時デバッグではなく終了を選ぶと次からはエラーにならず継続出来るのですが、この時は
元の選択行に色がついたままですのでこれを防ぎたかったのです。

 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Not R Is Nothing Then
        ActiveSheet.Unprotect
'        On Error Resume Next
        R.Interior.ColorIndex = xlNone      '** ここでエラーに、、

    End If
    ActiveSheet.Unprotect
    Sh.Range(Sh.Cells(Target.Row, "b"), Sh.Cells(Target.Row, "m")).Interior.ColorIndex = 34   '35
    Set R = Sh.Range(Sh.Cells(Target.Row, "b"), Sh.Cells(Target.Row, "m"))
    Calculate
    ActiveSheet.Protect
 End Sub

何回もすみません。
よろしくお願いします。
(YNo) 2014/10/31(金) 08:48


> Sheet1をアクティブにしたらSheet1のA1がアクティブになりますので、、、、、 アクティブにしたらアクティブにしたシートのA1がアクティブになるのでしょうか?

コードに解説を付けると↓のようになります。

'シートがDeactivate(非アクティブ)になったとき
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

 'アクティブシートのA1セルをアクティブにする
 Range("A1").Activate
 'アクティブセルのアドレス、アクティブセルの親オブジェクト名(今回はシート名)、変数Shの名前
 MsgBox ActiveCell.Address & vbCrLf & ActiveCell.Parent.Name & vbCrLf & Sh.Name
End Sub

↓のコードで変数Rが使われてますが、変数Rの宣言はどちらで行われているのでしょう?

 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Not R Is Nothing Then
        ActiveSheet.Unprotect
'        On Error Resume Next
        R.Interior.ColorIndex = xlNone      '** ここでエラーに、、

    End If
    ActiveSheet.Unprotect
    Sh.Range(Sh.Cells(Target.Row, "b"), Sh.Cells(Target.Row, "m")).Interior.ColorIndex = 34   '35
    Set R = Sh.Range(Sh.Cells(Target.Row, "b"), Sh.Cells(Target.Row, "m"))
    Calculate
    ActiveSheet.Protect
 End Sub
(カリーニン) 2014/10/31(金) 10:43

 こんな感じでいかがでしょう?

Dim flg As Boolean
Dim R As Range

Private Sub Workbook_Open()

 ActiveSheet.Unprotect
 Set R = ActiveSheet.Range(ActiveSheet.Cells(ActiveCell.Row, "b"), ActiveSheet.Cells(ActiveCell.Row, "m"))
 R.Interior.ColorIndex = xlNone
 R.Interior.ColorIndex = 34
 ActiveSheet.Protect
 flg = True
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

 flg = False
 If Not R Is Nothing Then
    R.Parent.Unprotect
    R.Interior.ColorIndex = xlNone
    R.Parent.Protect
 End If
 ActiveCell.Activate
 Call Workbook_SheetSelectionChange(ActiveSheet, ActiveCell)
 DoEvents
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

 If Not R Is Nothing Then
    ActiveSheet.Unprotect
    If flg = True Then R.Interior.ColorIndex = xlNone
 End If
 ActiveSheet.Unprotect
 Sh.Range(Sh.Cells(Target.Row, "b"), Sh.Cells(Target.Row, "m")).Interior.ColorIndex = 34   '35
 Set R = Sh.Range(Sh.Cells(Target.Row, "b"), Sh.Cells(Target.Row, "m"))
 Calculate
 ActiveSheet.Protect
 flg = True
End Sub
(カリーニン) 2014/10/31(金) 11:52

カリーニン さま

ありがとうございます。
変数Rは、、

Option Explicit

 Dim R As Range
でしています。書き忘れですね、失礼しました。

今外出から帰りました、お教えいただいたコードはこれからトライします。

(YNo) 2014/10/31(金) 12:44


カリーニン さま

お教えいたコードでやってみました。

Dim flg As Boolean
Dim R As Range

Private Sub Workbook_Open()
、、、、、、、
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
、、、、、、、、、
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
、、、、、、、、、、、、、、、、、、、、、
End Sub

上記を(上記のみを)ThisWorkbookに書いていいのですね。

これですと、シート1で3行目に色を付けて、シート2に移りその後シート1に戻ると3行目に色がついたまま?になるようですが?

これを防ぎたい、(シート1に戻ったら戻った時点で1行目に色がつくようにしたい)のですが、、、、

何度もすみません、よろしくお願いします。

(YNo) 2014/10/31(金) 16:10


 >これですと、シート1で3行目に色を付けて、シート2に移りその後シート1に戻ると3行目に色がついたまま?になるようですが?
 >これを防ぎたい、(シート1に戻ったら戻った時点で1行目に色がつくようにしたい)のですが、、、、

 ??

 シート1に戻ったら3行目がアクティブになっているはずですので3行目に色が付いていて当たり前ですよね??
 どうしたいのかが分かりません。

 A1セルをアクティブにするのはエラー防止のためだったのですよね?
 私のコードではエラーにならないのでA1セルをアクティブにする必要はないですよね?
(カリーニン) 2014/10/31(金) 19:09

カリーニン さま
ありがとうございます。
説明不足で申し訳ありません、エラーを無くす事と選択行が1になることを狙っていました。
行1の高さは数ピクセルで目立たなくするつもりでした。

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

 flg = False
 If Not R Is Nothing Then
    R.Parent.Unprotect
    R.Interior.ColorIndex = xlNone
    R.Parent.Protect
 End If
 ActiveCell.Activate
 Call Workbook_SheetSelectionChange(ActiveSheet, ActiveCell)
 DoEvents
 Range("A1").Activate       '追加
End Sub

上の位置に Range("A1").Activate を追加することで上手くいきました。

下手な説明にもかかわらずおつきあい下さいましてありがとうございました。
今後ともよろしくお願いします。

ありがとうございました。

(YNo) 2014/10/31(金) 20:01


コメント返信:

[ 一覧(最新更新順) ]


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