[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『二つのクリックイベントを一つのシートで行いたい』(Msd)
[エクセルのバージョン]Excel2003
[OSのバージョンの例]Windows 7
一つは選択したセルをオートシェイプで囲うコードでもう一つは画像挿入のコードなのですがこれを一つのシートに書くにはどのようにすればいいのでしょうか?
色々試してみて別々では正常に動くのですが二つ入れる事が出来ません
コードは↓
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
Dim sp As Integer, i As Integer, R As Range, B As Boolean
For Each R In Target
If Not Intersect(R, Range("L10:AE12,L26:AE28")) Is Nothing Then If R.Value = "・" Or R.Value = "" Then GoTo NEXTCODE Cancel = True B = False For i = 1 To Me.Ovals.Count If Shapes(i).TopLeftCell.Address = R.Address Then B = True: Exit For Next i If B Then Ovals(i).Delete Else Set R = R.MergeArea With Me.Shapes.AddShape(Type:=msoShapeOval, _ Left:=R.Left, Top:=R.Top, Width:=R.Width, Height:=R.Height) .Fill.Visible = msoFalse End With
End If End If NEXTCODE: Exit Sub Next R End Sub ↑これと、↓ Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean) Dim sp As Integer, i As Integer If Intersect(Target, Range("B1:K336")) Is Nothing Then Exit Sub With Target Cancel = True myF = Application.GetOpenFilename _ ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False) If myF = False Then MsgBox "画像を選択してください(終了)" Exit Sub End If For Each mySP In ActiveSheet.Shapes myAD1 = mySP.TopLeftCell.MergeArea.Address myAD2 = Target.Address If myAD1 = myAD2 Then mySP.Delete Next Set mySP = ActiveSheet.Pictures.Insert(myF) myHH = Target.Height / mySP.Height myWW = Target.Width / mySP.Width If myHH > myWW Then mySP.Height = mySP.Height * myWW mySP.Width = Target.Width Else mySP.Height = Target.Height mySP.Width = mySP.Width * myHH End If Set mySP = Nothing End With End Sub ↑です。 色々調べてみたのですが解りませんでした>< どうか御教授ねがいます。
一つのプロシージャにすることもできますが、こんな感じでできると思います。 Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean) BRC1 Target BRC2 Target End Sub
Private Sub BRC1(ByVal Target As Range) Dim sp As Integer, i As Integer, R As Range, B As Boolean
For Each R In Target
If Not Intersect(R, Range("L10:AE12,L26:AE28")) Is Nothing Then If R.Value = "・" Or R.Value = "" Then GoTo NEXTCODE Cancel = True B = False For i = 1 To Me.Ovals.Count If Shapes(i).TopLeftCell.Address = R.Address Then B = True: Exit For Next i If B Then Ovals(i).Delete Else Set R = R.MergeArea With Me.Shapes.AddShape(Type:=msoShapeOval, _ Left:=R.Left, Top:=R.Top, Width:=R.Width, Height:=R.Height) .Fill.Visible = msoFalse End With
End If End If NEXTCODE: Exit Sub Next R End Sub Private Sub BRC2(ByVal Target As Range) Dim sp As Integer, i As Integer If Intersect(Target, Range("B1:K336")) Is Nothing Then Exit Sub With Target Cancel = True myF = Application.GetOpenFilename _ ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False) If myF = False Then MsgBox "画像を選択してください(終了)" Exit Sub End If For Each mySP In ActiveSheet.Shapes myAD1 = mySP.TopLeftCell.MergeArea.Address myAD2 = Target.Address If myAD1 = myAD2 Then mySP.Delete Next Set mySP = ActiveSheet.Pictures.Insert(myF) myHH = Target.Height / mySP.Height myWW = Target.Width / mySP.Width If myHH > myWW Then mySP.Height = mySP.Height * myWW mySP.Width = Target.Width Else mySP.Height = Target.Height mySP.Width = mySP.Width * myHH End If Set mySP = Nothing End With End Sub (Mook)
Mookさん答えていただきありがとうございます。
掲示していただいたコードで出来たのですが幾つか問題が出てしまいました><;
以前のコードではCancel = Trueでメニュー(コンテキストメニュー?)が出ない様になっていたのですがなぜかメニューが出てしまいます^^;
Cancel = Trueもちゃんと書かれているのになぜなんでしょう?
それとこれは掲示していただいたコード以前からなのですが、はじめのオートシェイプで選択セルをまるく囲うコードは他のシートでも使っているのですがそっちではちゃんと思ったとおり(クリックでまるく囲って、まるく囲ってあるセルをクリックすると丸が消せる)に動いてくれるのですがこっちのシートではオートシェイプで選択セルをまるく囲う事は出来るのですがもう一度クリックすると丸が消せずにまたまるく囲ってしまいます。又、色々クリックしていると突然違うセルの丸が消えたりもします。
多分コード自体で違うところはRange位だと思うのですが。。。思った通りに動いてくれるシートは
Range("K13:AH48")で変な動きをしてしまうコードはRange("L10:AE12,L26:AE28")でその位しか違いはないと思うのですが。。。
原因不明でネットで調べようと思ったのですが調べようがありませんでした><
NEXTCODE:は関係ないかと思い書きませんが一応コードも載せさせていただきます
思ったとおりに動いてくれるシートのコード↓
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
Dim sp As Integer, i As Integer, R As Range, B As Boolean
For Each R In Target
If Not Intersect(R, Range("K13:AH48")) Is Nothing Then If R.Value = "・" Or R.Value = "" Then GoTo NEXTCODE Cancel = True B = False For i = 1 To Me.Ovals.Count If Shapes(i).TopLeftCell.Address = R.Address Then B = True: Exit For Next i If B Then Ovals(i).Delete Else Set R = R.MergeArea With Me.Shapes.AddShape(Type:=msoShapeOval, _ Left:=R.Left, Top:=R.Top, Width:=R.Width, Height:=R.Height) .Fill.Visible = msoFalse End With
End If End If NEXTCODE: ・ ・
変な動きをしてしまうシートのコード↓
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean) Dim sp As Integer, i As Integer, R As Range, B As Boolean
For Each R In Target
If Not Intersect(R, Range("L10:AE12,L26:AE28")) Is Nothing Then If R.Value = "・" Or R.Value = "" Then GoTo NEXTCODE Cancel = True B = False For i = 1 To Me.Ovals.Count If Shapes(i).TopLeftCell.Address = R.Address Then B = True: Exit For Next i If B Then Ovals(i).Delete Else Set R = R.MergeArea With Me.Shapes.AddShape(Type:=msoShapeOval, _ Left:=R.Left, Top:=R.Top, Width:=R.Width, Height:=R.Height) .Fill.Visible = msoFalse End With
End If End If NEXTCODE: ・ ・ ↑これです。 原因のわかる方御教授願います<m(__)m>
n
変な動き の方は良く分かりませんが・・・
Cancel=True は Worksheet_BeforeRightClick イベントプロシージャ内に書かないと意味がありません。
イベント内でTargetの範囲を判断してからCancelとサブプロシージャをCallするように してみてはどうでしょうか?
あとは、このような使い方には違和感がありますね。 別のRange型の変数を使うかWithステートメントで良いのでは?
For Each R In Target Set R = R.MergeArea Next R
(momo)
イベントプロシージャ内にTargetの範囲を書き込ませていただいてCancel=Trueは無事にきくようになりました。
ありがとうございます。
御指摘いただいた所は以前Targetの範囲内にある"・"だけのセルと空白""セルを除外するには(まるで囲わない)様にするのに
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
Dim sp As Integer, i As Integer
If Not Intersect(Target, Range("K13:AH48")) Is Nothing Then
If Target.Value = "・" Then
Exit Sub Else If Target.Value = "" Then Exit Sub Else With Target For i = 1 To Me.Ovals.Count If Me.Shapes(i).TopLeftCell.Address = .Cells(1, 1).Address Then: sp = i Next i Cancel = True If sp Then Ovals(sp).Delete Else Me.Shapes.AddShape(Type:=msoShapeOval, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse End If End With End If End If End If
If Target.Count <> 1 Then Exit Sub If Intersect(Target, Range("B14:C115")) Is Nothing Then Exit Sub Cancel = True If Target.Value = "□" Then Target.Value = "■" Else If Target.Value = "■" Then Target.Value = "□" Else Exit Sub End If End If End Sub とコードを書いた所型が一致しませんとエラーになってしまい行き詰ってしまった時にネットで質問させていただいたら、
セル範囲であるTargetに対して単一の値である"・"や、""等に対して問い合わせをしているのでエラーとなってしまうので、Taget範囲に対して単一セルでループ(For Each R In Targetで)を掛けてあげれば、エラーは回避できると教えていただきこの様な形になったのですがもっと他の回避方法の方が良かったでしょうか?
何分初心者なのでもっとコードが見やすく出来ればと思っているのですが。。。
(Msd)
シート内にテキストがあった事が原因だったみたいです。
Ovals限定でCountしているのに、Shapesをループしているので画像や図形があるとおかしな動きをしてしまっていたみたいです。
お騒がせしました。
また見ていただき考えてくれた方にも感謝いたします。
(Msd)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.