[[20200820101346]] 『VBA IsError関数の使い方』(T20) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA IsError関数の使い方』(T20)

重複する数字を求めるのに、MODE関数を使う予定です。
実例では、重複はあっても一つと限られるためです。
重複なしはあり得るので、その場合はIsError関数で回避したいのですがエラーとなります。
下例ではIf文のところで止まってしまいます。
原因と対策をお願いします。

 A1:B2
 10	18
 16	13
 Sub test_00()
    Dim itm
    itm = Range("A1:B2").Value
    If IsError(WorksheetFunction.Mode(itm)) = True Then
        MsgBox "none"
    Else
        MsgBox WorksheetFunction.Mode(itm)
    End If
 End Sub

< 使用 アプリ:2010、使用 OS:Windows10 >


 WorksheetFunctionでワークシート関数を使用した場合にエラーになった場合、エラー値を返さずに実行時エラーとなる。
 WorksheetFunction.Mode
 ではなく
 Application.Mode
 を使ってはどうか。
 こちらであればエラー時にエラー値を返す。
(ねむねむ) 2020/08/20(木) 10:34

 Sub test_00()
    Dim itm As Range
    Set itm = Range("A1:B2")
    On Error GoTo erend
    MsgBox WorksheetFunction.Mode(itm)
    Exit Sub
erend:
    MsgBox "none"
 End Sub

(mm) 2020/08/20(木) 10:38


 Evaluateでもいいんでないですか?
    Sub a()
        Dim v As Variant
        v = [iserror(mode(a1:b2))]
        If v Then
            MsgBox "重複なし"
        Else
            MsgBox "重複あり"
        End If
    End Sub
(稲葉) 2020/08/20(木) 11:18

早々にありがとうございます。

ネットで調べてみると、「Application.XXX」は旧バージョンの記法だがねむねむさんが書かれている理由で今でも使われる場合があるらしいですね…まったく知りませんでした。
On Errorは使ったことありますが、Evaluateは初めてです。(重複値が欲しい時は[mode(a1:b2)]にすればいいんですね)
勉強になりました。

「Application.XXX」記法の方が処理速度が遅い、との記述もみかけましたが、新しい記法に移行するのは結構なことですが、こんなメリットを殺してまでする必要があったのか、一度訊いてみたいですね、MS社さんに。

最後の文は余計でしたが、これからもよろしくお願いします。

(T20) 2020/08/20(木) 11:48


 後学までに教えてください。
 これって実際にどういう場面でmode関数で重複を判断する必要があるんですか?

 >重複値が欲しい時は[mode(a1:b2)]
 これだと、範囲に2つ以上重複があった場合、片方しか出ません。
 mode.multで出ますけど、それでも2,2,3,3,3とかだと、3しか出ません。
 数値に見える文字も対象になりません。

 前回の投稿で学んだdictionaryを使うほうが素直だと思いますが、何かしら意図があるのですか?

(稲葉) 2020/08/20(木) 17:36


 >実例では、重複はあっても一つと限られるためです。 
 これ読み落としてました。 

 >数値に見える文字も対象になりません。
 こっちも対処済みですね。

 すみません。

(稲葉) 2020/08/20(木) 17:54


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.