Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
オートシェイプを配置したセル上でのダブルクリック
投稿日時: 17/06/11 12:23:42
投稿者: S.Kos

こんにちは、みなさま。
 
Worksheet_BeforeDoubleClick()に以下のコードを書きました
  With ActiveSheet
    buffClm = Target.Column + 33
    namStr = .Cells(Target.Row, buffClm).Value
    If namStr <> "" Then
      .Shapes(namStr).Delete
      .Cells(Target.Row, buffClm).Value = Null
    else
      namStr = CStr(Target.Row) & "and" & CStr(Target.Column)
      yPos = .Cells(Target.Row, Target.Column).Top + 2
      Set Shp = .Shapes.AddShape( _
                  Type:=msoShapeOval, _
                  Left:=xPos(Target.Column), _
                  Top:=yPos, _
                  Width:=Rad, _
                  Height:=Rad _
                  )
      With Shp
        .Fill.Visible = msoFalse
        .Line.ForeColor.RGB = 0
        .Line.Weight = 0.75
        .Name = namStr
      End With
      .Cells(Target.Row, buffClm).Value = namStr
    end if
  end with
   
ご一読いただければお判りと存じますが、セル上での左ダブルクリックを拾って、
 1バッファが空なら、
  そのセルの縦横の座標を名前とする半径Radの円を描き、
  名前をバッファに格納する
 2バッファが空でないなら、
  その名前を持つ円を削除し
  バッファを空とする
とします。
 
最初の「円を描く」については(全ての環境で)想定どうりに動きました。
 
けれども後半の「バッファが空てない」とき、想定どうりに動かない環境があります。
ただしこれも常にダメなわけでは無く、そのタイミングを掴みかねています。
 
もしかして、オートシェイプを配置したセル上での左ダブルクリックを拾うには、なにかしらの配慮が必要か、とも思っています。
どなたかこの現象に心当たりはございませんか?
 

回答
投稿日時: 17/06/11 13:52:40
投稿者: WinArrow
投稿者のウェブサイトに移動

コード一ヶ所変更したほうがよい
 
> .Cells(Target.Row, buffClm).Value = Null

      .Cells(Target.Row, buffClm).ClearContents
 
または
      .Cells(Target.Row, buffClm).Value = ""
 
もう一つの問題は
図形の下にあるセルはダブルクリックできない
 
コマンドボタン等を用意したほうがよいのでは?
 

回答
投稿日時: 17/06/11 13:57:00
投稿者: WinArrow
投稿者のウェブサイトに移動

もう一つの提案
 
この処理を標準モジュールに移し
 
ダブルクリックイベントからCALLする
 
標準モジュールに移動したマクロにキー操作でも動作するようにキーを割り当てる
 
要するに、キー操作でも、ダブルクリックでも動作するようにすつということです。
 

回答
投稿日時: 17/06/12 08:45:02
投稿者: mattuwan44

>ご一読いただければお判りと存じますが、
コードをさらっと読んでも、簡単には何をしたいかわかりませんが、、、
(急にバッファという文言がでてきたり、、、^^;)
セルをバッファとして利用したいということなんですね^^
 
セルに空白を入れるなら、
「Null」じゃなくて「Empty」かなと思います。

> If namStr <> "" Then
> .Shapes(namStr).Delete
> .Cells(Target.Row, buffClm).Value = Null

    set target=target.offset(,33)
    If isempty(target.value) Then
   on error resume next
      .Shapes(target.value).Delete
      on error goto 0
      target.Value = empty
 
みたいな感じにしたらいいかなぁと思いますが、
実際には、こういうアプローチでいいかは全体を眺めて、
しかもデバッグしてみないとなんとも。。。
 
あと、
図形を書いたらその下のセルはダブルクリックできないので、
(シートの保護を図形だけにできましたっけ?)そうしたときの
エクセルの動作が定かで無いですが、
ダブルクリックにこだわらないのであれば、
図形にマクロを登録できるので、図形をシングルクリックで、
クリックした図形を削除することは可能かと思います。
そうすれば、バッファ(?)という代物は不要になるかなとは思います。
(直に選択できますので。。。)
 
乱文でわかりにくいとは思いますが、自分で調べるようになれると、
さらに勉強が捗りますので、質問と並行して、いろいろ検索や
試行錯誤をされてみるのも一案です。
 

回答
投稿日時: 17/06/12 13:42:10
投稿者: WinArrow
投稿者のウェブサイトに移動

本題とは、外れますが、セルを空白にするいくつかの方法
 
↓:セルB1には、=ISBLANK(A1) という数式が入っています、
    Debug.Print "(1)" & [B1]
    Range("A1").Value = "AA"
    Debug.Print "(2)" & [B1]
    Range("A1").Value = ""
    Debug.Print "(3)" & [B1]
    Range("A1").Value = Empty
    Debug.Print "(4)" & [B1]
    Range("A1").Value = Null
    Debug.Print "(5)" & [B1]
    Range("A1").ClearContents
    Debug.Print "(6)" & [B1]
 
(2)以外は、True
になります。
だから、NULLを代入しても、問題はなさそう

回答
投稿日時: 17/06/13 11:48:14
投稿者: mattuwan44

時間が出来たので作ってみました。
図形の名前にセルアドレスを紐づけておけば大丈夫そう?
(あれ?もしかして図形にセルの名前付けるの危険でしたっけ。。。。^^;)
削除の命令を出してみて、
エラーなら図形がないから追加の処理をする。
という考え方です。
 
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        If .CountLarge > 1 Then Exit Sub
        Cancel = True
 
        On Error GoTo ErrH
        Me.Shapes(.Address(False, False)).Delete
        Exit Sub
 
ErrH:
        Me.Shapes.AddShape(msoShapeOval, .Left + 2, .Top + 2, .Height - 4, .Height - 4) _
                .Name = .Address(False, False)
    End With
End Sub
 
セルを使ってOnOffするなら、こんな感じかなぁ。。。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim Rng As Range
    Dim s As String
 
    If Target.CountLarge > 1 Then Exit Sub
    Cancel = True
 
    Set Rng = Target.Offset(, 33)
    If IsEmpty(Rng.Value) Then
        With Target
            s = Me.Shapes.AddShape(msoShapeOval, .Left + 2, .Top + 2, .Height - 4, .Height - 4).Name
        End With
        Rng.Value = s
    Else
        Me.Shapes(Rng.Value).Delete
        Rng.Value = Empty
    End If
End Sub

投稿日時: 17/06/17 12:30:53
投稿者: S.Kos

こんにちは、みなさま。亀レスのほどご容赦ください。
 
WinArrowさん、mattuwan44さん、お二人が「図形の下にあるセルはダブルクリックできない」旨を記されています。
が、図形を「ぬりつぶさない」即ち .Fill.Visible = msoFalse としておけば、その下のセルを選択できます。
このときマウスカーソルの形がミソ、通常の「矢印」だとダメで、太めの「白い十字」に変わるまで待たねばなりません。
 
バックグラウンドなどPCの様々な環境に左右され、カーソル形状が変化するタイミングが異なるようで、これに気づきませんでした。
 
mattuwan44さんの例示、エラートラップで・・・、たいへん参考になりました。
この手のアプローチは思いつきませんでした。
 
みなさま、ご教示ありがとうございました。