GO BACK

Visual Basic教室 その5


「テキストと日時の操作について」


■テキストを操作する


 今回は、プログラミングをする上で必要な「値の操作」について考えてみましょう。――プログラムではさまざまな値を扱います。単純なプログラムであれば、ユーザーが入力した値をただ足したり引いたり1つにまとめたりといった単純な操作しかしないかも知れません。しかしもっと複雑なことをやらせようとすると、「入力した値の中から必要な部分だけを取り出す」というように、得られた値をさまざまに加工する方法を知る必要が生じます。そうした処理の基本を考えることにしましょう。

 まずは、もっとも多用される値である「テキスト」についてです。テキストについては、それを処理する様々な関数があらかじめ用意されています。「必要な文字数だけ取り出す」という処理については、以下のような関数が用意されています。


Left (テキスト , 文字数)
指定したテキストの左から文字数分だけテキストを取り出して返す。


Right (テキスト , 文字数)
指定したテキストの右から文字数分だけテキストを取り出して返す。


Mid (テキスト , 文字数1 , 文字数2)
指定したテキストの左から《文字数1》文字目より《文字数2》文字分だけテキストを取り出して返す。


 この3つの関数を使えば、あるテキストから任意の文字を取り出すことが可能になります。まあ、Midだけ覚えれば事実上LeftとRightはいらないという考え方もあるのですが、そう難しいものではありませんから一緒に覚えておきましょう。

 では、簡単なサンプルを作ってみましょう。まずフォームの上に、4つのTextBoxと1つのCommandButtonを作成します。これらはそれぞれ以下のようにします。

「Text1」――取り出す元になるテキストを入力するためのもの。少し長めに配置。
「Text2」――取り出したテキストを書き出すためのもの。
「LeftNum」――左からの文字数を入力するためのもの。わかりやすいように(オブジェクト名)をLeftNumと変更しておく。
「RightNum」――右からの文字数を入力するためのもの。これも(オブジェクト名)をRightNumとしておく。
「Command1」――処理を実行するためのボタン。Captionを「取り出し」とでも変更しておこう。そしてダブルクリックしてコードウィンドウを開き、以下のコードを記述する。

Private Sub Command1_Click()
  str1 = Text1.Text
  str2 = ""
  If LeftNum.Text > 0 And RightNum.Text = 0 Then
    str2 = Left(str1, LeftNum.Text)
  End If
  If LeftNum.Text = 0 And RightNum.Text > 0 Then
    str2 = Right(str1, RightNum.Text)
  End If
  If LeftNum.Text > 0 And RightNum.Text > 0 Then
    str2 = Mid(str1, LeftNum.Text, RightNum.Text)
  End If
  Text2.Text = str2
End Sub

 これで完成です。これは、2つの数字を元にしてテキストを取り出すプログラムです。これは、数字に応じて3つの働きをします。LeftNumに数値があり、RightNumが0の場合は左から指定の文字数だけ取り出します。また、LeftNumが0でRightNumにだけ数字が指定してあれば、右から指定の文字数だけ取り出します。そして両方に数字が指定してある場合は、LeftNum文字目の地点からRightNum文字数分だけテキストを取り出します。

 いかがです、テキストの中から必要な部分だけが自在に取りだせることがわかりますね? この3つの関数はテキスト操作の基本中の基本といってよいでしょう。

 このサブルーチンでは一つだけ補足しておくことがあります。If文の条件式に「If LeftNum.Text > 0 And RightNum.Text = 0 Then」というように2つの式がAndでつないで設定されていますね?

 このAndは、「かつ」を意味するものです。つまり「前の式が正しく、かつ次の式も正しい場合は…」ということになるわけです。2つの条件式の両方とも正しいときだけ実行させるわけですね。

 これと対をなすものとしては「Or」というものがあります。これは「または」を意味するものです。「1つ目の式が正しいか、または2つ目の式が正しい場合は…」という場合に使うのです。つまり2つの式のどちらか片方が正しければオッケーというわけですね。




■2つのテキストの比較とテキストの選択


 さて、もう少しテキストの操作を突っ込んで考えることにしましょう。更に複雑な処理をさせようとすると、こんな処理が必要となってきます。「2つのテキストを比較して、何文字目にテキストが含まれているか調べる」「テキストの文字数を調べる」といったことですね。これらもちゃんと関数として用意されています。


Len (テキスト)
指定したテキストの文字数を返す関数。


InStr (テキスト1 , テキスト2)
テキスト1の中に、テキスト2が含まれているかを調べる。含まれていた場合には、何文字目にあるかを示す数字が返る。含まれていない場合は0が返る。


 さあ、ちょっとややこしくなってきました。InStrは少しわかりにくいかも知れないですね。これは「あるテキストが別のテキストの何文字目に含まれているか」を調べるものだと考えて下さい。例えば「InStr("ABCDE", "CD")」なんて場合には、3が返されるというわけです。

 ついでといってはなんですが、テキストの標準的コントロールであるTextBoxのテキストを操作する方法も覚えておきましょう。TextBoxでは、テキストの任意部分を選択して取り出したりすることができます。それら「選択に関する機能」もまとめておきましょう。


「SelStart」――TextBoxで選択されているテキストの始まりを示す。これは何文字目の後が選択されているかで示す。一番最初の部分であれば、「0文字目の後」と考え、0になる。

「SelLength」――TextBoxで選択されているテキストの文字数を示す。選択されていない場合は0になる。

「SelText」――現在選択された状態になっているテキスト部分を示す。これを変更すると選択部分のテキストを書き換えることができる。

「SetFocus」――これはプロパティではなくてメソッド。そのTextBoxにフォーカスを移動する働きをする。これでフォーカスを移動しないと、テキストが選択された状態にならない。


 最後の「フォーカスの移動」というのがちょっとわからないかも知れませんね。Windowsでは、ボタンやフィールドなどをクリックするとそのパーツが選択された状態となりますね? これを「フォーカス」というのです。つまりフォーカスを移動するということは、そのコントロールが選択された状態となるわけです。

 これらを使ってTextBoxの任意の地点を選択させる場合は、まずSetFocusでフォーカスを移動し、そしてSelStartで選択の最初の地点を変更し、最後にSelLengthを変更して指定の文字数だけ選択する、といった手順をとります。まあ、ちょっと面倒臭いですが、手順さえわかれば割と簡単ですよ。

 では、こうした関数やプロパティが使えるようになるとどんなことができるか、サンプルを作ってみましょう。

 このサンプルでは、フォームに3つのTextBoxと2つのCommandButtonを作ります。それぞれ、以下のように作成して下さい。


「Text1」――処理をする元になるテキストを入力するためのもの。少し長めにしておく。
「FindText」――検索文字列を書き込むためのもの。
「ReplaceText」――置換文字列を書き込むためのもの。
「FindBtn」――検索を実行するボタン。Captionを「検索」とでも変更しておこう。そして下のFindBtn_Clickを記述する。
「ReplaceBtn」――置換を実行するボタン。Captionは「置換」としておく。下のReplaceBtn_Clickを記述する。


 以上でフォームは完成。一通りできたらコードウィンドウを開き、検索と置換のコードをそれぞれ記述しましょう。コードは以下で全てになります。

Private Sub FindBtn_Click()
  targetStr = Text1.Text
  findStr = FindText.Text
  strLen = Len(findStr)
  findNum = InStr(targetStr, findStr)
  If findNum = 0 Then
    MsgBox "見つかりませんでした。"
  Else
    Text1.SetFocus
    Text1.SelStart = findNum - 1
    Text1.SelLength = strLen
  End If
End Sub

Private Sub ReplaceBtn_Click()
  If Text1.SelLength = 0 Then Exit Sub
  Text1.SetFocus
  Text1.SelText = ReplaceText.Text
End Sub

 これは、TextBoxのテキストを検索置換するプログラム。まずText1に適当に文章を書き込み、FindTextとReplaceTextにそれぞれ検索文字と置換文字を書き込んでください。そして「検索」ボタンを押すと、検索文字を探してその部分を選択します。もし見つからなければメッセージを表示します。

 そして検索文字が見つかり選択されたら、「置換」ボタンを押すと、選択されたテキスト部分が置換文字に置き換えられます。なかなか実用っぽいでしょ?

 このコードで行なっていることは、ざっと整理するとこのようになります。――まずFindBtn_Clickのサブルーチンですが、こちらは元になるテキストと検索文字をそれぞれ変数に収め、InStrで検索をしています。そして見つからなければMsgBoxを実行し、見つかった場合には、フォーカスを移動して、SelStartでInStrで見つけた場所の1文字前(ここがポイント!)に選択を移動します。そして検索文字の文字数分だけSelLengthを変更して終りです。これで検索文字部分が選択できるのです。

 置換のReplaceBtn_Clickはもっと簡単です。単にフォーカスを移動して、SelTextを置換文字に変更しているだけです。ただし、検索できていない場合を考えて、SelLengthが0なら何もしないで抜け出るようにしています。

 サブルーチンを途中で抜け出して終りにしたい場合、いろいろやり方はありますが「Exit Sub」というのを使うのが一般的でしょう。これを実行すると、その場でサブルーチンを終了してしまうのです。これは覚えておくと大変重宝しますよ。




■日付の値について


 今まで登場していませんが、テキストや数字と並んで非常に多用される値があります。それは「日時に関する値」です。Visual Basicでは、日付や時間に関する値は、特別な値として扱われます。そして日時の値同士を計算したりすることもできるようになっているのです。

 まず、日付についての基本的な扱いから説明しましょう。通常、日付というのは「1999/01/01」というような形で表現されますね? Visual Basicでこのような値を変数に収めたとしても、それは「1999/01/01というテキスト」としてしか認識されません。日付として扱うには、これを日付の値に変換してやらないといけません。では、日付の値を得るための関数を紹介しておきましょう。


Date
とっても単純ですね。これも関数です。これは、現在の日付(つまり今日)を返す関数なのです。

DateValue (テキスト)
これは、"1999/01/01"といったテキストを日付の値に変換する関数です。テキストのフォーマットは、他にも"99/01/01"、"平成11年1月1日"などいくつかあります。

DateSerial (年 , 月 , 日)
こちらは、年月日のそれぞれを数字で指定して日付の値を得る関数です。3つのパラメータにそれぞれ整数を指定すると、その日付の値が返されます。


 これらを使うと、日付の値を得ることができます。日付の値は、値同士で引き算したり、整数を加算減算したりといった演算をすることができます。  たとえば、ある日にちから今日まで何日あるかを計算するサンプルを作ってみましょう。――フォームにTextBoxを1つ(Text1)、CommandButtonを1つ(HowManyDaysBtn)作成して下さい。そして、ボタンに以下のようなサブルーチンを記述しましょう。

Private Sub HowManyDaysBtn_Click()
  day1 = Date
  day2 = DateValue(Text1.Text)
  days = day1 - day2
  MsgBox "今日までの日数は、" & days & "日です。"
End Sub

 完成したら、実行してみましょう。Text1に「1999/01/01」といったフォーマットで日付を入力し、ボタンを押すと、その日から今日までの日数を計算して表示してくれます。今日よりも先の日付を入力すると、マイナスの日数で計算されます。いろいろと試してみましょう。

 このサブルーチンを見ればわかるように、日付の計算は実に簡単です。DateやDateValueなどで日付の値を取り出し、「day1 - day2」というように引き算するだけで日数が得られるのです。

 これで簡単な日付計算はできるようになりましたが、この他、覚えておくと便利な関数をいくつかあげておきましょう。


Year (日付)
日付の値から年の数字を返す関数。

Month (日付)
日付の値から月の数字を返す関数。

Day (日付)
日付の値から日の数字を返す関数。

WeekDay (日付)
日付の値から曜日の数字を返す関数。この値は、日曜が1となり、以下、月曜=2、火曜=3…として割り振った1〜7の整数になる。




■時刻の値について


 日付の値があるのですから、もちろん時刻の値だってあります。というより、両者は同じものなのです。先にあげたのは、日付に関係したものだけまとめてピックアップしておいたというわけです。

 時刻に関する関数も、基本的な扱いは日付とほとんど変わりません。ですからだいたい見ただけで理解できるでしょう。


Time
これは文字通り、現在の時刻の値を返す関数です。ただしこれは時刻だけで日付の情報はありません。

Now
これは、日付と時刻の値全てを持った形で現在の日時の値を返します。要するに、DateとTimeを一緒にしたものと思えばいいでしょう。

TimeValue (テキスト)
これは、「00:00:00」といったテキストを時刻の値に変換して返す関数です。

TimeSerial (時 , 分 , 秒)
これは、時・分・秒を示す3つの整数を元に時刻の値を返す関数です。

Hour (時刻)
これは時刻の値から「時」の整数だけを返すものです。

Minute (時刻)
これは時刻の値から「分」の整数だけを返すものです。

Second (時刻)
これは時刻の値から「秒」の整数だけを返すものです。


 まあ、ざっとこんな感じでしょうか。基本的には、日付の関数とほとんど同じ感覚で使えることがわかるでしょう?

 では、これもちょっとしたサンプルを作ってみましょう。フォームに2つのCommandButtonを作成して下さい。名前はそれぞれ「MinutesBtn1」「MinutesBtn2」としておきましょう。そしてそれぞれに、以下のようなサブルーチンを書き込みます。

Private Sub MinutesBtn1_Click()
  time1 = Now
  time2 = Date
  time3 = DateDiff("s", time2, time1)
  MsgBox "今日の0時0分からの秒数は、" & time3 & "秒"
End Sub

Private Sub MinutesBtn2_Click()
  time1 = Time
  h = Hour(time1)
  time2 = TimeSerial(h, 0, 0)
  time3 = DateDiff("s", time2, time1)
  MsgBox "今の0分からの秒数は、" & time3 & "秒"
End Sub

 これは、それぞれ「今日の0時0分から現在まで」「今の時間の0分から現在まで」の秒数を計算して表示するものです。ボタンをクリックすると、ちゃんと秒数が計算されるのがわかりますね?

 日付と同様、時刻もやっぱり足し算や引き算といった計算をすることができます。が、日付の時はまあ「引けば日数が得られるだろう」ぐらいにはわかるでしょうが、時刻まで出てくると、一体引いた答えが何の単位なのか、わけがわからなくなってきます。

 そうなると、+−で直接計算させるのはちょっと大変になります。このようなときは、時間計算のための関数を利用するのが一般的です。


DateAdd (単位 , 数値 , 日時の値)
指定した日時の値に、《単位》で指定した日時の単位で《数値》分だけ加算をする。

DateDiff (単位 , 日時の値1 , 日時の値2)
日時の値1から日時の値2まで、《単位》で指定した日時単位でどれだけ間隔があるかを計算する。

《単位》で使える主な日時単位
「yyyy」「y」――年。yは純粋に365日=1年で計算したもの。yyyyは「××年がかり」という値。
「m」――月。
「ww」「w」――週。wは7日=1週間で計算したもの。wwは「××週間がかり」という値。
「d」――日。
「h」――時。
「m」――分。
「s」――秒。


 ちょっとわかりにくいかも知れませんね。ある日時に決まった時間単位で加算をしたり、2つの日時の差を決まった時間単位で計算したりするときはこのような関数を使います。

 例えば、先のサブルーチンでは、「DateDiff("s", time2, time1)」なんて具合に実行をしていますね? こうすると、time2からtime1まで、何秒あるか(単位が "s" だから)を計算することができるというわけです。

 以上、おおまかにですが日時の使い方をまとめてみました。日時は普通の値と違って、基本的に「全ての計算は専用の関数を使う」というように考えるとよいでしょう。少し面倒臭いですが、使いこなせるようになるとプログラミングの幅はぐっと広がりますよ。


GO NEXT


GO HOME