[[20140722133825]] 『引数の仕組み・引数を利用したプログラムについて』(フェンダー) ページの最後に飛ぶ

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

 

『引数の仕組み・引数を利用したプログラムについて』(フェンダー)

Sub mainパターン1()

チェックデジット = "1234567890"

Dim cd As Integer
Dim num As Integer '計算用
Dim x As Integer '合計用
Dim i As Integer 'ループ用

Dim result As Integer

x = 0
For i = 0 To 9 'Nextの間で iの値を0から9まで繰り返す(10桁)
num = Mid(チェックデジット, i + 1, 1) '左からi+1番目の数字を取り出す
If i Mod 2 = 0 Then num = num * 2 'iが偶数なら数字を2倍する 2,1,2,1,2,1,2,1,2,1
If num >= 10 Then num = CInt(Mid(num, 1, 1)) + CInt(Mid(num, 2, 1)) '数字が2桁なら各桁を足す
x = x + num '合計を加算する
Next

cd = 10 - (x Mod 10) '10から合計を10で割った余りを引いて結果を返す

result = cd

 If result = "10" Then 'チェックデジットが10の場合(値に0が含まれている)

result = "0"

End If

  MsgBox チェックデジット & result

End Sub

上記のmainパターン1プログラムで10桁の数値に対してチェックデジットを
生成するプログラムが作成してあります。

こちらを下記のように、引数を使用したプログラムに変更して

 Functionの値を
Sub mainパターン2に渡したいのですが
現在、結果が(数値なし)になってしまいます。
参照の渡し方についてアドバイス頂ければ助かります。
宜しくお願い致します。

Sub main()

Dim str

    str = ルーンズ10WDSR(チェックデジット)

MsgBox str

End Sub

 Function ルーンズ10WDSR(ByVal result As Integer)

チェックデジット = "1234567890"

Dim cd As Integer
Dim num As Integer '計算用
Dim x As Integer '合計用
Dim i As Integer 'ループ用

x = 0
For i = 0 To 9 'Nextの間で iの値を0から9まで繰り返す(10桁)
num = Mid(チェックデジット, i + 1, 1) '左からi+1番目の数字を取り出す
If i Mod 2 = 0 Then num = num * 2 'iが偶数なら数字を2倍する 2,1,2,1,2,1,2,1,2,1
If num >= 10 Then num = CInt(Mid(num, 1, 1)) + CInt(Mid(num, 2, 1)) '数字が2桁なら各桁を足す
x = x + num '合計を加算する
Next

cd = 10 - (x Mod 10) '10から合計を10で割った余りを引いて結果を返す

result = cd

 If result = "10" Then 'チェックデジットが10の場合(値に0が含まれている)

result = "0"

End If

End Function

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 関数の返り値は、関数内で
 関数名 = 結果
 です。

 ルーンズ10WDSR = "..."
 のように変更してください。

 引数は 呼び出し元 ⇒ 関数(or サブルーチン)へのデータ渡しです。
 引数を戻り値を返すのに使用できないこともありませんが、その場合の宣言は ByRef
 になります(デフォルトは ByRef ですが ByVal 宣言をしているので。)

 そのような使用方法はあまりお勧めしません。
http://homepage1.nifty.com/CavalierLab/lab/vb/byvalbyref.html

 気になったのは、呼び出し元と関数で引数の型が異なっていますが、このたりはきちんと
 整合するようにした方がよいと思います。

 全体的に数値と文字列の扱いが混乱しているように見受けられます。

(Mook) 2014/07/22(火) 14:03


 こんにちは。

 下記にFunctionプロシージャについての説明がありますので、
 読まれてみるとよいと思います。

http://www.officepro.jp/excelvba/sub/index6.html
http://www.excel-wing.com/study/macro/461

(めいぷる) 2014/07/22(火) 15:24


アドバイスどうもありがとうございます。
標題の件は、解決致しました。
これから数値と文字列の扱いを統一させるようにします。
因みにFunction内の
チェックデジット = "1234567890"を
mainパターン2に渡したいときは
Function ルーンズ10WDSR(チェックデジット)に宣言して
問題ありますでしょうか?
ご提示のサイトや参考書等チェックしたのですが
お手数ですがどうぞ宜しくお願いいたします。

Sub mainパターン2()
Dim result

    result = チェックデジット & ルーンズ10WDSR(チェックデジット)
MsgBox result
End Sub
 Function ルーンズ10WDSR(チェックデジット)
チェックデジット = "1234567890"
Dim cd As Integer
Dim num As Integer '計算用
Dim x As Integer '合計用
Dim i As Integer 'ループ用
x = 0
For i = 0 To 9 'Nextの間で iの値を0から9まで繰り返す(10桁)
num = Mid(チェックデジット, i + 1, 1) '左からi+1番目の数字を取り出す
If i Mod 2 = 0 Then num = num * 2 'iが偶数なら数字を2倍する 2,1,2,1,2,1,2,1,2,1
If num >= 10 Then num = CInt(Mid(num, 1, 1)) + CInt(Mid(num, 2, 1)) '数字が2桁なら各桁を足す
x = x + num '合計を加算する
Next
cd = 10 - (x Mod 10) '10から合計を10で割った余りを引いて結果を返す
ルーンズ10WDSR = cd
 If ルーンズ10WDSR = "10" Then 'チェックデジットが10の場合(値に0が含まれている)
ルーンズ10WDSR = "0"
End If
End Function

(フェンダー) 2014/07/23(水) 10:04


 引数を関数側で用意するなら、引数として渡す必要は無いように見えます。

 数値と文字列とどう処理したいか不明ですが、
 関数という体裁に沿って、私がこれを書くとしたらこんな感じでしょうか。

 変数型をきちんと習得するのであれば、引数や変数に型をつけて宣言するように
 習慣付けるとよいと思います。

 Option Explicit
 Sub Sample()
    Dim 結果 As String
    Dim チェックデジット As String
    チェックデジット = "1234567890"

    結果 = チェックデジット & ルーンズ10WDSR(チェックデジット)
    MsgBox 結果 
 End Sub

 Function ルーンズ10WDSR(処理データ As String) As String
    Dim num As Long  '計算用
    Dim x As Long '合計用
    Dim i As Long 'ループ用
    x = 0

    For i = 0 To Len(処理データ) - 1  'Nextの間で iの値を0から9まで繰り返す(10桁)
        num = CLng(Mid(処理データ, i + 1, 1)) '左からi+1番目の数字を取り出す
        If i Mod 2 = 0 Then num = num * 2 'iが偶数なら数字を2倍する 2,1,2,1,2,1,2,1,2,1
        If num >= 10 Then num = CLng(Mid(num, 1, 1)) + CLng(Mid(num, 2, 1)) '数字が2桁なら各桁を足す
        x = x + num '合計を加算する
    Next
    ルーンズ10WDSR = CStr((10 - (x Mod 10)) Mod 10) '10から合計を10で割った余りを引いて結果を返す
 End Function

(Mook) 2014/07/23(水) 10:38


 # 変数型の変更に併せて CInt から CLng に変更
(Mook) 2014/07/23(水) 14:24


サンプルデータどうもありがとうございました。
参考にさせて頂きます。
またなにかありましたら、どうぞよろしくお願いいたします。
(フェンダー) 2014/07/24(木) 09:16

コメント返信:

[ 一覧(最新更新順) ]


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