[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『スクロールに追従して図形を表示する(ウィンドウ枠の固定ではありません。)』(ぱぐ)
図形をスクロールした時に追従させて表示させるようにしたくネットで検索したら下記のコードを見つてやりたいことはできたのですが、これに「特定の範囲を選択したとき」を追加したいのですが、どうすればよいかわからないので教えて頂きたく投稿致しました。
たとえばテキストボックス1をrange(B70:AU129)の範囲のセルを選択したときにオブジェクトが下記コードの位置に表示される、というのを作成したいと思っています。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With ActiveWindow.VisibleRange
Me.Shapes("テキスト ボックス 1").Left = .Left + .Width - Me.Shapes("テキスト ボックス 1").Width - 20
Me.Shapes("テキスト ボックス 1").Top = .Top + .Height - Me.Shapes("テキスト ボックス 1").Height - 20
End With
End Sub
上記のやり方かユーザーフォームを作成し、モードレスで表示をさせておく方法があると思うのですが、ユーザーフォームで行った場合で上から下にスクロールさせていったとき、例えばC列の見えているセルの文字を自動で更新して表示する。というようなことはできるのでしょうか?
ご教授ください。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
>>ユーザーフォームで行った場合で上から下にスクロールさせていったとき、例えばC列の見えているセルの文字を自動で更新して表示する。というようなことはできるのでしょうか?
この意味がよくわかりません。 質問は、指定位置に図形を配置するということではなかったのですか? 文字を自動更新とは??
ということで、よくわかりませんが、以下は参考になりますか。 (PCによっては最下段、左端列が少しかけて表示されるかもしれませんが)
Sub Test() Dim tl As Range, tr As Range, bl As Range, br As Range
With ActiveWindow.VisibleRange Set tl = .Cells(1) Set tr = .Cells(1, .Columns.Count) Set bl = .Cells(.Rows.Count, 1) Set br = .Cells(.Rows.Count, .Columns.Count)
MsgBox "表示されているセル領域は " & .Address & "です" & vbLf & _ "左上隅: " & tl.Address & vbLf & _ "右上隅: " & tr.Address & vbLf & _ "左下隅: " & bl.Address & vbLf & _ "右下隅: " & br.Address End With End Sub
(β) 2016/03/09(水) 13:03
下記のコードだと現状はどこのセルを選択しても「テキストボックス1」というのが
指定の箇所に出てきてしまいますが、このコードに特定の範囲のセルを選択した時だけ
「テキストボックス1」を表示させるように変更したいと思っています。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With ActiveWindow.VisibleRange
Me.Shapes("テキスト ボックス 1").Left = .Left + .Width - Me.Shapes("テキスト ボックス 1").Width - 20
Me.Shapes("テキスト ボックス 1").Top = .Top + .Height - Me.Shapes("テキスト ボックス 1").Height - 20
End With
End Sub
例えば
Range(A1:C10)までの範囲のセルを選択した時はテキストボックス1が指定位置に表示させる。
Range(A11:C20)までの範囲のセルを選択した時はテキストボックス2が指定位置に表示される。
Range(A21:C30)までの範囲のセルを選択した時はテキストボックス3が指定位置に表示される。
というのを作成したいと思っています。
(ぱぐ) 2016/03/09(水) 14:05
【指定位置】というのがどこなのか、不明ですが、以下のコードは、該当の3つの領域の中心にテキストボックスの中心を配置します。 もし、選択が該当領域ではなかったらテキストボックスは表示されません。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim pos As Range
Shapes("テキスト ボックス 1").Visible = False
If Not Intersect(Target, Range("A1:C10")) Is Nothing Then Set pos = Range("A1:C10") ElseIf Not Intersect(Target, Range("A11:C20")) Is Nothing Then Set pos = Range("A11:C20") ElseIf Not Intersect(Target, Range("A21:C30")) Is Nothing Then Set pos = Range("A21:C30") End If
If pos Is Nothing Then Exit Sub
With Shapes("テキスト ボックス 1") .Left = pos.Left + pos.Width / 2 - .Width / 2 .Top = pos.Top + pos.Height / 2 - .Height / 2 .Visible = True End With
End Sub
(β) 2016/03/09(水) 14:27
↑ あっと、領域ごとに表示するテキストボックスが異なるんですか!!
後ほど、改訂版をアップします。
(β) 2016/03/09(水) 14:29
案1 基本的にアップ済みコードとかわりません。領域ごとにテキストボックスをかえただけです。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim pos As Range Dim sp As Shape
Shapes("テキスト ボックス 1").Visible = False Shapes("テキスト ボックス 2").Visible = False Shapes("テキスト ボックス 3").Visible = False
If Not Intersect(Target, Range("A1:C10")) Is Nothing Then Set pos = Range("A1:C10") Set sp = Shapes("テキスト ボックス 1") ElseIf Not Intersect(Target, Range("A11:C20")) Is Nothing Then Set pos = Range("A11:C20") Set sp = Shapes("テキスト ボックス 2") ElseIf Not Intersect(Target, Range("A21:C30")) Is Nothing Then Set pos = Range("A21:C30") Set sp = Shapes("テキスト ボックス 3") End If
If pos Is Nothing Then Exit Sub
With sp .Left = pos.Left + pos.Width / 2 - .Width / 2 .Top = pos.Top + pos.Height / 2 - .Height / 2 .Visible = True End With
End Sub
案2 お勧め版
あらかじめ、3つのテキストボックスを表示したい場所にセットしておいてください。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim sp As Shape
Shapes("テキスト ボックス 1").Visible = False Shapes("テキスト ボックス 2").Visible = False Shapes("テキスト ボックス 3").Visible = False
If Not Intersect(Target, Range("A1:C10")) Is Nothing Then Set sp = Shapes("テキスト ボックス 1") ElseIf Not Intersect(Target, Range("A11:C20")) Is Nothing Then Set sp = Shapes("テキスト ボックス 2") ElseIf Not Intersect(Target, Range("A21:C30")) Is Nothing Then Set sp = Shapes("テキスト ボックス 3") End If
If sp Is Nothing Then Exit Sub
sp.Visible = True
End Sub
(β) 2016/03/09(水) 14:35
やりたいことにかなり近づきました!
スクロールした時にその画面からいなくならず画面内の指定位置に表示させるということは
できますでしょうか?
(ぱぐ) 2016/03/09(水) 15:15
スクロールした状態のセルがどうなっているか、これは、参考コードとして (β) 2016/03/09(水) 13:03 でアップしましたね。 これを使えば、エクセル画面の右隅のセルが何なのか、把握できますね。 そうすると、そのセル.Left+そのセル.Width-テキストボックスのWidth を TextBoxのLeft にしてやることが考えられますね。 Top についても同様に考えることができますね。
もう1つ、PCのデスクトップ画面に対してセットする方法。 ただしエクセルが最大化で表示されている状態が前提ですけど。
Application.Left + Application.Width が 画面右端のポイント。 Application.Top + Application.Height が画面の一番下のポイント。
ここを起点にして、テキストボックス の Left や Top を計算して設定することもできますね。
(β) 2016/03/09(水) 16:41
↑ 2つの方法のうち、後のほうは、ちょっと思うような場所にするのに調整が面倒なので、最初のほうがいいですね。
サンプルを。新規ブックのシートに テキスト ボックス 1 を配置し、標準モジュールに以下を貼り付けて 適当にスクロールして実行してみてください。
Sub Sample() Dim br As Range
With ActiveWindow.VisibleRange Set br = .Cells(.Rows.Count, .Columns.Count) End With
With ActiveSheet.Shapes("テキスト ボックス 1") .Left = br.Left + br.Width - .Width .Top = br.Top + br.Height - .Height MsgBox .Left & vbLf & .Top End With
End Sub
(β) 2016/03/09(水) 16:54
まさにサンプルのような感じです!
Excelをスクロールしても、表示倍率を変えても常に右下に来るので、まさにイメージ通りです。
ただこれと(β) 2016/03/09(水) 14:35で頂いたコードをうまく合わせることが
できるのでしょうか?
少しやってみたのですが、うまくいきませんでした。
(ぱぐ) 2016/03/09(水) 18:48
以下で試してみてください。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim sp As Shape Dim br As Range
Shapes("テキスト ボックス 1").Visible = False Shapes("テキスト ボックス 2").Visible = False Shapes("テキスト ボックス 3").Visible = False
If Not Intersect(Target, Range("A1:C10")) Is Nothing Then Set sp = Shapes("テキスト ボックス 1") ElseIf Not Intersect(Target, Range("A11:C20")) Is Nothing Then Set sp = Shapes("テキスト ボックス 2") ElseIf Not Intersect(Target, Range("A21:C30")) Is Nothing Then Set sp = Shapes("テキスト ボックス 3") End If
If sp Is Nothing Then Exit Sub
With ActiveWindow.VisibleRange Set br = .Cells(.Rows.Count, .Columns.Count) End With
With sp .Left = br.Left + br.Width - .Width .Top = br.Top + br.Height - .Height .Visible = True End With
End Sub
(β) 2016/03/09(水) 19:27
本当にありがとうございました!
(ぱぐ) 2016/03/09(水) 20:02
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.