goo blog サービス終了のお知らせ 

パソコンカレッジ スタッフのひとりごと

パソコンスクールのスタッフが、
初心者から上級者まで役立つ情報をお伝えします。

ユーザー定義関数を作ってみよう(Excel全バージョン共通)

2009-05-30 13:10:28 | ExcelVBA
今日は、ユーザー定義関数のご紹介をします。

エクセルは、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行目までドラッグします。





はい、完成です。





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




だい

コメント (10)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 大きさの違う図形を連続挿入... | トップ | 住所から市町村名・番地を取... »
最新の画像もっと見る

10 コメント

コメント日が  古い順  |   新しい順
知らなかった( ̄□||||!! (まちゃ)
2009-05-30 14:17:45
初めまして、gooのあしあとランキングから寄ったんですが、知りませんでした・・・

エクセル使って十ウン年、関数作れたんだぁ!
excelVB勉強しなきゃだめでしょうが、目から鱗が・・・でした。

今後も頑張ってください。応援します。
返信する
まちゃさんへ (だい)
2009-05-30 16:38:41
はじめまして。

お越しいただき、ありがとうございます。
コメントもありがとうございます。

これからも、おもしろい記事を書けるよう努力しますので、ぜひ、またお立ち寄りください。

よろしくお願いいたします。
返信する
またしても (愚石)
2009-05-30 23:10:38
疼くようなお題!
単位が二文字までということならRIGHT、LEFT、CODE、IFANDなんかを使えばなんとかできるのでは、、。
な~んてやってみたのですが、未完。トホホ
しかし、楽しいですねEXCELは。(^^;
返信する
こんなになりました (愚石)
2009-05-31 00:01:08
まず隣のセルに
 =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))))
返信する
文字の入力・変換(Word初心者) (fuworld)
2009-05-31 10:17:03
時々自分に出来そうな内容を見ては教えていただいています。私の様な初心者にはブログ教室GOODです、またお邪魔します。<Y先生、H先生スタッフ皆さんに宜しく>
返信する
訂正 (愚石)
2009-05-31 14:59:44
単位を切り出すにはcode123未満も必要ですね。

=IF(AND(CODE(B2)<123,CODE(B2)>96),(RIGHT(A2,2)),(RIGHT(A2,1)))
 
ですね。
お騒がせ致しました。m(_ _)m
返信する
再訂正 (愚石)
2009-05-31 15:07:56
なぜか、IFANDの相棒code(b2)<123の部分が
表示されません。

再挑戦

=IF(AND(CODE(B2)<123,CODE(B2)>96),
(RIGHT(A2,2)),(RIGHT(A2,1)))

これでどうかな?

返信する
お騒がせ致します (愚石)
2009-05-31 15:13:01
どうしても 何故かCODE(B2)>123の部分が表示されません。
96と123で挟んでいるのですけど。
半角表示に問題があるのかも知れませんね。
返信する
愚石さんへ (だい)
2009-06-01 08:31:09
一緒に考えていただき、ありがとうございます。

たくさんの関数をご存じですね。

単位が2ケタというところに着目するなんてさすがです。


念のために、
=IF(AND(CODE(B2)>=96),(RIGHT(A2,2)),(RIGHT(A2,1)))

ですよね。

勉強になりました。
ありがとうございます。
返信する
fuworldさんへ (だい)
2009-06-01 08:32:25
コメントありがとうございます。

いつもお世話になっております。
これからも、よろしくお願いしますね。

素敵な写真をたくさん紹介してください。
返信する

コメントを投稿

ExcelVBA」カテゴリの最新記事