|
今回は、丁目、番地、号などに入れた文字を
ハガキ用に漢数字を使いたい。

↑のように、名簿の丁目、番地、号の数字から、漢数字に替えたいのだ
たしか、関数の組合わせでもできたような気もするんだけど
あえて、ここはユーザー定義関数を作ってみたい。
(まぁ、ここはあくまでもたこちゅーの挑戦ということで!!ちょっと横道にそれますが・・・)
●Functionプロシージャ
実は今回使うのがこれ、Functionプロシージャです。
これは実行結果を返すことができるプロシージャーです。
つまりどういうことかといいますと
他のプロシージャから呼び出されたFunctionnフロシージャは、
引数で受け取った値をここ(Functionnプロシージャ内)で計算させたりして、
その結果を、呼び出したフロシージャに、返すといったことをします
そして、標準モジュールに、このFunctionフロシージャに記述すると
エクセルで使用している関数と同じように利用できます。
SUM関数、VLOOK関数・・・等々と同じようなものが作れるのです。
このことを、ユーザー定義関数と言っています
一応↓に示す、こんなマクロ(関数)を作ってみました。
作成場所はもちろん標準モジュールです。
Function KanNuber(MyC)
Dim i As Integer, n As Long
Dim P1, P2, P3, P4 As Variant
Dim A As String
If MyC = "" Then P1 = "": P2 = "": P3 = "": P4 = ""
GoTo Keisan
End If
n = Val(MyC)
A = "〇一ニ三四五六七八九"
i = Len(MyC)
If i > 4 Then
P1 = "": P2 = "": P3 = "": P4 = ""
GoTo Keisan
Else
Select Case i
Case 1
P1 = "": P2 = "": P3 = ""
P4 = Mid(A, n + 1, 1)
GoTo Keisan
Case 2
P1 = "": P2 = ""
n = Left(MyC, 1)
P3 = Mid(A, n + 1, 1)
n = Right(MyC, 1)
P4 = Mid(A, n + 1, 1)
GoTo Keisan
Case 3
P1 = ""
n = Left(MyC, 1)
P2 = Mid(A, n + 1, 1)
n = Mid(MyC, 2, 1)
P3 = Mid(A, n + 1, 1)
n = Right(MyC, 1)
P4 = Mid(A, n + 1, 1)
GoTo Keisan
Case 4
n = Left(MyC, 1)
P1 = Mid(A, n + 1, 1)
n = Mid(MyC, 2, 1)
P2 = Mid(A, n + 1, 1)
n = Mid(MyC, 3, 1)
P3 = Mid(A, n + 1, 1)
n = Right(MyC, 1)
P4 = Mid(A, n + 1, 1)
GoTo Keisan
End Select
End If
Keisan:
KanNuber = P1 & P2 & P3 & P4
End Function |
この方法は、わかりやすくマクロを理解するために、
単純な方法で作っています。
後で、文字数に左右されないマクロも紹介しますが、
ここでは、丁目、番、号までの数字は4桁までという条件をつけて
作成しています。それ以外は、計算外になります。
考え方
1、参照となる文字をMyCという変数で与えます
2、文字は4桁ですので左からP1 P2 P3 P4 という数字文字(数字)で
並んでいるとします(Variantですから、どちらでも可)
3、文字が空白のとき (最初のif文)です
全て文字のときは P1〜P4は "" という文字にしています。空白です。
そしてKeisanへ行けという GoTo Keisan を使っています。
Keisan:へ行きます。
KanNumber = P1 & P2 & P3 & P4
KanNumberはP1からP4までの併せ文字となります
この結果が返されることになります。
結果は "" です。
4、
n = Val(MyC)
A = "〇一ニ三四五六七八九"
数字MyCが、文字形式で表した数字でもいけるようにValで括(くく)っています
数字以外は、結果として、〇か#Value!で返されます。
〇一ニ三四五六七八九の文字を、変数Aに代入しています
5、
i = Len(MyC)
MyCの文字数を変数 i に代入します。文字数を知るにはLen関数を使います
次のif文は文字数iが4(字)より大きいときの命令で、文字数が""の時と
同じにしました。結果的には空白が入ります
If i > 4 Then
P1 = "": P2 = "": P3 = "": P4
= ""
GoTo Keisan
6、
Else つまり4字以内の数字のときになります
Select Case i これは前にも使いましたね
文字が1字から4字までの条件でそのときに対応した
結果をそれぞれ Case 1 ・・・・ で表現します
Case 4 だけ説明しておきます
Case 4 文字数が4のとき(4桁)
n = Left(MyC, 1)
nにMyCの文字の一番ひだり、つまり千の位の数字を代入します
Left(左から) ここの1は一文字だけ取り出せ!!ってことです
P1 = Mid(A, n + 1, 1)
Mid関数は 文字数の中間部分の文字を抽出する関数です
変数A つまり 〇から九までの文字から、1番目が〇で始まっています
から、〇の場合は1番目、一の場合は2番目・・・九の場合は10番目に
なります。つまり変数Aの文字から n+1 番目の文字を取り出せば
千の位の数字 n に対応する漢数字となるわけです。
その文字を変数P1に代入します。
n = Mid(MyC, 2, 1) 百の位の数字
P2 = Mid(A, n + 1, 1) 対応する漢数字
n = Mid(MyC, 3, 1) 十の位の数字
P3 = Mid(A, n + 1, 1) 対応する漢数字
n = Right(MyC, 1) 一の位の数字
P4 = Mid(A, n + 1, 1) 対応する漢数字
GoTo Keisan KeisanへGo
という具合になります。
●名簿表でその関数を実際に使ってみよう!!
関数の貼り付けには、先ほど作成したマクロがユーザ定義に
入っているのが確認できます!!

