[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『引数の仕組み・引数を利用したプログラムについて』(フェンダー)
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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.