[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ダブルクリックで〇を表示する』(あろりん)
マクロや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
多分 Target.Value ↓ Target.Cells(1).Value (BJ) 2019/05/31(金) 11:33
↓ Target.Cells(1).Value に変えたらよいということでしょうか。
すみせん、わからなくて・・・
(あろりん) 2019/05/31(金) 11:39
結合セル、ということかな? (カリーニン) 2019/05/31(金) 11:39
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
さらに混乱に拍車?
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
同様に文字列にも順序を考えます。
辞書に出てくる順序をもとにして比較が可能です。
"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
お遊びで・・・。
セルを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.