下の図はユーザー定義を貼り付けたところ
名簿の印刷範囲の左側にその関数を入れたところ
(実は、次回の印刷ハガキに役立てるのある)

数字は、見事に漢数字に変換されているのがわかるでしょう q(^◎^*)p
次のマクロは、文字数にこだわらない漢数字の変換を考えてみました。
これだと、文字数を限定するより簡単な式になりました!!
Function KanNumber2(MyC)
Dim i As Integer, n As Integer,k As Integer
Dim B As String
Dim A As String
Dim C As String
A = "〇一ニ三四五六七八九"
MyC = Val(MyC)
i = Len(MyC)
B = ""
C = ""
For k = 1 To i
n = Mid(MyC, k, 1)
B = Mid(A, n + 1, 1)
C = C & B
Next
KanNumber2 = C
End Function
|
簡単に説明しておきますネ (^・^)
Aは先ほどと同じで 〇〜九 までの文字を割り当てています
初期設定で変数B、Cに空白を入れておきます
B=""
C=""
Len関数で文字数の習得をします。変数 i に代入します
おなじみステート文 For〜Nextを使用します
kは1から文字数 i まで繰り返します
n = Mid(MyC, k, 1)
参照文字(数字)MyCの左からk番目の文字(数字)を取り出し、変数nに代入します
B = Mid(A, n + 1, 1)
取り出した文字(数字)と漢数字の一致する文字を 変数A から取り出し変数Bに代入
次に、
C = C & B
つまり、Bの文字をCの文字と合わせます
1回目は C="" なので CはBだけの数字が代入されます
2回目以降はその次に(k=2・・・)当てはまる漢数字が
順次つなぎ合わされていきます
どうでしょうか?実際に試してしてみましたか?
さて、こうなりゃついでに、このマクロの応用で、
選択した数字を漢数字にその横に記録するというマクロを考えてみました
Sub test() '文字数に左右されない方法
Dim i As Integer, n As Long, n1 As Long, x As Integer
Dim B As String
Dim A As String
Dim C As String
Dim MyC As Range, RR As Range
Dim Wb As Worksheet 'アドインしたときに必要
’アドインをしないときは、なくても動く!!はずゞ( ̄∇ ̄;)
Set Wb = ActiveWorkbook.ActiveSheet ’アドインしたときに必要になる
A = "〇一ニ三四五六七八九"
Set RR = Selection '範囲を選択
x = RR.Columns.Count ’選択した列数の数
For Each MyC In RR '※1 For Each・・・Next ステートメント
n = Val(MyC) '文字列でも対応
i = Len(MyC) '参照セルに入った数字の桁数(文字数)
B = ""
C = ""
For k = 1 To i
'↓ n1が数字でないときにエラーとなるのでそのときは無視する
On Error Resume Next
n1 = Mid(MyC, k, 1)
B = Mid(A, n1 + 1, 1)
C = C + B
Next 'For に対して Next で返す
MyC.Offset(, x) = C '選択状態の列右横に漢数字がセルに代入
Next (For Eachに対して Next で返す)
Set Wb = Nothing 'メモリクリア
Set RR = Nothing
Exit Sub |
さて、今回はついでに(結構よくばりかもしれないけど・・・)アドインをしてみようと
思います。
アドインをすれば、今作った、関数やマクロがわざわざファイルを開かなくても
使えるようになるというわけですねぇ!!
アドは加える、インは入る。という意味でしょうか?
つまり、エクセルの中に、自分の作ったブックをいれて、共存させるわけですね!!
でも、自分の入れたブックは見えない!!
シートは見えない隠しブックになっているんです!! 【壁】x ・)
ここらへんは要注意!! 理解しておいてください!! q(^◎^*)p
●アドインの登録
作成した関数は、先ほども言ったようにアドインしておけば、いつでも
ユーザー関数から使えるようになるというわけだネ!!
アドインの登録はどうするかと言うと、これが実に簡単なんですな〜!!
実は、保存するときに、ファイルの種類をxlaにするだけ!!

