Visual Basic

2018年10月23日 (火)

[Visual Basic]文字列が数値に変換可能か否かを判定する

IsNumeric関数は、引数に与えられた文字列が数値に変換可能であればTrueを、変換不可能な文字列であればFalseを返す。

以下の6つの文字列は、いずれも数値に変換可能なため、Trueを返している。文字列の前後に空白があっても、変換可能であることがわかる。

Debug.Print(IsNumeric("3"))
Debug.Print(IsNumeric("3."))
Debug.Print(IsNumeric("3.2"))
Debug.Print(IsNumeric("+3.21"))
Debug.Print(IsNumeric("+3.2e10"))
Debug.Print(IsNumeric("  4  "))

True
True
True
True
True
True

以下の5つの文字列は、いずれも数値に変換不可能のため、Falseを返している。アルファベットや2つ以上のピリオドや符号(正数・負数を表す記号)が含まれているとFalseを返すことがわかる。また、指数を表す文字は「d」は使えないことがわかる。

Debug.Print(IsNumeric("3a"))
Debug.Print(IsNumeric("3 2"))
Debug.Print(IsNumeric("+3.21+"))
Debug.Print(IsNumeric("3.2.1"))
Debug.Print(IsNumeric("+3.2d10"))

False
False
False
False
False

2018年9月19日 (水)

[Visual Basic]NPOIをインストールする

NPOIとは、Visual Basic(Visual Studio)でExcel(エクセル)のファイル(xlsまたはxlsx)を読み書きするためのライブラリーである。これをVisual Basicで使えるようにするためにインストールする方法。以下は、Visual Studio Community 2017での例。NPOIはNuGetパッケージマネージャにより、パッケージ化されているので、これを使用すれば、簡単にインストールすることができる(所要時間5分程度、要インターネット回線)。

  1. Visual Studioを起動する。
  2. NPOIを使用するプロジェクトを開く。
  3. メニュー「ツール」→「NuGetパッケージマネージャー」→「パッケージマネージャーコンソール」。パッケージマネージャーコンソールのウィンドウが開く。開くまでに、「PowerShellホストを初期化しています...」と表示されて、数秒待たされるかもしれない。
  4. コマンドプロンプト「PM>」が表示されているはず。「Install-Package NPOI」と打ち込んでEnterキーを押す。インストールが始まる。依存関係情報の収集に数十秒かかるかもしれない。これでインストールされる。なお、一緒にパッケージSharpZipLibがインストールされる。
  5. メニュー「ツール」→「NuGetパッケージマネージャー」→「ソリューションのNuGetパッケージの管理」。パッケージNPOIがインストールされているのが確認できる。一緒に、パッケージSharpZipLibがインストールされていることも確認できる。

2014年6月21日 (土)

[Visual Basic]四捨五入を行う

Math.roundメソッドにMidpointRounding.AwayFromZeroオプションを使えば四捨五入が行えることになっているが、丸める数値がDouble型の場合、うまくいかないことがあるため要注意。確実に四捨五入を行うには、数値をDecimal型にしたほうがよい。

Double型でも特にエラーは発生せずに使用できるが、MSDNのサンプルプログラムではDecimal型で行っている。

プログラム例

Dim dbl As Double
Dim dec As Decimal

' とりあえずDouble型で四捨五入を試してみる
' 手計算ではそれぞれ1.3、1.4になり、そのとおり出力される
dbl = 1.25
Console.WriteLine(CStr(Math.Round(dbl, 1, MidpointRounding.AwayFromZero)))
dbl = 1.35
Console.WriteLine(CStr(Math.Round(dbl, 1, MidpointRounding.AwayFromZero)))

' 複雑な式の結果を四捨五入してみる
' 手計算では20.1113になるはずだが、出力結果は20.1112となり四捨五入されていない
dbl = (Math.Abs(20.11125) + Math.Abs(20.11125)) / 2
Console.WriteLine(CStr(Math.Round(dbl, 4, MidpointRounding.AwayFromZero)))

' 同じことをDecimal型で試してみる、出力結果は20.1113になる
dec = (Math.Abs(20.11125D) + Math.Abs(20.11125D)) / 2
Console.WriteLine(CStr(Math.Round(dec, 4, MidpointRounding.AwayFromZero)))

出力

1.3
1.4
20.1112
20.1113