• ベストアンサー

VBA 型を比較してくれる命令?関数?

Dim 変数 as Date 変数 = ActiveCell などとしていた場合に、該当のセルの中にDate型の値が入っていれば問題ないですが、文字列などが入っていた場合は「型が一致しません」と出て止まってしまいますよね。 On Err GoTo Err 変数 = ActiveCell On Err GoTo 0 Exit sub Err: エラー処理 などとして逃がしていたんですが、Goto文の扱いが面倒でこれを何とかでいないかと頭を悩ませています。 if文とかで使えるような、セルの値の型を比較してくれるようなメソッドなり関数なりないのでしょうか? ネット上をいろいろ探してみたのですが、簡単に済ませられるような方法が見つかりませんでした。 If (参照セルの中の型を確認して希望の物と違う) Then   処理 Else   処理 Endif と簡単にできる方法があれば、ぜひ教えてください。 よろしくお願いいたします。 Excelのバージョンは2003となります。

noname#109711
noname#109711

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

  • ベストアンサー
回答No.1

出来なくはないんだけどなあ …エラー出させとけ、と思う人間としては少し抵抗感が。 http://msdn.microsoft.com/en-us/library/3kfz157h%28VS.85%29.aspx Sheet1のA1に2010/01/02を入力して、アクティブにした状態で以下のコードを実行したら7が返された。 Option Explicit Sub Main() MsgBox (VarType(ActiveCell.Value)) End Sub

noname#109711
質問者

お礼

そう、まさしくこんなのを探していました! ありがとうございました!

noname#109711
質問者

補足

ちなみに気になったのですが、「エラーを出させとけ」というのはどんな理由からなんでしょうか? 一応、僕が考えていた使い方は、日付しか入っていないであろうある特定の行を上から順番に参照していくというもので、たまにメモ書きで日付以外の物が書かれていたりするので、それを削除することもできない関係上、困っていました。 こういった場合でも、エラーを出しておいた方が便利という使い方があるのでしょうか?

その他の回答 (3)

回答No.4

>エラーを出しておいた方が便利 込み上げてくるものは ●「サーバ側プログラム」として「HTTPユーザーエージェント」という一種類のものに対して奉仕する気はある。 ●各ブラウザも「一般的なユーザーエージェント」として動く分にはサービスを利用することに当然反対しない。(し、差別もしない) ●「サーバ側プログラム」の側が「IE」だとか「Firefox」だとか特定のユーザーエージェントに対して対応するコストを何で払わねばならんのだ。こっちのプログラムの設計も悪くなるし。 ●エンドユーザーは送っているデータや、ユーザーエージェントの特徴を知り、なおかつ、それらが悪い場合は、こちらに問題を寄せるべきではなく、ユーザーが自分のコストで、問題を修正したり、「使わない」という選択をすべきだ。 ●こちらが対応してしまうとエンドユーザがその問題点を認識するタイミングも失う。 ●日付以外のデータを入力するエンドユーザが悪い。→対応しない と(Excel関係なく)色々あるけど、自分の乏しい表現力で表現出来るとは思わないし、表現を直して行く気もない。

noname#109711
質問者

お礼

職業プログラマでないのでよく理解できませんが、プログラマとしてのこだわりのようなものなんでしょうね。 ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

IF IsDate(変数) Then どこまでチェックしたいのか解りませんが・・・。 If DateDiff("d", 変数, Date) >= 0 Then として、日付のチェックもできます。 http://officetanaka.net/excel/vba/function/IsDate.htm

noname#109711
質問者

お礼

