エクセル2007のVBAについて

このQ&Aのポイント
  • エクセル2007のVBAについて初心者向けの質問です。
  • エクセルで入力したいシートタブを右クリックしてコードの表示でVBAスクリプトを入力しました。
  • U列に値が入っていれば、その行のT列をダブルクリックするとチェックマークがつくようにしたいのですが、うまくいきません。
回答を見る
  • ベストアンサー

エクセル2007のVBAについて

VBA初心者ですが、よろしくお願いします。 エクセルで入力したいシートタブを右クリック、コードの表示で、 VBAに以下のスクリプトを入力しました。 ネットに紹介されていたスクリプトに自分で一部書き足したものです。 U列に値が入っていれば、その行のT列をダブルクリックするとチェックマークがつくようにし、 それをU列の最終行までループしたいのですが、エラーなどはなくチェックマークが出現しません。 どこが間違っているのでしょうか?ご教授お願いします。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MaxRow = Range("U65536").End(xlUp).Row For i = 1 To MaxRow Step 1 If Range("U" & i) <> Null Then If Intersect(Target, Range("T" & i)) Is Nothing = False Then Cancel = True If Target.Value = ChrW(10003) Then Target.ClearContents Else Target.Value = ChrW(10003) End If End If End If Next i End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

間違い: If Range("U" & i) <> Null Then 正解: If Range("U" & i) <> "" Then Nullとの演算結果はTrueにもFalseにもならないからです。

daicedec
質問者

お礼

お早いご回答ありがとうございます。説明も簡潔で分かりやすかったです。

その他の回答 (3)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

まぁ,今のマクロでも先に回答した箇所以外特段間違いは無いので構わないと思いますし,あくまで余計なお世話ですが,もしご質問が間違いの直し以上にマクロ全体をもうちょっとどうにかしたいという事だったのなら,ワタシならこんなカンジにします private sub worksheet_beforedoubleclick(byval Target as excel.range, cancel as boolean)  if application.intersect(target, range("T:T")) is nothing then exit sub  cancel = true  if range("U" & target.row) ="" then exit sub  if target <> chrw(10003) then   target = chrW(10003)  else   target.clearcontents  end if end sub

daicedec
質問者

お礼

ご回答ありがとうございます、参考にいたします。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

>それをU列の最終行までループしたいのですが、 なぜこうする必要があるのか。 ダブルクリックをイベントとして扱うということは、普通はそのダブルクリックしたセルの情況で、何かをする場合は多く、全セルや全行などに繰返すというのは意味が判らない無い。 (1)標準モジュールの実行をダブルクリックで行うだけの仕組み (2)ダブルクリックしたセル(Targetセル)を基にして、その行やその列のデータや結果を出すセルに指定するなど がありえる。(1)はわざわざダブルクリックのイベントを使う必要は無い。 ーー そもそも コードを挙げて、誤りを正せと言う前に、文章で、どういうときに、何がしたいのか明確に説明すること。 その際シート形式のデータ情況ぐらい模擬実例で挙げること。 ーー Targetセルにチェックを入れるかどうかは、同行のU列に、データが入っているかどうかだけでしょう。 どうして最上のデータ行から最終行まで処理を繰返すのか。 普通は、最上のデータ行から最終行まで処理を繰返すのは標準モジュールに質問類似のコードを入れて、実行を指示し、条件に合うかどうか各行でチェックして、条件に合えばチェックを入れるを行うのが多い。 イベントと標準モジュールの区別が付いてないのでは。 ーー わたしが普通の処理に毒されていて、この質問の意図を見抜けないのかとも思うが。 初心者ではアイデアそのものが奇想天外の場合がある(その仕組みを使う場合でない場合がある)ので。 ーー そのほか Step 1は普通略す Range("A" & i) <> "" Then Intersect(Target, Range("B" & i)) Is Nothing Then 参考 http://officetanaka.net/excel/vba/tips/tips118.htm など気になる。 エクセルVBAの初心者ではNullは使わないだろう。但しアクセスでは重要。 参考 http://officetanaka.net/excel/vba/function/IsNull.htm http://home.att.ne.jp/zeta/gen/excel/c04p16.htm ーーーー ダブルクリックしたセルにチェックが入って、そのセルの元のデータは見えなくなるが良いのか 現在チェックが入っておれば、チェックをはずしているがこれで良いのか。

