[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『【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
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
多分ネットにあったのは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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.