[[20190531103858]] 『ダブルクリックで〇を表示する』(あろりん) ページの最後に飛ぶ

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

 

『ダブルクリックで〇を表示する』(あろりん)

マクロやVBAは勉強したいのですが、なかなか理解できずにいます。

ダブルクリックで〇を表示 したいのですが

シートのタブを右クリック、「コードの表示」をクリック

 次のコードをコピー・貼り付けをします。 
 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Value <> "" Then
        Target.Value = ""
    Else
        Target.Value = "○"
    End If
 End Sub

としても、実行時エラーとなります。
If Target.Value <> "" Then

        Target.Value = ""  に何か問題があるようなきがします。
どなたか、おわかりになりますか・・・?

< 使用 Excel:unknown、使用 OS:Windows10 >


動作確認してみましたが、特にエラーはでませんでした。
実行時エラーの他に、なにかメッセージが出ていると思いますが、
それも提示してもらえますか?

(γ) 2019/05/31(金) 10:50


お返事ありがとうございます。

実行時エラー13 型が一致しません
  ↓
デバッグを押す
  ↓

    If Target.Value <> "" Then が黄色に表示される

となります('_')

(あろりん) 2019/05/31(金) 10:59


 エラーになったセルの値は?

 そのセルの値がエラー値ではありませんか?
 その場合は、どうしたいのかに依り、対応方法が変わります。
 エラー値であっても同じ動作をさせたいなら、
 例えば、
    If IsError(Target.Value) Then
        Target.Value = ""
    ElseIf Target.Value <> "" Then
        Target.Value = ""
    Else
        Target.Value = "○"
    End If

 Target.CleaContentsのほうがよいかもしれない。
 また、編集モードに入らないように、Cancel = True を入れておくとよいかも。

(γ) 2019/05/31(金) 11:13


すみません、

エラーになったセルの値は?

 そのセルの値がエラー値ではありませんか?

ということは、If Target.Value <> "" Then   の、<>の中にセルの値を入れるということですか?
今回、そうしたいセルの範囲は、C6からAG76の範囲なのですが、

If Target.Value <C6:AG76> "" Then  としたらよいのでしょうか・・・
何度もすみません。

(あろりん) 2019/05/31(金) 11:22


 A= B  AとBは等しい
 A <> B AとBは等しくない 
(カリーニン) 2019/05/31(金) 11:25

処理対象を限定する話に移るまえに、
エラーとなったときのセルの値を回答ください。

(γ) 2019/05/31(金) 11:27


 流れに乗ってないレスですみません。

 参考HPです
https://excel-master.net/macro-vba/comparison-operator-logical-operator/
(カリーニン) 2019/05/31(金) 11:28

エラーになった時のセルの値とは、どういう意味でしょうか?
(あろりん) 2019/05/31(金) 11:30

 多分
 Target.Value
 ↓
 Target.Cells(1).Value
(BJ) 2019/05/31(金) 11:33

Target.Value  を
 ↓
 Target.Cells(1).Value に変えたらよいということでしょうか。

すみせん、わからなくて・・・
(あろりん) 2019/05/31(金) 11:39


 結合セル、ということかな?
(カリーニン) 2019/05/31(金) 11:39

ダブルクリックしたセルの値ということです。
それがTarget.Valueですよね。
「それと""が比較できなくてわたしゃ困るんだが」とExcel君が言っているわけです。
それでダブルクリックしたセルはどういうものですか、と確認したのです。

BJさんのご指摘のとおり、結合したセルなんでしょう。
Targetは複数セルとなり、Target.Valueは配列になるので、
比較ができないとエラーになると言うことですね。
BJさんの修正に従ってください。

# なかなか発言の順番が回ってこない。

(γ) 2019/05/31(金) 11:41


 私なら降格じゃなく、こう書く。

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     If Intersect(Target, Range("C6:AG76")) Is Nothing Then Exit Sub
     Cancel = True
     If IsEmpty(Target(1).Value) Then
         Target(1).Value = "○"
     Else
         Target.ClearContents
     End If
 End Sub

(γ) 2019/05/31(金) 11:48


はっ!そうです。結合したセルでした。皆さん、素晴らしいですね。。。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If Target.Cells(1).Value <C6:AG76> "" Then
        Target.Cells(1).Value = ""
    Else
        Target.Cells(1).Value = "○"
    End If
 End Sub

ということでしょうか。。。合ってますか・・・

そして、Yさんが教えていただいたものを試してみたところ、できました!!
今後も勉強していきたいと思います。本当にありがとうございました!
(あろりん) 2019/05/31(金) 13:01


<C6:AG76>

 比較演算子<>の中には何も入れてはいけません。
(カリーニン) 2019/05/31(金) 13:16

今は理屈じゃなく、動く例文に多く触れることが上達の道かもしれない。
しかし、学びて思わざれば則ち罔し(くらし)とも言うから、
くどいかもしれないが、一応補足説明しておきます。

比較演算子<>はそれだけで「等しくない」の意味です。
Target.Cells(1).Value <C6:AG76> "" は、まったく意味がありません。
適当につなげても動きませんよ。

文字列""と等しくないというのは、
そのセルに文字列(ないし数値のように、文字列に変換できる)何かが
入っているときにTrueを返す、と考えてもよいと思います。
その意味では、IsEmptyがFalseの場合とほぼ同じです。

