Visual Basic 入門講座
VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第6回 文字・数値・日付のあつかい

この記事が対象とする製品・バージョン (バージョンの確認方法)

VB2019 Visual Basic 2019 ◎ 対象です。
VB2017 Visual Basic 2017 ◎ 対象です。
VB2015 Visual Basic 2015 ◎ 対象です。
VB2013 Visual Basic 2013 ◎ 対象です。
VB2012 Visual Basic 2012 ◎ 対象です。
VB2010 Visual Basic 2010 ◎ 対象です。
VB2008 Visual Basic 2008 ◎ 対象です。
VB2005 Visual Basic 2005 ◎ 対象です。
VB.NET 2003 Visual Basic.NET 2003 △ 対象外ですがほとんどの操作は同じなので参考になります。
VB.NET 2002 Visual Basic.NET (2002) △ 対象外ですがほとんどの操作は同じなので参考になります。
VB6対応 Visual Basic 6.0 × 対象外です。

概要

・プログラムの中では文字列・数値・日付は別々の方法であつかう必要がある。

・ " で囲まれた部分は文字列となる。

・ # で囲まれた部分は日付となる。

・文字列・数値・日付の基本的なあつかい方

 

1.型

 

プログラムの経験がほとんどない方は意外に思われるかもしれませんが、プログラムの世界では文字と数値と日付は明確に区別されます。たとえば、文字をデータベースに書き込むときと、日付をデータベースに書き込むときとでは違う仕組みを使います。日付を書き込む仕組みを使って文字を書き込もうとすると多くの場合エラーになります。

そのため、プログラムの中で文字・数値・日付をあつかう場合(つまりほとんどの場合)はこれらの取り扱いをちゃんと知っていなければなりません。

今回はこのような文字・数値・日付の取り扱い方の違いと、簡単な取り扱い例を説明します。

このような区別を「型」(かた)を呼びます。データ型とも言います。

型には文字・数値・日付の他にもたくさんのものがあります。また、「数値」と一口に言ってもコンピューター内部の処理の違いによって細かくはいくつかの型に分かれます。(整数型・長整数型・十進型・浮動小数点型など)。

「文字」についても文字型と文字列型は別の型です。「文字」といった場合は1文字、「文字列」と言った場合は1文字以上の連続する文字を指します。プログラムの中で扱う文字は99%「文字列」です。「文字列」という言葉は重要なので覚えておいてください。

 

初心者の方にはなぜ型を区別しなくてはならないのか疑問に感じる方もいらっしゃるでしょう。確かにこれらを区別しないという方法もあります。しかし多くのプログラマたちはこれらを区別した方がプログラムにとって大きなメリットがあると考え、現在VBを含めほとんどのプログラム言語では型を区別します。

型を区別する最大のメリットは間違いの防止です。今の時点ではピンとこないかもしれませんが、VB自体がこれらを区別してあつかうときに最高の性能・機能を発揮するように作られているので「郷に入れば郷に従え」です。とりあえず、メリットが見えなくても割り切って理解してみてください。

発展 発展学習  -  区別する別の理由

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

コンピューター上では1文字1文字に「文字コード」と呼ばれている数値が割り当てられており、たとえば「A」は65, 「B」は66といった具合に認識されています。「A」という文字をどこかに保存してから後で取り出す場合、コンピューターには単なる「65」という数字にしか見えず、これを文字として扱いたいのか数値として扱いたいのかの情報がないと「A」として処理すべきか、「65」として処理すべきか区別がつきにくいのです。

日付の場合も実は内部では数値として管理されています。究極的にはコンピュータはすべてのものを「0」か「1」のかたまりとして処理していることがこの遠因になります。

 

2." は文字列を作る

 

今回は少し初心に戻って、素朴なプログラムの性質を考えて見ます。

一緒にプログラムしながら読んでみてください。

 

まずは次のプログラムを見てください。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox("こんにちは")

End Sub

■リストA-1

これはもうお分かりと思いますが、実行すると画面に「こんにちは」と表示されます。実行するにはフォームにボタンを1つ貼り付けてください。

 