daicedec
質問者

お礼

ご回答ありがとうございます、参考にします。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

既に回答済みですので参考です。 U列のループ処理は不要ではないでしょうか。 T列の任意のセルをダブルクリックでT列全体にマーキングする事が前提ならば、 このコードでは期待通りに動作しませんのでご検討下さい。 しかし、ダブルクリックセルのみマーキングならば、以下のサンプルは如何でしょうか。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("T:T")) Is Nothing Then Exit Sub Cancel = True If Target.Offset(0, 1).Value <> "" Then If Target.Value = ChrW(10003) Then Target.ClearContents Else Target.Value = ChrW(10003) End If End If End Sub

daicedec
質問者

お礼

ご回答ありがとうございます、参考にします。

関連するQ&A

  • エクセル VBA について

    エクセルで、 ダブルクリックしたら"*"を表示したい範囲に【入力】という名前をつけ、 ダブルクリックしたら9つ左のセルの内容を表示したい範囲に【金額】という名前をつけ、 二つの構文?をVisual Basicに作成したんですが、エラーが出てしまいます。 ひとつずつだと上手くいくのですが、なぜでしょうか? わかる方教えてください。 あと申し訳ないのですが、VBAはまったくわからないため、ネット上で構文をコピーして貼り付けました。 そんな者でもわかる修正の説明をお願いいたします。 以下が作成し、エラーとなってしまう構文です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "金額" If Target.Value = "" Then Target.Value = Target.Offset(0, -9).Value Cancel = True End If End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "入力" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "*" Then Target = "" Else Target = "*" End If End If End Sub

  • エクセルVBAのイベントで質問です。

    ダブルクリックイベントで、G12:G31の範囲の文字列をB10:B27の範囲(最下行)に入れていくものを使っていますが、新たにH12:H31にある文字列もダブルクリックするとC10:C27の範囲(最下行)に入れていけるようにしたいと思います。 どのようにすればいいでしょうか。 ご存知の方いらっしゃればお教えいただけると助かります。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, _ Cancel As Boolean) Dim i As Long Dim flg As Boolean If Intersect(Target, Range("G12:G31")) Is Nothing Then Exit Sub If IsEmpty(Target.Value) Then Exit Sub With Worksheets("シートA") For i = 10 To 27 If .Range("B" & i).Value = "" Then .Range("B" & i).Value = Target.Value flg = True Exit For End If Next i If flg = False Then MsgBox .Name & " がいっぱいです。" End If End With Cancel = True End Sub

  • VBA 範囲選択時エラー

    Private Sub Worksheet_SelectionChangeのVBAでA列B列C列でワンクリックで文字が入力できるように設定致しました。 その後、A列からC列を範囲選択してDeleteするとデバック 「実行時エラー  型が一致しません」と出てしまいます。業務上、そのセルのデータは一気に消したいので困っております。どなたか分かる方よろしくお願い致します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range, rng_1 As Range, rng_2 As Range Application.EnableEvents = False Set rng_1 = Range("H17:H100") Set rng_2 = Range("I17:I100") Set rng_3 = Range("J17:J100") Set rng_4 = Range("K17:K100") Application.EnableEvents = True Set rng = Intersect(Target, rng_1) If Not rng Is Nothing Then Cancel = True If Target.Value = "" Then Target.Value = "(1)" Else Target.Value = "(1)" End If Else Set rng = Intersect(Target, rng_2) If Not rng Is Nothing Then Cancel = True If Target.Value = "(2)" Then Target.Value = Empty Else Target.Value = "(2)" End If Else Set rng = Intersect(Target, rng_3) If Not rng Is Nothing Then Cancel = True If Target.Value = "(3)" Then Target.Value = Empty Else Target.Value = "(3)" End If Else Set rng = Intersect(Target, rng_4) If Not rng Is Nothing Then Cancel = True If Target.Value = "(4)" Then Target.Value = Empty Else Target.Value = "(4)" End If End If End If End If End If End Sub

  • エクセルVBAについて

    http://okwave.jp/qa/q7236213.html 上記質問の発展形なのですが 同様のことを E列に日付 F列に売上 G列に結果 でやりたいのですが この時A列~C列のマクロも残したままでしたいのですが 下記のように同様のプロシージャーを下段に書けばできると思ったのですが うまくいきません。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$A$1" Then Exit Sub If Target = "" Then Exit Sub Range("C10:C65536").ClearContents With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With End Sub Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$E$1" Then Exit Sub If Target = "" Then Exit Sub Range("G10:G65536").ClearContents With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G")) .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)" .Value = .Value End With End Sub どなたかお知恵を拝借できませんでしょうか?

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • Excel VBAについて

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("F:F")) Is Nothing Then Exit Sub Application.Goto Worksheets("人件費").Range("A1") Worksheets("人件費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("G:G")) Is Nothing Then Exit Sub Application.Goto Worksheets("外注費").Range("A1") Worksheets("外注費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub 上の指令はFの列をダブルクリックすると人件費のシートが開いてAある値を人件費の新しいセルのAに代入する指令ですが それをG列ダブルクリックで外注費シートに同じようにやろうと思いましたが出来ません。 たぶん根本的に書き方が間違っているのかと思われますが、ご指導のほどお願いします。

  • EXCEL 異なるVBA

    教えて下さい、EXECL以下の異なるVBA (A>,B>)が2つあります、同じシートでそれぞれ動くようにさせたいです1つに合わせる事は出来ないでしょうか? 当方初心者の為わかりません教えて下さい。 A> Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Address(0, 0, xlA1, 0) <> "A1" Then Exit Sub With Range("F9:I9,K17:K36").Borders(xlDiagonalUp) If Left$(Target.Value, 1) = "S" Then .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic Else .LineStyle = xlNone End If End With End Sub B> Private Sub Worksheet_Change(ByVal Target As Range) With Sheet2 Select Case Target.Address Case Is = "$D$1" .Range("A1").Insert Shift:=xlDown .Range("A1").Value = Target.Value Case Is = "$D$2" .Range("B1").Insert Shift:=xlDown .Range("B1").Value = Target.Value End Select End With End Sub

  • エクセルのVBAで、音をならす方法

    こんばんは。私はエクセル2000を使用しています。 現在やろうとしていることは、 実験の測定データをエクセルに取り込み(測定データは文字列としてエクセルに取り込まれます)、D列の数字が100以上になったら音をならして知らせるようにしたいと考えております。 それで、以下のマクロを組んでやってみました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 4 Then If IsNumeric(Target) And Target.Value > 100 Then Beep    MsgBox "範囲外です" End If End If End Sub しかし、If IsNumeric(Target) And Target.Value > 100 Thenのところで、型が一致しませんとエラー?がでてしまいます。 まだ、VBAを勉強しはじめて2週間くらいなので、なにぶんわからないことだからで、もしわかる方がいらしたら教えてください。

  • エクセル ダブルクリックで処理日の入力

    お世話になります。 先般、お教え頂きました別のダブルクリックイベントプロシージャと 下記の当日の日付を入力するという処理を同じシート上で行いたいのですが、VBエディターにどのように記述したら良いかわかりません。 当方、かなりの初心者です。 よろしくご教授くださいませ。 【新しく加えたい処理】 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("b4:C999")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Date Cancel = True End If End Sub 【もともと使っている処理】 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("h1:h999")) Is Nothing Then With Target If .Value = "" Then .Value = "有" ElseIf .Value = "有" Then .Value = "無" ElseIf .Value = "無" Then .Value = "" End If End With ElseIf Not Intersect(Target, Range("i1:i999")) Is Nothing Then With Target If .Value = "" Then .Value = "要" ElseIf .Value = "要" Then .Value = "不要" ElseIf .Value = "不要" Then .Value = "" End If End With End If End Sub よろしくお願いします。

  • エクセル VBAについて。

    Private Sub ComboBox2_Change() On Error Resume Next With Me.ComboBox2 If .ListCount < 0 Then Exit Sub If .Value = "" Then Exit Sub Me.Range("K45").Value = _ Worksheets("マスタ").Range(.List(.ListIndex, 1)).Offset(0, 2).Value Me.Range("K48").Value = _ Worksheets("マスタ").Range(.List(.ListIndex, 1)).Offset(0, 4).Value End With End Sub これをマスタのU列とW列を表示したい場合、どこを変えれば良いのでしょうか? 今はD列とF列が表示されております。

専門家に質問してみよう