今回はたまたま違いましたが、
セルの値がエラー値の場合は、少し振るまいが違います。
If Target.Value <> ""は、型が一致しないという同じ実行時エラーになりますが、
If IsEmpty(Target.Value) は、エラーにならずFalseを返します。
これが私がIsEmptyを使った理由です。

■なお、既に指摘がありましたが、
結合セルの場合、Target.Valueは配列になっています。
配列と""を直接比較することはできません。

結合セルの場合、その中身は、最初のセル(もっとも左、もっとも上のセル)にだけ
入っています。
それで、Target.Cells(1) もしくは、Target(1)で、
その単独セルの値を取り出して、比較しています。

一応筋道を説明しました。

(γ) 2019/05/31(金) 14:42


本当にご丁寧にありがとうございます。
本当に私の知識不足で、正直言われていることの意味が理解できません。
まず、言葉の意味を理解するところから始めないといけないな・・・と思っているところです。

比較演算子<>はそれだけで「等しくない」の意味です。
Target.Cells(1).Value <C6:AG76> "" は、まったく意味がありません。
適当につなげても動きませんよ。

そうなんですね・・・。それでは、

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Value <> "" Then
        Target.Value = ""
    Else
        Target.Value = "○"
    End If
 End Sub

これがなぜエラーにならないのでしょうか。<>が入っているのに・・・?
〈〉の中には、セルの範囲を入れるのかと思っていたのですが、違うのですよね・・・

(あろりん) 2019/05/31(金) 15:44


 A = B  :AとBは等しい
 A < B  :AはB未満、BはAより大きい
 A > B  :AはBより大きい、BはA未満
 A <= B :AはB以下、BはA以上
 A >= B :AはB以上、BはA以下
 A <> B :AとBは異なる
 というように=、<、>、<=、>=、<>は両辺を比較するためのもの。
(ねむねむ) 2019/05/31(金) 15:51

 なので
 >If Target.Value <> "" Then
 は
 もし、Targetの値が""と異なっていれば
 という意味になる。

(ねむねむ) 2019/05/31(金) 15:53


わかりました。
本当にご丁寧にありがとうございます。
もっと、勉強したくなりました!
子供みたいな質問ばっかりなのに、みなさん丁寧に答えてくださって感激しました。
ありがとうございました。
(あろりん) 2019/05/31(金) 16:03

 さらに混乱に拍車?

 VBAのEmptyやNothingやNull等の違いを整理
https://vbabeginner.net/vba%E3%81%AEempty%E3%82%84nothing%E3%82%84null%E3%81%AA%E3%81%A9%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E6%95%B4%E7%90%86/

 ※気長に勉強してください。
(カリーニン) 2019/05/31(金) 16:22

 今さらかもしれないけど、

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
   MsgBox Target.Address(0,0)
 End Sub

 これで、結合セルをWクリックすれば、セルのアドレスがわかります。
 A1〜C1だったら、A1:C1
 つまり、Range("A1:C1")と同じ意味になるので、
 Range("A1:C1").Cells(1) とすると、
 A1:C1の範囲内の左上から右に数えて1番目のセルの値。

 Range("A1:C3").Cells(8) だと、左上から右に数えて8番目のセル。
 A1 B1 C1 A2 B2 C2 A3 B3 C3

 Range("A1:C3").Cells(8).Select とすれば、解ると思います。

 Range("A1:C3")(8).Select
 Range("A1:C3").Item(8).Select

 としても良いわけですが、解りやすいために私はCellsをつけて書いてます。
 Item利用に関しては、普段使わないのでよく解ってない。
 セル範囲.Value に関しては略。
(BJ) 2019/05/31(金) 16:39

3 < 5 は 3 と 5 を比較する比較演算子です。
つまり 3 と 5 に対して <を作用させて
3より5が大きいので真(True)を返します。

同様に文字列にも順序を考えます。
辞書に出てくる順序をもとにして比較が可能です。
"a" < "b" は真です。bのほうが後に出てくるから。
これが文字列の比較演算子です。
<,>,=,<>などが考えられます。
"abc" = "" は偽(False)
"abc" <> "" は真(True) です。

#説明になっているのか我ながら不明。
#スマフォで打ち込んだら死にそうだった。
#しかも時期はずれだった。とほほ。

(γ) 2019/05/31(金) 16:52


 カリーニンさん紹介のリンク先に一言付け加え。

 「Object型を使ったコードでは関数の最後に当たり前のように Set obj = Nothing の一文が入っているのですが、ほとんどの場合においてこれは意味がありません。」

 と書いてありますが、

 幽霊プロジェクトの怪
http://hp.vector.co.jp/authors/VA016119/kitan01.html#11

(BJ) 2019/05/31(金) 17:05


ありがとうございます(^^♪ 
皆さんすごい!!
勉強します!
(あろりん) 2019/05/31(金) 17:08

 お遊びで・・・。

 セルをWクリックでTrue/Falseを切り替えます。

 残念ながら、ユーザー定義書式などでTrue/False
 を◯/×や◯/ブランクのように表示することはできないようです。

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Cancel = True
  With Target
   If .Cells.Count <> 1 Then Exit Sub
   If .Value = "" Then
      .Value = True
   Else
    .Value = Not .Value
   End If
  End With
 End Sub
(カリーニン) 2019/05/31(金) 20:31

コメント返信:

[ 一覧(最新更新順) ]


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