• ベストアンサー

数値の時ではなく、データがあるとき

エクセルマクロについて質問です。 以前に教えていただいたコードですが、おそらく指定したセルがひとつのとき反応するコードだと思います。 これを、なおかつ、数値データがあるときに実行するにはどのように変更すればよいでしょうか? 数値データか空白しかありません。 お手数かけますがよろしくおねがいします。 With Target If .Count = 1 Then

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

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

こういう程度の内容の質問は、Googelででも、 「エクセル VBA 数値データか」で照会すれば、説明例が出てくる。 http://excelnavi.livedoor.biz/archives/2958665.html http://officetanaka.net/excel/vba/function/IsNumeric.htm など。 今は(VBAが使われて20年経ち)WEBの記事が充実して、WEB照会で回答は得られる場合が多いことを覚えておいて。 ーーー それよりも >指定したセルがひとつのとき反応する >With Target の記述から、シートのイベントのChangeイベントやSelectionChangeイベントのことではないかと思うが、それを質問に書くべきです。 TargetはそのRangeのことなので(エベントが発生したとき、渡してくれる引数にTarget As Rangeとあるでしょう)、If .Count = 1 Then は1セルだけが選択されている場合に限って、処理対象にしているということ。 そのセル(Target)が数字の場合に、何か処理をしたいなら、 If .Count = 1 Then '>なおかつ,なので If IsNumeric(Target) Then  (処理のコード)かまたは「とび先のサブルーチン名」を書く Else "選択セルは数字ではありません" とかその場合の処理を書く End If End If こういうコーナーに質問して回答させるのも良いが、回答を理解できない程度だと意味がない。本やWEBで勉強して、理解できるよう備えておかないと回答が無駄です。 ーー 複数セルのChangeやSelectionChangeは少し複雑です。 イベントを察知する範囲を限定する(チェックする)のは、たとえば Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Application.Intersect(Target, Range("B1:B5")) Is Nothing Then Else MsgBox "B1:B5 の範囲のイベントです。" End If End Sub ーー 質問と関係ないですが参考に どういう現れ方をするか体験してみて。 Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "Change " & Target.Count End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "Selection " & Target.Count End Sub ーー 質問の表題が「数値の時ではなく、データがあるとき 」で、質問の中での文章で 、「数値データがあるときに実行するにはどのように」と書くのは、わかりにくいよね。

noname#241383
質問者

補足

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 1行目のコードがこのようになっていました。 >SelectionChangeイベントのことではないかと思うが そうであると予想したという意味ですよね? 表題もおかしく質問内容も不足でした。 大変お手数かけて申し訳ないです。

その他の回答 (4)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

>数値データが入っているか空白かのどちらかしかありません。 >だから、変更後、数値である場合というのは違います。  空欄は数値ではありませんから、数値が入っていたセルの値を消去した場合は、セルの変更後の値が数値データではない場合となります。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 回答No.2です。  済みません、先程の回答は間違っておりました。  正しくは以下の通りです。 With Target If .Count = 1 And IsNumeric(.Value) And .Value <> "" Then (やりたい処理) End If End With

noname#241383
質問者

お礼

1セルのみ選択、しかも数値データであった場合のみ反応してくれています。 空白や数値以外は反応しないようになりました。 分かりにくい質問でしたが、大変ありがとうございました。

noname#241383
質問者

補足

オートフィルタ状態で下記のボタンを押すと型が一致しませんとエラーがでます。 原因はわかりますでしょうか? Private Sub CommandButton6_Click() If Not ActiveSheet.AutoFilterMode Then Exit Sub Select Case ActiveSheet.Name Case "受注", "データ" Dim c As Range Set c = ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1) ActiveSheet.AutoFilterMode = False Application.Goto c, True UserForm1.Top = 170 UserForm1.Left = 85 End Select End Sub

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

>これを、なおかつ、数値データがあるときに実行するにはどのように変更すればよいでしょうか?  「なおかつ」という事は、「指定したセルが一つしかなく、"なおかつ"、そのセルの変更後の値が数値データである場合」という事ですね。  その際の、「反応する」とは、どの様な処理を行う事なのか良く解りませんが、以下の様な形式のVBAの構文にする事で実現できます。 With Target If .Count = 1 And IsNumeric(.Value) Then (やりたい処理) End If End With

noname#241383
質問者

補足

一応、補足しておきます。 すでに、数値データが入っているか空白かのどちらかしかありません。 だから、変更後、数値である場合というのは違います。 NO3で回答していただいた内容で試してみます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

参考に With Target   '対象セルが1つを超えるとExit   If .Count > 1 Then Exit Sub   '値が数値以外または空白の場合はExit   If Not IsNumeric(.Value) Or .Value = "" Then Exit Sub   MsgBox .Value End With

関連するQ&A