質問読んでみましたが、これは、初歩的な暗号システムの一種ですね。
こちらは、VBカテゴリですから、VBA以外の回答は考えていません。
他の方のマクロを良く見ていませんが、あまり深く考えておりません。なお、変更ある場合は、コードをよく読めば可能だと思います。現在は、ActiveSheetのA列を対象として、結果は、同じ行のB列に出力します。
オールゼロに関しては、ゼロの文字が入っている以上は変換させてしまいますから、不要でしたら、IsNumericの後の 'If Clng(sNum) = 0 コメントブロックを外してください。
それと、初歩的なことですが、ワークシートのセルに、VBAで言うNull値は存在しません。
暗号システムということで、VBEditor 上の変換テーブルを書くことにします。
なお、1~2桁目・・・という文言が、文字列として数えているようですから、左から取るようにしています。数値なら、右から取るはずです。
'//モジュールトップに置く(標準モジュール用)
'変換テーブル 1,2,3,4,5,6,7,8,9,0
Private Const N1 = "5,4,1,0,8,2,3,6,7,9" '1~2桁目
Private Const N2 = "6,3,2,1,5,4,0,7,9,8" '3~4桁目
Private Const N3 = "7,3,6,4,6,2,1,5,9,8" '5~6桁目
Private Const N4 = "4,1,3,9,2,6,8,0,7,5" '7~8桁目
Private Const N5 = "5,1,8,2,3,0,4,6,9,7" '9~10桁目
Private Ns1 As Variant
Private Ns2 As Variant
Private Ns3 As Variant
Private Ns4 As Variant
Private Ns5 As Variant
Sub TestConvert()
Dim rng As Range
Dim c As Range
Dim buf As Variant
Ns1 = Split(N1, ",")
Ns2 = Split(N2, ",")
Ns3 = Split(N3, ",")
Ns4 = Split(N4, ",")
Ns5 = Split(N5, ",")
With ActiveSheet
Set rng = .Range("A1", .Cells(Rows.Count, 1).End(xlUp))
Application.ScreenUpdating = False
For Each c In rng
buf = ConvertNum(c.Text)
c.Offset(, 1).Value = "'" & buf
Next
Application.ScreenUpdating = True
End With
Set rng = Nothing
End Sub
Function ConvertNum(sNum As Variant)
Const K As Integer = 10
Dim num As String
Dim i As Long, j As Long
Dim ar As Variant
Dim buf As String
'数値は左側から取る、不足分は0を加える
If IsNumeric(sNum) = False Then Exit Function '数値でない場合
'If Clng(sNum) = 0 Then Exit Function 'すべて0の場合
sNum = CStr(sNum)
If Len(sNum) < K Then
sNum = sNum & String(K - Len(sNum), "0")
Else
sNum = Left(sNum, K)
End If
For i = 1 To 10 Step 2
num = Mid(sNum, i, 2)
Select Case i
Case 1: ar = Ns1
Case 3: ar = Ns2
Case 5: ar = Ns3
Case 7: ar = Ns4
Case 9: ar = Ns5
End Select
For j = 1 To Len(num)
buf = buf & ar((Mid(num, j, 1) + 9) Mod 10)
Next
Next
ConvertNum = buf
End Function
お礼
素晴らしいご回答ありがとうございます。 試してみましたところ、残念ながらこちらの希望する通りの結果が出ませんでした…。 どのように試したかを下記いたします。方法で間違っている部分もあるかも しれませんので、その場合はご指摘いただければ幸いです。 ------------ (1)変換テーブル作成 "Sheet1"の"A10~J19"に変更後の数値を入力 (A10、B10には1桁目、2桁目が1だった場合の変更後数値である"5"を入力、 A11、B11には1桁目、2桁目が2だった場合の変更後数値である"4"を入力、 以下同様にJ19までそれぞれの変更後数値を入力) (2)テストデータ作成 ご教示いただいたVBAの「テストデータ」を実行 "Sheet2"の"A1~A10000"にランダムな10桁の数値 (1桁目がゼロの場合、ゼロは表示されず9桁の数値となる)が自動表示された (3)数値変換 ご教示いただいたVBAの「変換」を実行 "Sheet3"の"A1~A10000"に変更後と思しき10桁の数値 (文字列:1桁目がゼロの場合でもゼロは表示され10桁となる)が自動表示された ----------- 問題1 (3)の結果が、(1)で作成したテーブル通りとならない 想定上結果: 変更前1111111111 ⇒変更後5566774455(Sheet1のA10~J10を並べた数値) 上記結果: 変更前1111111111 ⇒変更後4433331111 問題2 (2)をせず、直接Sheet2のA1に'1111111111と入力し(3)を実行したところ MSG「実行時エラー'13' 型が一致しません」が表示 デバッグ表示箇所⇒ For i = 1 To UBound(aa_1) もしお時間がございましたら、ご確認・ご教示いただければ幸いです。 お手数をおかけいたしますが、なにとぞ宜しくお願いいたします。