[[20181108003310]] 『【VBA】ユーザ定義関数が動かない』(マクロ初心者) ページの最後に飛ぶ

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

 

『【VBA】ユーザ定義関数が動かない』(マクロ初心者)

下記のようなプログラムをネットで調べてVBEの標準モジュールに記述し、
ワークシートの適当なセルに「=mdl43」と入力してEnterを押しましたが
セルの表示が「#REF!」となってしまい狙った効果が得られません。
皆様のお知恵をお借りしたいと思います。
宜しくお願いします。

Function mdl43(rng)

 Dim lst, i As Long, j As Long, tot As Long
 lst = Split("0,1,2,3,4,5,6,7,8,9," & _
"A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z," & _
"-,., ,$,/,+,%", ",")
For i = 1 To Len(rng)
For j = 0 To UBound(lst)
If Mid(rng, i, 1) = lst(j) Then tot = tot + j
Next
 Next
 mdl43 = rng & lst(tot Mod 43)
 End Function 

< 使用 Excel:Excel2013、使用 OS:Windows8 >


ユーザ定義関数の使い方も解らんで、よく書いたもんだと思うけど、
何をやりたいんか、高度すぎてさっぱりわかりません。

=mdl43("abcdef") ???
=mdl43(5) ???
=mdl43(12345) ???
=mdl43("G") ???

(BJ) 2018/11/08(木) 03:26


とりあえず、「Len(rng)」、「mdl43 = rng & lst(tot Mod 43)」としているところから、どちらもString型ですかね。
    Function mdl43(rng As String) As String
        Dim lst As Variant, i As Long, j As Long, tot As Long
        lst = Split("0,1,2,3,4,5,6,7,8,9," & _
        "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z," & _
        "-,., ,$,/,+,%", ",")

        For i = 1 To Len(rng)
            For j = 0 To UBound(lst)
                If Mid(rng, i, 1) = lst(j) Then tot = tot + j
            Next
        Next

        mdl43 = rng & lst(tot Mod 43)
    End Function

やりたいことはピンとこないけど、
>「=mdl43」と入力してEnterを押しましたが、セルの表示が「#REF!」となってしまい
そりゃそうでしょう。"引数"なにも入れてないんですから、Excel君からすりゃ 「=Sum」とだけ書かれたようなものです。

BJさんが示されているように、引数を与えてからどうなるか(想定通り動くのか)考えてみてはどうでしょうか。

(もこな2) 2018/11/08(木) 06:31


関数名がよろしくないんじゃないでしょうか。
ユーザー定義関数にセルの番地と競合する名前をつけると#REF!エラーになります。
(白髪の老人) 2018/11/08(木) 09:49

 多分ネットにあったのはEXCEL2003以前で作られたものなのだろう。
 2003以前は列がIV列までだったのでセル番地とはかぶらずエラーにならなかったが2007からは
 XFDまでになったのでかぶってしまう。
(ねむねむ) 2018/11/08(木) 09:56

 質問者さんの提示された関数は、バーコード規格のうちCODE39で用いられるチェックデジットを計算し、元の文字に追加して返すものと思います。
この計算方法がモジュラス43といわれるもので、関数名のmdl43はmodulus43を短縮したものなのでしょう。
これはVBAの名前つけ規則に反するものでなく、プロシージャとして記述し他のプロシージャから呼び出す場合は問題ありません。
セル番地との競合はユーザー定義関数、マクロ記録の名前などで生じます。
モジュラス43の短縮名といったことが念頭にあるとセル番地と競合することが思いつきにくいです。
ねむねむさんの指摘のようにEXCEL2003までは動いただろうということになるとなおさらです。

 コードの関数名を変更しましょう。関数名は一例です。
1行目を、Function modulus43(rng)
下から2行目を、modulus43 = rng & lst(tot Mod 43)
このように修正して、ワークシートの適当なセルに=modulus43(指定セル)とすれば意味のある結果が得られるでしょう。

(白髪の老人) 2018/11/08(木) 16:32


皆様ありがとうございます。
無事解決しました。
(マクロ初心者) 2018/11/08(木) 20:43

コメント返信:

[ 一覧(最新更新順) ]


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