- ベストアンサー
検証番号を付ける関数について
ここにABCDEFGという7ケタの数字があるとしてこの7ケタの数字を使って検証番号Hを付けるのですが、その手順としてこの7ケタの数字のうちDはほとんど使わない数字なのでABCとEFGを使います。検証番号Hの計算方法は(A×1)+(B×2)+(C×1)+(E×2)+(F×1)+(G×2)で、カッコの積の各部分が2ケタになった場合はカッコの部分は1ケタ目と2ケタ目の数字の和となります。こうして計算して出た数字の下1ケタをHとしてABCEFGHという7ケタの数字を別セルに表示したいのです。この検証番号がついた新しい7ケタを関数でどう表したらいいのか教えていただきたいのです よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ツール→マクロ→Visual Basic Editor でVBE画面に移り、挿入→標準モジュール で標準モジュールを挿入します。出てきたコードウインドウに下記マクロをコピーして貼り付けます。 ●●● 7桁の数字を扱う場合(次のFunction~End Function までをコピーして貼り付け) ↓ Function Kensyou7Keta(ByVal Num As String) As Double Const Jyosuu = "1210212" '// 各桁への乗数 Dim L As Integer '// 文字列カウンタ Dim ELM As String '// 各桁の演算結果を2桁表示 Dim SGM As Integer '// 各桁の演算の合計値 For L = 1 To Len(Num) ELM = Right("0" & (Mid(Num, L, 1) * Mid(Jyosuu, L, 1)), 2) SGM = SGM + Mid(ELM, 1, 1) + Mid(ELM, 2, 1) '// 桁毎に加算 Next '// 最終結果の数字列を作る Kensyou7Keta = Left(Num, 3) & Right(Num, 3) & Right(SGM, 1) End Function ↑ ○使い方 シートに戻って、 A1に元の数値があり、B1に検証番号を出したければ、 B1に、『=Kensyou7Keta(A1)』と入力します。(『』の中です) ●●● 6桁の数字を扱う場合(次のFunction~End Function までをコピーして貼り付け) ここは最初考えた方法とは違ったようです。修正しました。 Function~End Functionの貼り付けと何回も書いていますが、異なる関数なので、続けて貼り付けてかまいません。 Function Kensyou6Keta(ByVal Num As String) As Double Const Jyosuu = "121212" '// 各桁への乗数 Dim L As Integer '// 文字列カウンタ Dim ELM As String '// 各桁の演算結果を2桁表示 Dim SGM As Integer '// 各桁の演算の合計値 For L = 1 To Len(Num) ELM = Right("0" & (Mid(Num, L, 1) * Mid(Jyosuu, L, 1)), 2) SGM = SGM + Mid(ELM, 1, 1) + Mid(ELM, 2, 1) '// 桁毎に加算 Next '// 最終結果の数字列を作る Kensyou6Keta = Left(Num, 3) & Right(Num, 3) & Right(SGM, 1) End Function ○使い方 シートに戻って、 A2に元の数値があり、B2に検証番号を出したければ、 B2に、『=Kensyou6Keta(A2)』と入力します。(『』の中です) ●●● 10からその下一ケタの数字で引いた数とする場合(次のFunction~End Function までをコピーして貼り付け) 7桁、6桁の場合を示します。2つの関数を貼り付けることになります。 Function Kensyou7KetaB(ByVal Num As String) As Double Const Jyosuu = "1210212" '// 各桁への乗数 Dim L As Integer '// 文字列カウンタ Dim ELM As String '// 各桁の演算結果を2桁表示 Dim SGM As Integer '// 各桁の演算の合計値 For L = 1 To Len(Num) ELM = Right("0" & (Mid(Num, L, 1) * Mid(Jyosuu, L, 1)), 2) SGM = SGM + Mid(ELM, 1, 1) + Mid(ELM, 2, 1) '// 桁毎に加算 Next '// 最終結果の数字列を作る Kensyou7KetaB = Left(Num, 3) & Right(Num, 3) & Right((10 - Right(SGM, 1)), 1) End Function Function Kensyou6KetaB(ByVal Num As String) As Double Const Jyosuu = "121212" '// 各桁への乗数 Dim L As Integer '// 文字列カウンタ Dim ELM As String '// 各桁の演算結果を2桁表示 Dim SGM As Integer '// 各桁の演算の合計値 For L = 1 To Len(Num) ELM = Right("0" & (Mid(Num, L, 1) * Mid(Jyosuu, L, 1)), 2) SGM = SGM + Mid(ELM, 1, 1) + Mid(ELM, 2, 1) '// 桁毎に加算 Next '// 最終結果の数字列を作る Kensyou6KetaB = Left(Num, 3) & Right(Num, 3) & Right((10 - Right(SGM, 1)), 1) End Function ○使い方 シートに戻って、 7桁の場合、A3に元の数値があり、B3に検証番号を出したければ、 B3に、『=Kensyou7KetaB(A3)』と入力します。 6桁の場合、A4に元の数値があり、B4に検証番号を出したければ、 B4に、『=Kensyou6KetaB(A4)』と入力します。 ●●● A5、B5セルに3桁数値の入力があり、C5に検証番号を出す場合、 Hが最初の計算方式なら、 C5に『=Kensyou6Keta(A5&B5)』 10から引く場合は、 C5に『=Kensyou6KetaB(A5&B5)』 とします。
その他の回答 (3)
- nishi6
- ベストアンサー率67% (869/1280)
ユーザー定義関数を作るといいかもしれません。 ツール→マクロ→Visual Basic Editor でVBE画面に移り、挿入→標準モジュール で標準モジュールを挿入します。出てきたコードウインドウに下記マクロをコピーして貼り付けます。 まず、計算方法の確認です。 >としてこの7ケタの数字のうちDはほとんど使わない数字なので Dは4桁目のことを言っているのでしょうか。 それとも、どの桁に現われるか分からないある数値(例えば「9」とか)でしょうか。 →上から4桁目を削除するとして考えました。 =KensyouNo(A1) のように使います。 Function KensyouNo(ByVal Num As String) As Double Const Jyosuu = "1210212" '// 各桁への乗数 Dim L As Integer '// 文字列カウンタ Dim ELM As String '// 各桁の演算結果を2桁表示 Dim SGM As Integer '// 各桁の演算の合計値 For L = 1 To Len(Num) ELM = Right("0" & (Mid(Num, L, 1) * Mid(Jyosuu, L, 1)), 2) SGM = SGM + Mid(ELM, 1, 1) + Mid(ELM, 2, 1) '// 桁毎に加算 Next '// 最終結果の数字列を作る KensyouNo = Left(Num, 3) & Right(Num, Len(Num) - 4) & Right(SGM, 1) End Function 補足 >1つ目に元々6ケタABCDEFという数字である場合は関数はどうなるのでしょうか どうなるよりも、どうしたいかがよく分かりません。 →7桁と同様、ABCDEF---->ABCEFH にしてみます。 上の関数のままで6桁も計算できるはずです。 >2つ目に検証番号Hの出し方で最終計算の数字下一ケタですがHの算出は10からその下一ケタの数字で引いた数とする場合はどうなるのでしょうか 最終行を次のように修正します。 '// 最終結果の数字列を作る KensyouNo2 = Left(Num, 3) & Right(Num, Len(Num) - 4) & Right((10 - Right(SGM, 1)), 1) >3つ目にA1のセルにABC、B1のセルにEFGと入力したらC1のセルにABCEFGHと表示する場合はどのように関数を設定したらよろしいでしょうか =KensyouNo(A1&"0"&B1) のように使います。
- maron--5
- ベストアンサー率36% (321/877)
◆こんな方法もありますよ(式が帰って長くなりましたが参考までに) =LEFT(A1,3)&RIGHT(A1,3)&RIGHT(SUMPRODUCT((MOD(ROW(1:6),2)+((MOD(ROW(1:6),2)=0)*2))*MID(LEFT(A1,3)&RIGHT(A1,3),ROW(1:6),1))-SUMPRODUCT((MOD(ROW(1:6),2)=0)*(--MID(LEFT(A1,3)&RIGHT(A1,3),ROW(1:6),1)>=5))*9)
補足
素早い返答ありがとうございます。かなり複雑な関数ですね。これでいけると思ったのですが急遽必要になった事項があり、これに付随して3点質問してもよろしいでしょうか。1つ目に元々6ケタABCDEFという数字である場合は関数はどうなるのでしょうか。2つ目に検証番号Hの出し方で最終計算の数字下一ケタですがHの算出は10からその下一ケタの数字で引いた数とする場合はどうなるのでしょうか。もし下一ケタの数字が0の場合はHは0とします。3つ目にA1のセルにABC、B1のセルにEFGと入力したらC1のセルにABCEFGHと表示する場合はどのように関数を設定したらよろしいでしょうか。質問を分けてした方がいいのかもしれませんが、よろしくお願いします。
=LEFT(A1,3)&RIGHT(A1,3)&MOD(LEFT(A1,1)+INT(MID(A1,2,1)*2/10)+MOD(MID(A1,2,1)*2,10)+MID(A1,3,1)+INT(MID(A1,5,1)*2/10)+MOD(MID(A1,5,1)*2,10)+MID(A1,6,1)+INT(MID(A1,7,1)*2/10)+MOD(MID(A1,7,1)*2,10),10)
補足
素早い返答ありがとうございます。かなり複雑な関数ですね。これでいけると思ったのですが急遽必要になった事項があり、これに付随して3点質問してもよろしいでしょうか。1つ目に元々6ケタABCDEFという数字である場合は関数はどうなるのでしょうか。2つ目に検証番号Hの出し方で最終計算の数字下一ケタですがHの算出は10からその下一ケタの数字で引いた数とする場合はどうなるのでしょうか。もし下一ケタの数字が0の場合はHは0とします。3つ目にA1のセルにABC、B1のセルにEFGと入力したらC1のセルにABCEFGHと表示する場合はどのように関数を設定したらよろしいでしょうか。質問を分けてした方がいいのかもしれませんが、よろしくお願いします。
お礼
補足追加ですいません。コピーをしたあとにどのような作業をすれば変換された数字がでるのかがわかりません。コピーのみでいけるのですか?
補足
見立ての通りDは4ケタ目ということです。 下記マクロをコピーとあるのは数式部分だけをコピーするということ でよろしいのですか? それとも~のように使いますとか'//以降の文章もいう言葉の部分も必要なのですか? 補足の6ケタというのは元々7ケタあるとか考えず、単に6ケタのABCDEFという数字があると考えて、それに対応して上記の計算による検証番号をつけて7ケタのABCDEFHで考えた場合です。Dを削除とかはこの場合考えません。 なにせ関数に関しては初心者でどのようにしたらいいのかさっぱりなのです。