↑のように、勝手に名前を決めて保存するだけ、なにも難しくな〜い!!ノダ
●アドインの確認

さて、さっそく、アドインができているかどうか、確かめてみることにしよう!!
↑の図のようにツール、アドインをクリックする

あ、ありました!!\(^o^)\
さぁ、さきほど保存したアドイン Kannumberがアドインされているのが
わかりますねぇ
使うときは、チェックしておきましょう!!
●アドインの保存先

↑の図のとおり。こんなところが保存先になっている。
アドインの場所をしるのも重要だ!!
保存先は自分でも確認しておこう!!
●プロパティで表題をかえよう!!

↑はさっきと名前が替わっている、日本語で
「漢数字変換マクロ」になっているだろう!!
これは、どこでかわるのだろう!!、たこちゅーも結構わからんかったが、
怪我の功名というか、たまたまファイルのプロパティに名前をつけてあったのが
アドインしたら、その表示になっているのであった!!。(∩_∩)ゞ

↑の保存先をたどって、ファイルを見つける。右クリックで
ショートカットが表示される。中にプロパティがあるので
選択。ファイルのプロパティが表示されるので、ファイルの概要を
↑のようにしてみた。
タイトルがそのままアドインの表題になる!!
プロパティのコメントも、アドインのコメントになるのに注目!!
●ユーザー定義関数
一度エクセルを終了して、再度エクセルを立ち上げ、
関数の貼り付けを見てみましょう、すると、ほ〜ら
ちゃんとユーザー定義の中に関数名であるではあ〜りませんか!!
\(^▽^@)ノ 大成功!!
(下図参照)

●マクロの登録!!
1 ユーザー設定
アドインのマクロの登録をメニューバーなどに、組込みいつでも使えるように
したいものですね。そんなときは、マクロの登録をしてみよう!!

↑の図のように【表示】→【ツールバー】→【ユーザー設定】を選択する

すると↑の図のように、コマンドのマクロを選択!!
ユーザー設定ボタンを選択、これをドラッグすれば、メニューバーなでに
放り込むことができる!!

↑こんな風に入れてみたニコニコマークが入った状態!!!
ユーザー設定を開いたまま、このニコニコマークを選択すると
↓のように【選択したボタンの編集】ができるようになる!!

ここでは、ボタンの種類を、イメージ変更できるし、自分でもボタンが
作成できる!!
2 マクロの登録

さて、マクロの登録をしようとしても、何も入っていない。
それは、そうである。XLAは隠れブックなのだから。
だから、仕方がないので、ここは手作業で入れることにしよう!!
ファイル名は kannumber.xla にした。そのまま入れよう
そして、次に ! を入れてマクロ名を入力する。
マクロ名はtestにしたので、それを入れてみた
kannumber.xla!test とこんな具合だ!!
これを登録しても、マクロ実行からはできないが、
このニコニコマークからは、【test】のマクロが実行できるのだ!!
ただし、マクロを作成するときに一番大事なことは、
当然、ブックが違うため、マクロは、現在開いているブックなどを
認識させてあげなければならない。
だから、Sub test()でも解説しているが
アドインが必要なマクロには
Set Wb = ActiveWorkbook.ActiveSheet
などとして、開いてあるブックを認識させるため示してあげる記述が必要になる
これをしていないと、エラーが表示されるのは、もちろんのことだ!!ヽ(∇⌒ヽ)
要注意である!!
今回は、ちょっと余談に走ってしまった!!が、残念ながら、ここで終了じゃ!!
まぁ、寄り道もいいじゃないですかねぇ〜 こんなものもあるということで、
それに、たこちゅーも、おかげさんで、大変勉強になりました!!
ありがたや〜、ありがたや〜 (-^〇^-)
では、次回お楽しみに〜 ♪(゚・^*)ノ⌒☆
※1
For Each 変数名 In 配列名/オブジェクトコレクション
●配列の各要素に順次代入する場合
●今回のように、セルの範囲をセットした場合
●オブジェクトコレクション、例えばワークブックの集合、ワークシートの集合等
それらの要素に対して、順次繰り返し処理を実行するときには
このステートメントが有効な手段となります。
変数名は、バリアント型、コレクションの場合はオブジェクト型です
【戻る】 |
|