Visual Basic

2023年10月10日 (火)

[Visual Basic]ImageMagickを利用する

NuGetを利用して.NET用のImageMagickのパッケージをインストールすればよい。とりあえず、以下の3つのパッケージをインストールすればよい。

Magick.NET.Core
Magick.NET.SystemDrawing
Magick.NET-Q16-AnyCPU

以下、パッケージのインストール手順。

メニュー「ツール」→「NuGetパッケージマネージャー」→「パッケージマネージャーコンソール」。中央下に「パッケージマネージャーコンソール」ウィンドウが表示される。次のコマンドを入力すると、Magick関係のパッケージが表示される。

PM> Find-Package Magick
Id Versions Description
-- -------- -----------
Magick.NET.Core {○○○} A .NET API to the ImageMagick image-processing library for Desktop and Web.
Magick.NET-Q16-AnyCPU {○○○} A .NET API to the ImageMagick image-processing library for Desktop and Web.
(以下、表示省略)

上記の3つのパッケージをインストールする。

PM> Install-Package Magick.NET.Core
'.NETFramework,Version=○○○' を対象とするプロジェクト '○○○' に関して、パッケージ 'Magick.NET.Core.○○○' の依存関係情報の収集を試行しています
依存関係情報の収集に ○ ms かかりました
(表示省略)
'Magick.NET.Core ○○○' が ○○○ に正常にインストールされました
NuGet の操作の実行に ○ sec かかりました
経過した時間: ○○○
PM> Install-Package Magick.NET.SystemDrawing
(表示省略)
PM> Install-Package Magick.NET-Q16-AnyCPU
(表示省略)

これでインストールされたはず。ソリューションエクスプローラーのプロジェクト名のところで右クリック。表示されたコンテキストメニューで「NuGetパッケージの管理」をクリック。中央上部に「NuGetパッケージマネージャ」が表示される。ここに、3つのパッケージが表示されていれば、パッケージのインストールは完了。NuGetパッケージマネージャを閉じる(タブのラベルの右端の×をクリック)。これで使えるようになったはず。

動作確認をしてみる。実際に使うときは、以下の宣言が必要。

Imports ImageMagick

例えば、Visual Basicで標準では扱えないwebpファイル(以下の例ではD:\image.webp)は、次のようにすればBitmapオブジェクトに変換することができる。

Dim bitmapobj As System.Drawing.Bitmap
Dim magimg As ImageMagick.MagickImage
magimg = New ImageMagick.MagickImage("D:\image.webp")
bitmapobj = magimg.ToBitmap()

2023年1月31日 (火)

[Visual Basic]各プロジェクトで自動作成されるソースファイルの文字コードと改行コード

Visual Basic 2019の新規プロジェクトで最初に作成されたForm1.vbを、PowerShellのFormat-Hexコマンドレットでダンプしてみる。

PS > Get-Content .\Form1.vb
Public Class Form1
End Class
PS > Format-Hex .\Form1.vb
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 EF BB BF 50 75 62 6C 69 63 20 43 6C 61 73 73 20 Public Class
00000010 46 6F 72 6D 31 0D 0A 0D 0A 45 6E 64 20 43 6C 61 Form1....End Cla
00000020 73 73 0D 0A ss..

見てのとおり、先頭にバイトオーダーマークであるEF BB BFが記述されており、1バイト文字(「P」や「U」)は1バイトで記述されていることから、文字コードはBOM付きUTF-8であることがわかる。

改行コードは 0D+0A であるため、CR+LF である。

2022年3月 7日 (月)

[Visual Basic]文字の全角半角を判定する

文字コードがシフトJISであれば(Windows 10の通常状態)、GetByteCountメソッドを使うことで簡単に判定できる。GetByteCountメソッドは引数に与えた文字列のバイト長を返すメソッドだが、一文字だけ与えれば、その文字が全角か半角かの判定に使うことができる。

いわゆる半角文字(ASCIIコードの0x20~0xFF)を与えれば1(整数型)を、全角文字(「あ」や「亜」)であれば2(整数型)を返す。

st = "ABあいうC"
For i = 0 To st.Length - 1
s = st.Substring(i, 1)
len = System.Text.Encoding.GetEncoding(932).GetByteCount(s)
Debug.Print(Str(i) & ": " & Str(len))
Next i

出力

 0:  1
1: 1
2: 2
3: 2
4: 2
5: 1

「A」や「B」は1バイト文字なので1、「あ」や「い」は2バイト文字なので2が返されていることがわかる。

2021年6月13日 (日)

[Visual Basic]コマンドプロンプトでコンパイルする(Visual Studio 2019 Professional)

Visual Studio 2019 Professionalを使ってコマンドプロンプトでコンパイルする場合、「スタートメニュー」→「Visual Studio 2019」→「Developer Command Prompt for VS 2019」で起動する専用のコマンドプロンプトを使うことが一般的だが、環境変数Pathに以下を追加するだけでも使えるようになる。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\Roslyn

追加方法は以下のとおり。

エクスプローラー→「PC」のプロパティ→左側のメニュー「システムの詳細設定」→「システムのプロパティ」ダイアログが開いて「環境変数」ボタン→ユーザー環境変数でもシステム環境変数でもどちらでもかまわないが「Path」をクリック→「編集」ボタンを押す→「環境変数名の編集」ダイアログが開くが右側の「新規」ボタン→上記のディレクトリを追加→すべて「OK」ボタンを押して元に戻る

コンパイラーの実行ファイルはvbc.exe。

2020年7月28日 (火)

[Visual Basic]コマンドラインでコンパイルする

Windows 10には、標準でVisual Basicのコンパイラーが付属している。64ビット版であれば、以下のフォルダー。

C:\Windows\Microsoft.NET\Framework64\v4.0.30319

コンパイルを試してみる。以下のソースコードをhi.vbとして保存する。

module hi
sub main()
Console.WriteLine("Hi")
end sub
end module

コンパイルする。

>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc.exe hi.vb
Microsoft (R) Visual Basic Compiler version 〇.〇.〇
(以下、表示省略)

動作させてみる。

>hi.exe
Hi

2020年6月28日 (日)

[Visual Basic]正規表現を使って文字列を分割する

RegexクラスのSplitメソッドを使う。System.Text.RegularExpressions名前空間をインポートしておく。

以下は文字型変数sに代入した文字列「□A□BC□□DEF□□」(□は空白)を1つ以上の空白で分割した例。「1つ以上の空白」は正規表現では「[\s]+」となる。

分割元の文字列の前後の空白を同時に判定するのは表現が煩雑になるため、分割の前にTrimメソッドで、分割元の文字列の前後の空白を除去している。

Imports System.Text.RegularExpressions
Module Split
Sub Main()
Dim i As Integer
Dim s As String
Dim word() As String
s = " A BC DEF "
word = Regex.Split(s.Trim(), "[\s]+")
For i = 0 To word.GetLength(0) - 1
Console.WriteLine(Str(i) & ": " & word(i))
Next i
End Sub
End Module

出力

 0: A
1: BC
2: DEF

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