型ではなく、日付に直せるかどうかで見られる物もあるんですね。 意外とあるもんなんですね~。僕は探し方が下手なようです(^_^; ご回答ありがとうございました。

  • ziziwa1130
  • ベストアンサー率21% (329/1547)
回答No.2

VarType(varname)の値が 0:Empty 値(未初期化) 1:Null 値(無効な値) 2:整数型(Integer) 3:長整数型(Long) 4:単精度浮動小数点数型(Single) 5:倍精度浮動小数点数型(Double) 6:通貨型(Currency) 7:日付型(Date) 8:文字列型(String) 9:オブジェクト 10:エラー値 11:ブール型(Boolean) 12:バリアント型(Variant)(バリアント型配列にのみ使用) 13:非OLEオートメーションオブジェクト 14:1O進数型 17:バイト型(Byte) 36:ユーザー定義型を含むバリアント型 です。ご質問の場合には If VarType(ActiveCell) <> 7 then 処理 Else 処理 End If になります。

noname#109711
質問者

お礼

詳しい解説をありがとうございます。大変助かりました。

関連するQ&A

  • またまたVBAのデータの型変数で質問

    あるセルに「=IF(N50 =O50,"","×")」の関数が入ってます。比較して合っているならNULL、相違なら×(バツ)をいれるというものです。 質問はこのセルの値をマクロである変数に格納するにはどんな型を使用すればいいのか?です。 格納できればどんな方法でもいいです。 Dim buf as String と変数の宣言してbufに上記の関数の結果のみを入れたいのですが型が違いますとエラーがでます。セルが算術式のときの型ってなんでしょうか? 目的はNULLは大丈夫なのですが、バツ(×)を変数に格納したいです。 よろしくお願いいたします。

  • VBAの変数の型について

    VBAの変数の型について VBA初心者です。 下記のようにして背景に色を付けようと思ったのですが、 文字列型の変数名では、型が違うとエラーが出ます。 ただ、事情により、文字列型でしか色情報を取得できないため、 VBA内部で型の変更をして、上手く処理出来ないかと考えています。 文字列型から色名に対応する型への変更は、出来るのでしょうか? --------------------------------------- .BackgroundPatternColor = 文字列型変数名 --------------------------------------- 現在は、諦めて、下記のようにして対応しています。 --------------------------------------- If (bgColor = "黄") Then .BackgroundPatternColor = wdColorYellow End If --------------------------------------- よろしくお願い致します。

  • エクセルVBAの質問です。

    エクセルVBAの質問です。 セルに特定の値が入力された場合にエラーとし、「再試行」を選択するとセルが修正出来る状態にしたいのですが、下記のコードだと実行時エラーが発生してしまいます。 if cells(10,10).value > 1 then if msgbox("err", vbCritical + vbRetryCancel,"") = vbRetry then Cells(10,10).Select Cells(10,10).Active ⇒ エラー箇所 else Cells(10,10).ClearContents Endif Endif 実行時エラー '438' オブジェクトは、このプロパティまたはメソッドをサポートしてません。 いろいろネットを検索してみましたが、よくわかりませんでした・・・。 VBAは初心者です。 かなり困ってます。 どなたか助言をお願い致します。

  • VBAの書き方を教えてください 3

    何度も申し訳ございません。 以前にもこちらで質問させて頂いている者です。 Sheet1のrange("A1")をVLOOKUPで検索後の文字を取得し、同じ名前のシートを検索し、さらにrange("A1000")をアクティブにしてここからコードをつなげて処理しています。 range("A1")の処理が終わったら、range("A2")の処理に入り、range("A3") range("A4")を続けて処理を行っているのですが、range("A4")でVLOOKUPの検索が空白の場合、On Error GoTo myErrorで次のrange("A5")の処理に入りますが、On Error Gotoは1回のみの処理しかできないみたいで、range("A5")が空白の場合、実行時エラー9が発生してしまいます。 教えて頂いたコードを解読し、On Error Resume Nextなどを使おうとしているのですが、上手くできません。 1から10まで質問しっぱなしなのですが、どなたかご協力を頂けないでしょうか。 とりあえず自分の必要なコードはある程度省いて、2つ分のみ記載します。 本来この後、10回同じ処理を行います。 よろしくお願い致します。 Private Sub 記帳_Click()  On Error GoTo myError1  Dim i As Long  Dim myFlg As Boolean    For i = 1 To worksheets.Count If worksheets(i).Name = Range("A1").Value Then myFlg = True Exit For End If Next i If myFlg = True Then With worksheets(i) .Activate .Range("A1000").End(xlUp).Select    ActiveCell.Offset(1, 0).Select   ActiveCell = Range("J1") ActiveCell.Offset(0, 1).Select ActiveCell = Range("K1") End With Else MsgBox "該当シートなし" End If myError1: On Error GoTo myError2 For i = 1 To worksheets.Count If worksheets(i).Name = Range("A2").Value Then myFlg = True Exit For End If Next i If myFlg = True Then With worksheets(i) .Activate .Range("A1000").End(xlUp).Select ActiveCell.Offset(1, 0).Select   ActiveCell = Range("J1") ActiveCell.Offset(0, 1).Select ActiveCell = Range("K1") End With Else MsgBox "該当シートなし" End If End sub

  • [VBA]型が一致しません

    EXCELWORKSHEET上で下記の処理をすると「型が一致しません」との エラーがでます。どうにも原因と対応策がわからず悩んでいます。 デバッグの良い方法ありませんでしょうか? <現象> *列2上のセルを選択して、DELETEキーを押す。⇒エラーなし。 *しかし、列2上のセルとその他のセルを同時選択した上で、DELETEキーを押すと「型が一致しません。」のエラー。 頭の「If Target.Column Like 2 And Len(Target.Value) > 0 Then 」が悪さしているのはわかるのですが・・・。 Private Sub WORKSHEET_CHANGE(ByVal Target As Range) If Target.Column Like 2 And Len(Target.Value) > 0 Then Range("c" & Target.Row).Value = Now If Target.Column Like 2 And Len(Target.Value) > 0 Then 'B列の場合だけ確認 Dim rng As Range Set rng = ActiveSheet.Range("B:B").Find(What:=Target, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True, MatchByte:=True) If Not rng Is Nothing Then '発見した。 If rng.Address <> Target.Address Then '入力中セル以外で発見 Select Case MsgBox("過去に受け入れたLOTです。再度受入れますか?", vbYesNo) Case vbYes Range("B2").Activate Selection.End(xlDown).Select ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Now ActiveCell.Offset(0, 1).Activate ActiveCell.Value = UserForm2.TextBox2.Value UserForm2.TextBox1.Value = "" UserForm2.TextBox2.Value = "" UserForm2.TextBox1.SetFocus Range("B2").Activate Selection.End(xlDown).Select Selection.Offset(1, 0).Select Case vbNo Range("B2").Activate Selection.End(xlDown).Select ActiveCell.ClearContents ActiveCell.Offset(0, 1).Activate ActiveCell.ClearContents UserForm2.TextBox1.Value = "" UserForm2.TextBox2.Value = "" UserForm2.TextBox1.SetFocus End Select End If End If End If End If End Sub

  • VBA Vlookup #N/A表示させない方法

    こんばんわ。 VBAでVLOOKUPを実施していますが値が見つからない場合#N/Aが表示されてしまいます。 これを表示させない良い方法ありますでしょうか? 以下のようにCells(1,i)がブランクになるまで別シート(日別商品別集計)の40列目の値を検索するロジックです。処理はうまくいっていますが値がない場合は” ”にしたいのですが”#N/A”が表示されてしまいます。 Do While Cells(1, j) <> ""  ActiveCell.Value = Application.VLookup(Cells(1, j), Worksheets("日別商品別集  計").Range("A2:AN533"), 40, False) *エラーの場合 On Error GoTo ERR_1 ERR_1: ActiveCell.Value = "" j = j + 1 ActiveCell.Offset(0, 1).Select Loop どなたかご教授いただけませんでしょうか? よろしくお願い致します。

  • Do loopのマクロ

    以下のマクロの問題点を教えていただきたいのです。 A列を上から順番に調べて、値が10のときだけBに分岐して処理を行い(処理の内容は省略してあります)、またAに戻って、空白のセルが見つかったら処理をやめる、というマクロです。 ところが、これを実行すると空白のセルが見つかってもマクロが止まりません。何が問題でしょうか。 Sub A() Cells(1, 1).Select A: Do Until ActiveCell.Value = "" If ActiveCell.Value = 10 Then GoTo B End If ActiveCell.Offset(1, 0).Select Loop B: ActiveCell.Offset(1, 0).Select GoTo A End Sub

  • VBAでorを使用しているときの合致条件

    お世話になります。 vbaで、下記の様なif文があるときに、 iは、1,2,3のどれで合致しているか判別する方法はありますか? 現在は、下記のように処理(1)を繰り返し、書いているのを 一度で済ませたいと思っています。 -------現在---------------- if i=1 then '処理(1) 'iの値が1の時の処理 elseif i=2 then '処理(1) 'iの値が2の時の処理 elseif i=3 then '処理(1) 'iの値が3の時の処理 endif ----------------------------------- ----------------理想--------------------------- if i=1 or i=2 or i=3 then '処理(1) ★★ここの時点でiの値を取りたい endif '処理で、iの値によって分岐 ------------------------------------------

  • Filter関数を用いた結果、何も検索されなかった場合

    Filter関数を用いた結果、何も検索されなかった場合 以下のプログラムを実行したところ、セルはまっさらのまま。   Sub Macro3()     Dim a As Variant     a = Array(1, 2, 3, 4, 5)     ActiveCell.Value = Filter(a, 8)   End Sub そこで   If Filter(A,8) = "" Then ・・・(1)     ActiveCell.Offset(1, 0).value = False   Else表示     ActiveCell.Offset(1, 0).value = True   endif を書き加えてみましたところ、   実行時エラー'13':   型が一致しません とのエラーが出ます。 (1)を   If ActiveCell.value = "" Then と書く分には問題ないのですが、だからと言って、Filter(A,8)の値は""で表せないのですね。 とりあえずこの五行はエラーが出ているので削除しました。 次に   ActiveCell.Offset(1, 0).Value = IsEmpty(Filter(A, 8)) を書き加えると、アクティブセルの一つ下は「False」となります。Filter(A,8)では何も抽出されないのですから、空か否かを問われたら「True」のはずなのですが・・・やはり何か戻り値があるのですね・・・ ではエラー値が戻っているのかと   ActiveCell.Offset(2, 0).Value = IsError(Filter(A, 8)) を書き加えると、「False」ですからエラー値ではありません。   If Filter(A,8) = Null Then ・・・(2)     ActiveCell.Offset(3, 0).value = False   Else表示     ActiveCell.Offset(3, 0).value = True   endif を書き加えたところ、またも   実行時エラー'13':   型が一致しません とのエラーが出ます。 (2)を   If Filter(A,8) = Error Then と書き換えてみても同じです。 試しに(2)を   If Cvar(Filter(A,8)) = Null Then としてみたり   If Filter(A,8) = Cvar(Null) Then としてみたり   If Cvar(Filter(A,8)) = Cvar(Null) Then としてみたりしましたが、同じエラーが出ます。 Ubound(Filter(A,8)の値は-1です。これをもってこの場合の戻り値とするしかないのでしょうか。filter関数の戻り値が分からないからUbound関数を使っていることがモロばれで、嫌なんです。   If Filter(A,8) = なんとか Then のなんとかに入る戻り値をどなたか教えてください。

  • on error 処理に関して

    on error goto での処理ルーチン内で、 さらに on error goto を出すことは可能でしょうか。 それとも、一度on errorを設定すると、エラーが発生した後では変更は不可なのでしょうか。 やりたいことは、 1回目と、2回目、3回目以降でやることとを変えたいのです。 例えば、メッセージを変えるとか。 この場合、 エラー処理の中で、何回目かを聞くことで、メッセージを変えることは出来ると思うのですが、 それはやらず、 他にも色々やることが多いので、別処理として飛びたいのです。 以下のようなイメージです。 err1: on error goto err2 resume next err2: on error goto err3 resume next err3: resume next 宜しくお願いします。

専門家に質問してみよう