このプログラムは次のように書くこともできます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim st As String
    st = "こんにちは"
    MsgBox(st)

End Sub

■リストA-2

実行するとリスト1とまったく同じ動作をすることがわかります。

st = "こんにちは"
MsgBox(st)

この部分をみれば、特に知識がなくても感覚的に納得できますよね。stが「こんにちは」という文字列を表しているわけですね。

ここで stは変数と呼ばれるもので、x でも y でも hello でも自分で好きな名前を付けることができます。名前をつけているのが1行目のDim st As Stringの部分です。変数については別の機会に説明しますのでここでは1行目は特に気にしないで下さい。今回は1行目のDimではなく「こんにちは」などの文字の方がテーマです。

発展 発展学習  -  Dim st As String の意味

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

でも、意欲的な方のために少しだけ説明しておきます。

変数は使用する前に、その変数を使用することを準備をすることになっています。これを宣言といいます。Dim (読み方:Dim = ディム)がこれに該当します。

そして、このとき変数の型も示す必要があります。As String (読み方:As String = アズ ストリング)はそれが文字列型であることを示しています。

変数については 初級講座第4回 変数と型 で説明しています。

 

さて、プログラムをさらに改造して次のようにしてみてください。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'これはおかしな例です。
Dim st As String
st = "こんにちは"
MsgBox("st")

■リストA-3

前の例との違いはMsgBox(st)のStの前後に " が付いている点です。この状態で実行すると今度は「こんにちは」ではなく、「st」と表示されます。

このように 記号 " (ダブルクォーテーション)には特別な意味があります。 " ではさまれているものは、意味のない文字列 としてあつかわれるのです。

ですから、次のプログラムでは「MsgBox」と表示されます。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


MsgBox("MsgBox")

■リストA-4

一方、次のプログラムはエラーになります。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'これはエラーです。
MsgBox(MsgBox)

■リストA-5

リストA-4ではMsgBoxの前後が " でくくられているのでMsgBoxは意味のない文字列として扱われますから問題ありません。リストA-5ではMsgBoxの前後に " がありませんので MsgBoxは意味のある命令として扱われます。そうするとMsgBox(MsgBox)というプログラムはキーワードの使い方がおかしいのでエラーになってしまうわけです。

メモ メモ  -  コメント

プログラム内で ' から始まる行は コメント となり緑色で表示されます。リスト A-5 の最初の行はコメントです。

コメントはプログラムの一部ではなく、人間用のメモです。プログラムではないので実行されることはなく、何でも書くことができます。

 

別の視点でも眺めてみましょう。次の例はエラーになります。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'これは悪い例です。
Dim st As String
st = こんにちは
MsgBox(st)

■リストA-6

どうしてエラーかというと、「こんにちは」に " がついていないので、「こんにちは」が意味のある命令として解釈されるからです。しかし実際にはVBには「こんにちは」という命令はありません。ですからエラーになるのです。

この " の性質を初級プログラマーはよく覚えておいてください。

 

3. & は文字列をつなぐ

 

では、次のプログラムを見てください。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim st1 As String
    Dim st2 As String
    Dim st3 As String

    st1 = "源"
    st2 = "義家"
    st3 = "頼朝"

    MsgBox(st1 & st2)
    MsgBox(st1 & st3)

End Sub

■リストB-1

このプログラムを実行すると、はじめに「源義家」と表示され、次に「源頼朝」と表示されます。

源義家は平安時代の武将で、後三年の役で活躍しました。義家の孫の孫が平家を打ち破って鎌倉幕府を開いた源頼朝です。

リストB-1を見れば分かるとおり、表示する文字列は 記号 & (「アンパサンド」と読む」)を使ってプログラム中で合体させています。

変数と文字列

文字列の結合

■図1

このように & を使うと文字列を結合させることができるのですが、これも感覚的に特に難しいということはないでしょう。

リストB-1は次のように書くこともできます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox("源" & "義家")
    MsgBox("源" & "頼朝")

End Sub

■リストB-2

もちろん、リストB-2のようなプログラムを実際に見かけることはないでしょう。"源" & "頼朝" と書くくらいならはじめから"源頼朝"と書くからです。リストB-2はあくまでのこういうこともできるというサンプルです。

さて、もう少し複雑にした次の例を考えて見ましょう。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim st1 As String = "義家"
    Dim st2 As String = "頼朝"
    Dim st3 As String = "平安"
    Dim st4 As String = "鎌倉"

    MsgBox("源" & st1 & "は" & st3 & "時代に死にました。")
    MsgBox("源" & st2 & "は" & st4 & "時代に死にました。")

End Sub

■リストB-3

こうなってくると、どれが " の中にあって どれが " の外にあるのかとても分かりにくいですね。初心者はこのようなときに " の使い方を間違ってよくエラーになるようです。皆さんも気をつけてください。VB2005以上ならば " の中にある文字は茶色く表示されるので少しはわかりやすくなっています。

文字列の結合

■図2

文字列の結合が複雑になってくるとプログラムが見にくくなってくるので、VB2015以上では文字列補間という機能が導入され、さらに簡単な書き方ができるようになっています。

次の例はリストB-3と同じ結果になります。

 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim st1 As String = "義家"
    Dim st2 As String = "頼朝"
    Dim st3 As String = "平安"
    Dim st4 As String = "鎌倉"

    MsgBox($"源{st1}は{st3}時代に死にました。")
    MsgBox($"源{st2}は{st4}時代に死にました。")

End Sub

■リストB-4

文字列補間機能を使う場合、& を使わないで文字列を結合できます。リストB-4のように文字列の中に { } で囲んで変数を埋め込むことができます。

先頭の " の前に $ が付いているのがポイントで、$をつけると、文字列補間機能を使用するという意味になります。$ をつけないと通常の文字列になるのでこの例では「源{st1}は{st3}時代に死にました。」などと表示されます。

 

文字列の結合について、最後にもう1点だけ。 + は & と同じく文字列を結合する機能があります。しかし、たし算の「+」と紛らわしいので、できるだけ & を使うことをお勧めします。

4.改行

Visual Basic 2015以上では次のようにして改行もできます。

VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox("あいうえお
かきくけこ
さしすせそ"
)

End Sub

■リストC-1

文字列の改行

バージョンを重ねるごとに少しずつ便利になっていっています。

VB2013以前では Environment.NewLine (読み方:Environment = エンバイロメント、NewLine = ニューライン)という値を & で結合すると文字列の途中で改行できます。Environment.NewLineのことをはじめて知ったとしても、これがEnvironmentオブジェクトのNewLineプロパティであるというということは前回の説明を読んでいれば気がつけるかもしれませんね。この手法はVB2015以上でも使用できます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox("あいうえお" & Environment.NewLine & "かきくけこ" & Environment.NewLine & "さしすせそ")

End Sub

■リストC-2

VB2010以上だとある程度自由にプログラムを改行できるので次のように書くと少し見やすくなります。

 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox("あいうえお" & Environment.NewLine &
           "かきくけこ"
& Environment.NewLine &
           "さしすせそ"
)

End Sub

■リストC-3

メモ メモ  -  文字列中の改行とOSの関係

Environment.NewLineの代わりにvbCrLf(読み方:vbCrLf = ブイビーシーアールエルエフ)やvbNewLine(読み方:vbNewLine = ブイビーニューライン)という定数を使って改行することもできます。この3つの中ではvbCrLfを使うプログラマの方が多数派のように感じますが、vbCrLfはOSごとの改行コードの違いに対応していません。Windowsの改行コード(CR + LF)を使って改行します。vbNewLineだとVisual Basicの開発に利用しているOSによって適宜改行コードを切り替えてくれるようですが、Windowsで開発するとMacやLinuxで実行してもWindowsの改行コードを使用する、Macで開発するとWindowsやLinuxで実行してもMacの改行コードを使用することなのかなと思います。

VB2015以上で使用できるプログラム内で改行する方式はvbCrLfまたはvbNewLineと同じ仕様のようです。(これは観察に基づいた私の推測です。)

一方、Environment.NewLineはおそらく、どのOSで実行しても適切に改行コードを選択してくれるようです。

こう考えると、改行で最も良い手段は Environment.NewLineということになりそうですが、そんなにいろいろなOSで使うプログラムを作ることはあるでしょうか。

以上は、私は実際に試してみたわけではなくドキュメントの記載からこうなのだろうなと理解しているところです。それから他にも改行する手段はいくつかあります。

参考:

その他の定数(vbCrLF と vbNewLineの説明があります)
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/miscellaneous-constants

Environment.NewLine プロパティ
https://docs.microsoft.com/ja-jp/dotnet/api/system.environment.newline

 

5.数値

 

数値をあつかう場合は文字列と違って " をつけません。

たとえば、次のプログラムは正常に動作します。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox(627)

End Sub

■リストD-1

このプログラムを実行すると「627」と表示されます。

 

このプログラムは次のように書くこともできます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim x As Decimal = 627
    MsgBox(x)

End Sub

■リストD-2

Dim x As Decimalの方は今回のテーマではないのであまり気にしないでください。簡単に説明すると数値型の変数 x を宣言しています。 

数値型にも何種類かあるのですが、Decimal (読み方:Decimal = デシマル)で宣言すると数値型の中でも「十進型」(じゅっしんがた)という型になり、整数も小数も表現できる変数になります。

 

数値の場合は +, -, *, / などを使って計算することもできます。 キーボードには掛け算の「×」と割り算の「÷」がないので代わりに * が掛け算、 / が割り算を表しています。

これらの記号を使った例は次の通りです。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim x As Decimal = 815.6D

    MsgBox(x + 3)
    MsgBox(x - 3)
    MsgBox(x * 3)
    MsgBox(x / 3)


End Sub

■リストD-3

変数 x を Decimal で宣言しているので小数もちゃんと扱えます。

ただ、よくみると x に 815.6 をセットするときに、後ろに「D」がついているのがわかります。

このDは 815.6 という値を Decimal として扱うということをVBに指示する意味です。このように型を明示する意図で使う文字がいくつかあり「型宣言文字」と呼ばれます。

数値にDがついている

多分これを読んでいる皆さんの環境では D を取り除いてもプログラムは正常に動作すると思います。ためしにDを取ってみてください。

中には D を取るとエラーになるという人もいると思います。

これがいるかいらないかは設定でオン/オフできて、この設定を Option Strict (読み方:Option Strict = オプション ストリクト)を呼びます。既定値はオフなので、多くの人は D は不要でしょう。

これは、どこまで厳密に型を決めなければいけないのかプログラマーによって好みが違うので設定で切り替えられるようになっているのです。

厳密に型を決めることを好むプログラマーは「815.6」という値がいくつかある数値型の中で何型であるのか明確にすべきだと考えます。D をつけると Decimal、つまり十進型であることが明確になります。

型を明確にするメリットはいろいろあるのですが、ひとまずはこういう機能があるというところだけ覚えておいてください。

なお、プロの現場では型を明確にすることが好まれておりOption StrictをOnに設定するのが圧倒多数です。

操作方法 Option Strictの確認方法

[プロジェクト]メニューから (プロジェクト名)のプロパティ (たとえば WindowsApp1のプロパティ)をクリックするとプロジェクトの設定画面が表示されます。

左側のタブでコンパイルを選択すると Option Strict の設定を確認できます。

Option Strictの設定の場所

 

話を元に戻しましょう。

+, -, *, /のような計算記号のことをVBでは「演算子」(えんざんし)と呼びます。VBで使える計算用の演算子の表を載せておくので参考にしてください。

演算子 通称 機能
+ プラス・たす たし算
- マイナス・ひく ひき算
* アスタリスク・かける かけ算
/ スラッチュ・わる わり算
^ キャップ・べき べき乗(累乗)を計算する。
= イコール・は(わ) 等しいか調べる
\ えん・バックスラッシュ わり算をして、「あまり」を無視する。
mod モッド わり算をして、「あまり」を返す。

これ以外にも & や Is など計算以外の用途で使う演算子があります。

 

6.# は日付を作る

 

6−1.日付と表示形式

日付と時刻を表現する場合日付型を使用します。

プログラム内で日付と時刻を指定するには 月/日/年 の順で数字を記述して # で囲みます。次のようにします。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox(#6/27/2020#)

End Sub

■リストE-1

VB2015以降では 年/月/日 の順でも書けます。年は西暦の下2桁を使用することもできますが何年の何月何日なのかとてもわかりにくいので西暦4桁で書くことを強くお勧めします。

 

次に 初心者に注意して欲しいわかりにくい点を説明します。日付や時刻を画面に表示したり、印刷したりなど人間向けに表示するとき、厳密にはそれは日付型ではなく文字列型です。

たとえば、2020年6月27日という日付は1つしかありませんが、これを画面に表示するための形式はたくさんあります。いくつか例を挙げてみます。

このような形式を書式と呼びます。

VBの日付型はこのような表示用の書式とは無関係で、1つしかない日付の値自体を表現しています。画面などに表示する日付は日付型ではなく文字列型です。

日付型はプログラム内での存在

日付の値をどのような書式で表示するかは表示するときにプログラマーが指定します。

特に指定をしなかった場合はプログラムを実行しているユーザーのWindowsのコントロールパネルの地域と言語の設定に依存します。

コントロールパネルの地域と言語の設定

プログラムを作成したユーザーではなく、実行しているユーザーである点に注意してください。

つまり、プログラマーが書式を指定しなかった場合、どのように表示されるかプログラマーには事前には予測できないということです。

博士のワンポイントレッスン 「なんでわざわざ日付型?」
V太 V太:ちょとまて、ちょとまて!意味がわからないよ。わざわざ日付型なんて使わないで、最初から文字列で"2020/06/27"と書けばいいんじゃないの?どのように表示されるかもはっきりしているし。
B子 B子:うーん。確かにそうかも。博士、どういうことですか?
V太 博士:うーむ。ちょっと考えてみて欲しい。日常生活の中で「日付」ってどういう風につかっているかのぉ?
B子 えっと、「明日は晴れ」とか、「来週は遠足」とか、「月末は忙しい」とか、「1週間後には返してください」とか、「去年は暑かった」とか、「後300日で東京オリンピック」とか?
V太 「明日」、「来週」、「月末」、「1週間後」、「去年」、「後300日」
V太 日付型の機能を使うとそういった日時や期間を簡単に求めることができるのじゃ。文字列にはそういう機能はない。だから、文字列で"2020/06/27"とプログラムしてしまうと、1週間後が何月何日か求めるプログラムを作るのはすごく大変なのじゃ。日付型だと AddDaysメソッドを使って1週間後の日付は簡単に求められるぞ。AddDaysの使用例は後で紹介しよう(リスト H-3)。
B子 なるほどねぇ。でも、実際に使ってみるまではピンとこないかも。
博士 他にも日付や時刻ならではの機能というのは結構いっぱいある。日付や時刻がプログラムの中にでてくるのだったら文字列ではなく日付型を使うようにの。

 

 

6−2.書式指定

 

表示するときに書式を指定する方法はいくつかあります。代表的なのはToStringメソッド(読み方:ToString = トゥーストリング)を使用する方法です。

日付や文字列や数値はすべてオブジェクトであり、メソッドやプロパティを持っています。ToStringはその1つです。

下記の例では変数に格納した日付を異なる書式で表示しています。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim day As Date = #6/27/2020#

    '書式指定なし。Windowsの設定で書式化されます。
    MsgBox(day)

    '2020年06月27日
    MsgBox(day.ToString("yyyy年MM月dd日"))

    '20-06-27
    MsgBox(day.ToString("yy-MM-dd"))

End Sub

■リストE-2

この例のように日付型の変数はAs Dateで宣言します。

書式は引数に独特の文字列で指定します。この文字列のことを書式指定文字列といいます。

書式指定文字列には、yyyyであれば西暦で4桁の年、MMは西暦で2桁の月、Mは西暦で1桁の月のように定められているものを組み合わせて使用します。

よく使う日付の書式は次の表のとおりです。曜日も書式で表現している点は覚えておくと良いと思います。

