ここから本文です

ExcelVBAについて質問です。 初心者ですが、よろしくお願いします。 クイズの...

gre********さん

2018/8/406:50:31

ExcelVBAについて質問です。
初心者ですが、よろしくお願いします。

クイズの得点表示をしようとして、以下のプログラムを書きました。

自分がやりたかったのは、B2からP2の範囲のセルをダブルクリックした時に、
変数o(i)の値をTrueだった場合はFalse、Falseだった場合はTrueを代入して、
Cells(2, i + 1)の値をo(i)がTrueだった場合は"T"、Falseだった場合は"F"を代入するというものでした。

しかし実際の挙動はなぜか、
B2からP2の範囲のセルをダブルクリックすると、
最初はB2、次はC2、その次はD2に”T"が渡されてしまいます。(最初はすべて”F"にしてあります)

以下にプログラム文を記載したので、このような原因になる箇所があったら教えてください。
他に代替策があるようでしたら、それでも構いません。よろしくお願いします。



Public entry As Range

Public Sub Worksheet_beforedoubleclick(ByVal target As Range, cancel As Boolean)

cancel = True

Set entry = target

If entry.Address = "$B$4:$P$4" Then
Call Module2.judgement
Exit Sub
End If

Dim i As Integer
i = 1
For i = 1 To 15
If entry = Cells(2, i + 1) Then
If o(i) = True Then
o(i) = False
Cells(2, i + 1).Value = "F"
ElseIf o(i) = False Then
o(i) = True
Cells(2, i + 1).Value = "T"
End If
Exit Sub
End If
Next i
End Sub

F&quot,T&quot,Exit Sub,End If,ダブルクリック,enable events,P2&quot

閲覧数:
38
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tra********さん

2018/8/409:54:22

Call Module2.judgementがどういう関わりがあるのか解りませんが、質問にかかれた要件だけコード化すると↓が一例。


Dim o(2 To 16) As Boolean
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim rng As Range
Cancel = True
Set rng = Intersect(Target, Range("B2:P2"))
If rng Is Nothing Then Exit Sub
With Target
o(.Column) = Not o(.Column)
If o(.Column) Then
.Value = "T"
Else
.Value = "F"
End If
End With
End Sub

元のコードの不具合原因は、
If entry = Cells(2, i + 1) Then
じゃないですか?
2つのセル範囲は、TかFが入力されているのですよね?
右辺のTかFが入力されているセルはいくつもあるはず。
きっと
If entry.Address = Cells(2, i + 1).Address Then
なら上手くいくのかも。。。。
それより、↑の方が理解しやすいでしょう。

  • 質問者

    gre********さん

    2018/8/410:18:14

    ご回答ありがとうございます!
    そうですね! Range型オブジェクトについて勘違いしてました…
    If entry.Address = Cells(2, i + 1).address Then
    でうまく行きました!
    ありがとうございます!

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

yok********さん

2018/8/408:06:27

大事なのは動作のトレースです。
ブレークポイントは設定しましたか?
イベントではセルへの代入は更なるイベントを引き起こし、混乱します。
enable eventsを一時切ってみては?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

hel********さん

2018/8/407:19:42

>変数o(i)の値をTrueだった場合はFalse、Falseだった場合はTrueを代入し

o(i)は変数ですか?配列では?
もし配列としても、配列の定義はどうしていますか?

単純にB2からP2までのセルでダブルクリックしたらTはF、FはTと逆転したいだけでは・・。それ以外であれば、どうしたいかを書かないとコードの意味が不明です。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる