今日は、ユーザー定義関数のご紹介をします。
エクセルは、300以上の関数が用意されていますが、
VBAを使って、オリジナルの関数を作ることもできます。
今回は、生徒さんからの質問というか要望を取り上げてみます。
以下のような表があります。
紙面の都合で、データの数は、11行ですが、実際は、300行ほどあります。

「C列の規格に入っている数字と単位を分離してE列とF列に入れたい。簡単にできないか」というのが、
生徒さんからの要望でした。
データを見ると、単位の文字数もまちまちですし、
数字の桁数もまちまちです。
規則性があれば、最初から何文字とか、最後から何文字とかいうロジックで
対処できますが、今回はそうは行きません。
そこで、データの文字列を頭から1文字ずつ取り出して、
それが数字なのかどうかで、判断するというロジックを採用します。
数字だけを取り出す関数と、文字だけを取り出す関数を作れば、
今回の生徒さんの要望にこたえられそうですね。
これは、やはりVBAを使わないとできませんので、まずは、VBEを起動しましょう。
ALTキー + F11キー を同時に押して、
Visual Basic Editorを起動します。
「挿入」→ 「標準モジュール」とクリックして、
コード入力画面を表示します。
以下のようにコードを記述します。
下の画像のようにしてくださいね。

これで、2つのユーザー定義関数ができました。
あとは、この関数を使って、単位量と単位の列にデータを表示します。
エクセルの画面に切り替えて、E列2行目を選択します。①(下の画像を参照)
関数の挿入ボタンをクリックします。②
関数の分類を「ユーザー定義」にします。③
getNum関数を選択します。④
最後に、OKボタンを押します。

次に表示される画面で、C列2行目を選択してから、OKをクリックします。

すると、E列2行目に 数字が表示されます。

C列2行目の値から、ちゃんと数字だけ取り出されてますね。
それでは、次に 単位を取り出してみましょう。
F列2行目を選択してから、関数挿入ボタンをクリックして、
今度は、getStr関数を選択します。
あとは、最初の関数と同様にやってみてください。

以下の画像のように、kg が、F列2行目に入ります。

あとは、数式のコピーをして完了です。
オートフィルを使いましょう。
E2:F2 を選択して、右下のフィルハンドルを出したら、
12行目までドラッグします。

はい、完成です。

このように、必要に応じてユーザー定義関数を作成すれば、
作業効率もアップしますよ。
だい
エクセルは、300以上の関数が用意されていますが、
VBAを使って、オリジナルの関数を作ることもできます。
今回は、生徒さんからの質問というか要望を取り上げてみます。
以下のような表があります。
紙面の都合で、データの数は、11行ですが、実際は、300行ほどあります。

「C列の規格に入っている数字と単位を分離してE列とF列に入れたい。簡単にできないか」というのが、
生徒さんからの要望でした。
データを見ると、単位の文字数もまちまちですし、
数字の桁数もまちまちです。
規則性があれば、最初から何文字とか、最後から何文字とかいうロジックで
対処できますが、今回はそうは行きません。
そこで、データの文字列を頭から1文字ずつ取り出して、
それが数字なのかどうかで、判断するというロジックを採用します。
数字だけを取り出す関数と、文字だけを取り出す関数を作れば、
今回の生徒さんの要望にこたえられそうですね。
これは、やはりVBAを使わないとできませんので、まずは、VBEを起動しましょう。
ALTキー + F11キー を同時に押して、
Visual Basic Editorを起動します。
「挿入」→ 「標準モジュール」とクリックして、
コード入力画面を表示します。
以下のようにコードを記述します。
Option Explicit Public Function getNum(str As String) As Long Dim i As Integer Dim c As Integer Dim buf As String c = Len(str) buf = "" For i = 1 To c If IsNumeric(Mid(str, i, 1)) Then buf = buf & Mid(str, i, 1) End If Next If buf = "" Then getNum = 0 Exit Function End If getNum = CLng(buf) End Function Public Function getStr(str As String) As String Dim i As Integer Dim c As Integer Dim buf As String c = Len(str) buf = "" For i = 1 To c If Not IsNumeric(Mid(str, i, 1)) Then buf = buf & Mid(str, i, 1) End If Next getStr = buf End Function
下の画像のようにしてくださいね。

これで、2つのユーザー定義関数ができました。
あとは、この関数を使って、単位量と単位の列にデータを表示します。
エクセルの画面に切り替えて、E列2行目を選択します。①(下の画像を参照)
関数の挿入ボタンをクリックします。②
関数の分類を「ユーザー定義」にします。③
getNum関数を選択します。④
最後に、OKボタンを押します。

次に表示される画面で、C列2行目を選択してから、OKをクリックします。

すると、E列2行目に 数字が表示されます。

C列2行目の値から、ちゃんと数字だけ取り出されてますね。
それでは、次に 単位を取り出してみましょう。
F列2行目を選択してから、関数挿入ボタンをクリックして、
今度は、getStr関数を選択します。
あとは、最初の関数と同様にやってみてください。

以下の画像のように、kg が、F列2行目に入ります。

あとは、数式のコピーをして完了です。
オートフィルを使いましょう。
E2:F2 を選択して、右下のフィルハンドルを出したら、
12行目までドラッグします。

はい、完成です。

このように、必要に応じてユーザー定義関数を作成すれば、
作業効率もアップしますよ。
だい

エクセル使って十ウン年、関数作れたんだぁ!
excelVB勉強しなきゃだめでしょうが、目から鱗が・・・でした。
今後も頑張ってください。応援します。
お越しいただき、ありがとうございます。
コメントもありがとうございます。
これからも、おもしろい記事を書けるよう努力しますので、ぜひ、またお立ち寄りください。
よろしくお願いいたします。
単位が二文字までということならRIGHT、LEFT、CODE、IFANDなんかを使えばなんとかできるのでは、、。
な~んてやってみたのですが、未完。トホホ
しかし、楽しいですねEXCELは。(^^;
=LEFT(RIGHT(A2,2))
その隣に(単位)
=IF(AND(CODE(B2)<123,CODE(B2)>96),(RIGHT(A2,2)),(RIGHT(A2,1)))
その隣に(数値)
=VALUE(LEFT(A2,(LEN(A2)-LEN(C2))))
=IF(AND(CODE(B2)<123,CODE(B2)>96),(RIGHT(A2,2)),(RIGHT(A2,1)))
ですね。
お騒がせ致しました。m(_ _)m
表示されません。
再挑戦
=IF(AND(CODE(B2)<123,CODE(B2)>96),
(RIGHT(A2,2)),(RIGHT(A2,1)))
これでどうかな?
96と123で挟んでいるのですけど。
半角表示に問題があるのかも知れませんね。
たくさんの関数をご存じですね。
単位が2ケタというところに着目するなんてさすがです。
念のために、
=IF(AND(CODE(B2)>=96),(RIGHT(A2,2)),(RIGHT(A2,1)))
ですよね。
勉強になりました。
ありがとうございます。
いつもお世話になっております。
これからも、よろしくお願いしますね。
素敵な写真をたくさん紹介してください。