yyyy 年を4桁 例:2020 HH 24時間制の時間を2桁 例:15
yy 年を2桁 例:20 H 24時間制の時間を1桁または2桁 例:15
MM 月を2桁 例:06 hh 12時間制の時間を2桁 例:03
M 月を1桁または2桁 例:6 h 12時間制の時間を1桁または2桁 例:3
dd 日を2桁 例:27 mm 分を2桁 例:05
d 日を1桁または2桁 例:27 m 分を1桁 例:5
dddd 曜日 例:土曜日 ss 秒を2桁 例:46
ddd 曜日の短縮形 例:土 s 秒を1桁 例:46

・書式指定ではアルファベットの大文字と小文字が区別されるので注意してください。

・「H」だけや「d」だけのように、1文字だけの書式は指定できません。1文字だけ指定する必要がある場合は特別に「%H」や「%d」のように前に「%」を付けます。

参考:カスタム日時書式指定文字列

https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings

 

メモ メモ  -  標準の書式指定文字列

本文で紹介しているカスタムの書式指定文字列の他に、標準の書式指定文字列というものもあり、もっと簡単に書式を指定できます。しかし、どのような形式になるのか私にはわかりにくいため、私は使用していません。他のプログラマーが使っているところも私は見かけないです。

書式指定文字列が1文字の場合、それは標準の書式指定文字列です。2文字以上ある場合はカスタムの書式指定文字列です。

参考:標準の日時書式指定文字列

https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-date-and-time-format-strings 

 

書式指定文字列の中では定義されていない文字列はそのままその位置に出力されます。たとえば、「中」・「学」・「校」という文字は書式として定義されていないため、day.ToString("中学校") は day が何月何日でも「中学校」と表示されます。

day.ToString("中MM学校") だと MM は月2桁と定義されているため、たとえば、「中08学校」となります。すべての漢字を含めほとんどの文字は書式として定義されていないため自由に使用できます。「年」「月」「日」「時」「分」「秒」も自由に使用できます。

\ は特別な効果があり、直後の文字を書式指定文字ではない通常の文字として扱います。たとえば、ToString("yyyy")は年4桁になりますが、ToString("\y\y\y\y")はそのまま「yyyy」と出力されます。

メモ メモ  -  エスケープシーケンス

この \ のように、特別な意味を打ち消す文字列の並べ方をエスケープシーケンスと呼びます。「エスケープ」「エスケープする」などと使います。 \ は書式指定文字列以外でもエスケープシーケンスでよく使われる文字です。 日本語環境ではこの文字は通貨単位の円マークで表示されますが、英語環境ではバックスラッシュで表示されます。

例:そこのMはエスケープしておいてください。 → 意味:Mの前に \ をつけてください。

日付の区切り文字である / は文化によっては - として出力される場合があると思います。どの環境でも確実に / と表示するためにはToString("yyyy\/MM\/dd")のようにエスケープを付けて \/ と書きます。

時刻の区切りによく使われる : についても同様です。

 

7.和暦と文化

 

日付の表示や値は文化により異なります。

日本人は西暦としては一般的にグレゴリオ暦を使用しており、これは世界の多数派です。

しかし、世界にはそうでない文化もあります。

たとえば、日本人にとっての2020年6月27日は、驚くべきことにサウジアラビアでは1441年11月6日です。

また、同じ日付を日本人は 令和2年6月27日 とも表現するかもしれません。これは元号のことを知らない外国人にはやはり驚かれるでしょう。

メモ メモ  -  イスラム暦 ヒジュラ

サウジアラビアの暦はヒジュラ暦と呼ばれます。イスラム教の創始者ムハンマドと信者たちがメッカから移住した西暦622年がヒジュラ元年です。1年はおおむね354日なので、日本で使われている1年が365日のカレンダーからどんどん日付がずれていきます。そういうわけでグレゴリオ暦2020年6月27日はヒジュラ暦1441年11月6日となります。

なお、2018年頃にサウジアラビアではグレゴリオ暦の採用を決定したそうですので、今では本文中にある2020年6月27日はサウジアラビアでも2020年6月27日と表記するのかもしれません。正直実情はわからないです。

 .NETは世界中で使用できるように設計されており、この「文化」を設定などで指定したり変更したりできます。プログラム自体はグレゴリオ暦で記述することになっているので、世界中どこに言っても変わりません。それを表示するときはそれを実行しているコンピューターの文化や、プログラムで指定した文化で表示されます。だから、サウジアラビア用のWindowsでMsgBox(#6/27/2020#) を実行すると、おそらく「1441/11/6」と表示されるはずです。

 

日本の文化を適用すれば平成や令和などの和暦をVBで扱うことも可能です。ToStringメソッドの第2引数には文化を指定できるので、ここで日本の和暦の文化を指定しましょう。

ただ、このプログラムは入門講座としては少し高度なので、理屈の説明はここでは割愛します。

プログラムは次のようになります。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim day As Date = #6/27/2020#

    '日本の文化を取得して、カレンダーに和暦を指定
    Dim culture As Globalization.CultureInfo = New Globalization.CultureInfo("ja-JP", True)
    culture.DateTimeFormat.Calendar = New Globalization.JapaneseCalendar()

    '02/06/27 (yyyyが西暦ではなく令和の年になる)
    MsgBox(day.ToString("yyyy/MM/dd", culture))

    '令和2年6月27日 (ggで「令和」)
    MsgBox(day.ToString("ggy年M月d日", culture))

End Sub

■リストF-1

日本の和暦の文化を適用した状態では yyyy は和暦の年になります。yy と書いても同じです。「平成」や「令和」などの元号の名称はggです。

なお、2019年を和暦で表示すると令和1年ではなく、令和元年になります。ちなみに、令和は2002年に.NETがリリースされてから世界で始めて発生した暦の変更でした。

 

8.日付についてその他

 

8−1.現在日付

プログラム中でNow(読み方:Now = ナウ)は常にその時の日付を表しているので重宝します。使い方も簡単です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim day As Date = Now
    MsgBox(day)

End Sub

■リストG-1

コンピュータが管理している現在の日付・時刻のことを「システム日付」、「システム時刻」とも呼びます。

 

8−2.時刻

「日付」という言葉はVBでは時刻も含みます。たとえば、現在の時間と分と秒を表示させるには、先ほどの書式指定を使って次のようにします。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox(Now.ToString("yyyy\/MM\/dd HH\:mm\:ss"))
    MsgBox(Now.ToString("HH\:mm\:ss"))

End Sub

■リストG-2

 

9.メソッドとプロパティ

 

既にいくつか登場しましたが、文字列・数値・日付もメソッドとプロパティをもっています。

たとえば、文字列のLengthプロパティ (Length = レンクス)は文字列の文字数を表します。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox("こんにちは".Length)

End Sub

■リストH-1

この例では、「5」と表示されます。

ToUpperメソッド (ToUpper = トゥーアッパー)は英語の小文字をすべて英語の大文字に変換します。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox("Hello".ToUpper)

End Sub

■リストH-2

この例では、「HELLO」と表示されます。

 

日付型にもさまざまな機能があります。

代表的な利用例をいくつか紹介します。

 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim testDay As Date = #6/27/2020#

    '次の日→ 2020/6/28
    Dim nextDay As Date = testDay.AddDays(1)
    MsgBox(nextDay)

    '日付だけ→ 27
    Dim day As Integer = testDay.Day
    MsgBox(day)

    '年だけ→ 2020
    Dim year As Integer = testDay.Year
    MsgBox(year)

    '日付の引き算 7/1までは4日ある
    Dim lastDay As Date = #7/1/2020#
    Dim diff As Integer = (lastDay - testDay).Days
    MsgBox(diff)

End Sub

■リストH-3

最後の日付の引き算はまだ登場していない新しい文法で記述してみました。

日付の情報や操作にはいろいろあるので現段階では「こういったこともできる」という程度に覚えておいてください。もし文字列であればこのような日付の処理は簡単にはできません。

その他 昔の.NETは日付のひき算ができません

 - 記号を使った日付のひき算は初期の.NETではできないのですが、いつから可能になったか裏が取れませんでした。なんとなくの記憶で上記のコードは2005以降対応のアイコンをつけておきました。

 

他にも便利なメソッドやプロパティがいろいろとありますが、数が多すぎるので、必要に応じて説明していくことにします。

文字列型・日付型のメンバー(メソッドやプロパティなど)の一覧は下記で確認できます。現段階ではまだ知識がたりないので公式ドキュメントの解説の意味がわからないと思います。公式ドキュメントが読めるくらいの知識がたまれば独学でどんどんメンバーを使うことができるようになります。今後参考にしてください。

文字列型のメンバー

https://docs.microsoft.com/ja-jp/dotnet/api/system.string?view=netframework-4.8#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3

日付型のメンバー

https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime?view=netframework-4.8#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3

 

10.型が混合する計算

 

1つの計算の中で文字列や数値など複数の型を使用する場合、独特のルールが適用されます。

次の例を見てください。文字列型(String)の変数 st と 数値型(Decimal)の変数x をかけ算しています。

人間が見れば 3 × 4 で 12 という答えになるなと理解はできますが、VBはこれをどう判断するでしょうか?

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim st As String
    Dim x As Decimal

    st = "4"
    x = 3

    MsgBox(st * x)

End Sub

■リストI-1

Option Strict Onの場合、VBはこの例をエラーにします。

Option Strict Onでエラー

■画像:エラーのとき、親切に st に赤い波線が表示され、ここが怪しいと教えてくれます。

 

たまたま st が "4" だから計算できる気がするかもしれませんが、stは"Hello"だったり、"こんにちは"だったり、計算不可能な値もセットできる文字列型です。

そのため、一般的に考えれば文字列型と数値型のかけ算はできないと考えるべきです。

Option Strict Onはこのような発想でこれをエラーにします。

 

Option Strict Offの場合、(Option Strictの既定値はOffです)、期待通り「12」と表示してくれます。

この、柔軟なOption Strictというモード切り替えは他の言語にはないVBの特徴的な機能です。

 

ところが、喜んでばかりもいられません。

次のコードはどうなると思いますか?

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim st1 As String
    Dim st2 As String

    st1 = "4"
    st2 = "3"

    MsgBox(st1 + st2)

End Sub

■リストI-2

この例は Option StrictがOnでもOffでも、「43」と表示されます。

 

文字列の説明です少し触れたように、文字列同士で「+」を使うと「&」と同じ意味があるのです。つまり "A" & "B" が "AB" になると同様に、"A" + "B" は "AB" になります。もうおわかりですよね。"4" + "3" は "43"です。たし算ではないのです。

 

どうすればよいのでしょうか?

簡単です。数学や算数の計算をするときには数値型を使ってください。次のようにすれば何の問題もないのです。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim x As Decimal
    Dim y As Decimal

    x = 4
    y = 3

    MsgBox(x * y)
    MsgBox(x + y)


End Sub

■リストI-3

 

ただ、このプログラムは自分ですべてを制御しているので簡単なのですが、実際にいろいろ作り出すと数値同士で計算したくても違う型がまざってきたりしてしまうのです。

そんなときには型を変換するなどの処理を行うことになります。型変換については別の機会に説明しますが、とにかく、計算するときは型をあわせるようにという意識だけ持っておけばなぞの現象に苦しむということはなくなると思います。

 

次にちょっと意地悪な例を見てみましょう。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim st1 As String
    Dim st2 As String

    st1 = 4
    st2 = 3

    MsgBox(st1 + st2)

End Sub

■リストI-4

この例は、 4 と 3 から " をはずして数値にしてみました。これの計算結果は・・・「43」です。

これがたし算にならないのは変数 st1 と st2 が文字列型の As Stringで定義されているからです。最後の計算の行は 4 + 3 ではなく、st1 + st2 になっていますよね。だから、文字列同士の + だから、 & と同じ意味に解釈されるのです。数値であれば As Decimalのような数値型で記述する必要があります。DimやString, Decimalについては初級講座で詳しく取り上げます。

 

なお、この例はOption Strict Onの場合はエラーになります。文字列型に数値をセットしようとしているところに赤い波線がつきます。Option Strict Onの方が、事前におかしいところがわかるという意味では優秀です。

Option Strict Onで文字列型に数値は代入できないエラー