カテゴリー別アーカイブ: VB.NET

VB.netでCSVファイルを取り込み、構造体の配列にセットする

FormLoad時にexeと同じディレクトリにあるinput.csvファイルを取り込む。
CSVは5列とし、1列目、2列目には数字のみ入るものとする。

Public Class Form1

    ' Form内で使用する共通の変数をセット
    Private sp() As Splr
    Private Max As Integer

    'FormLoad時にインプットとなるCSVファイルをグローバル変数の構造体の配列にセットする。
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim fileName As String = "Input.csv"    'ファイルのパス
        Dim fileNo As Integer = FreeFile()              'ファイル番号を取得
        Dim n As Integer = 0
        Dim seq As Integer = 0

        FileOpen(fileNo, fileName, OpenMode.Input)
        Do Until EOF(fileNo)        'ファイルの最後までループ
            ReDim Preserve sp(n)
            ' CSV各項目をセット
            Input(fileNo, sp(n).col1)
            Input(fileNo, sp(n).col2)
            Input(fileNo, sp(n).col3)
            Input(fileNo, sp(n).col4)
            Input(fileNo, sp(n).col5)
            'カウンタを進める
            n += 1
        Loop
        '結果行数をセット
        Max = n - 1
        FileClose(fileNo)

    End Sub

    Private Structure Splr
        '5列のCSVファイルを想定
        Dim col1 As Integer
        Dim col2 As Integer
        Dim col3 As String
        Dim col4 As String
        Dim col5 As String
    End Structure


End Class

VB.NETでメールの新規作成画面を開く

仕事で大量の宛先にメールを送らないと行けない作業が発生しました。メールは1通ずつ確認してから送信したかったので、方法を探してみました。
結果的に規定のメーラーの新規作成画面を開くときに、宛先、題名、本文を入力された状態で開くことができそうだったので、それを活用することにしました。

以下のメソッドを使いました。

System.Diagnostics.Process.Start(“mailto:<宛先>?cc=<CC>&bcc=<BCC>&subject=<件名>&body=<本文>”)

メモとして、メーラーの新規作成画面を開くコードを貼付けておきます。

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim addr As String = "" 'アドレス
        Dim subj As String = "" '題名
        Dim body As String = "" '本文

        'アドレスをセット
        addr = "test@aaa.com;test2@aaa.com" '複数送信先は;で区切る

        '題名をセット
        subj = "テストメール タイトル"

        '本文をセット
        body = body & "○○○様" & "%0D%0A"
        body = body & "" & "%0D%0A"
        body = body & "お疲れ様です。△△△です。" & "%0D%0A"
        body = body & "テストメールを送信します。" & "%0D%0A"

        '改行コードは「%0D%0A」で表す

        'メール作成フォームを開く
        System.Diagnostics.Process.Start("mailto:" & addr & "?subject=" & subj & "&body=" + body)
    End Sub
End Class

後は宛先、タイトル、本文をCSVなどで取り込み、処理をまわせば送信手前の新規作成の状態で表示されます。

本文中の改行は「%0D%0A」を使っています。

以下のページを参考にしました。
.NET TIPS プログラムからブラウザやメーラを起動するには?

[VB.NET] コマンドラインから実行するアプリケーション

コマンドラインからの実行を想定したアプリケーションを作成したのでメモ。

まずはプロジェクトの作成。
[新規プロジェクト]から、[コンソールアプリケーション]を選択する。

Sub Main()

End Sub

Main関数の中に処理を記述すれば、コマンドラインから実行した際に処理される。

また、呼び出しもと(コマンドプロンプトなど)への戻り値は

' 呼び出し元に終了コード21を返して終了
Environment.Exit(21)

の用に記述する。引数に終了コードを指定する。
正常終了の際は0、例外処理などが発生した場合には0以外の数値を返すように設定したりする。

以下サンプル。

Module Module1
 
    Sub Main()
        try
            ' ファイルオープン
            Dim Reader As IO.StreamReader = New IO.StreamReader("Test.txt")
        Catch ex As Exception
            ' ファイルオープンに失敗したら1を返して終了
            Environment.Exit(1)
        End try
        ' 終了コード0を返して終了
        Environment.Exit(0)     
    End Sub
End Module

[VB.NET] 構造体の配列のソート

複数のメンバを持つ構造体の配列をソートする。

以下のような構造体を想定する。

Public Structure record
    ' 店コード
    Dim tencd As Integer
    ' 仕入先コード
    Dim siirecd As Integer
    ' 納品日
    Dim nouhindate As Integer
    ' 伝票番号
    Dim denno As Integer

    Public Sub record()
        ' 各メンバの初期化
        tencd = 0
        siirecd = 0
        nouhindate = 0
        denno = 0
    End Sub

End Structure

このとき、店コード、仕入先コード、納品日、伝票番号の順でソートを行うとする。

System.Collections.IComparerインターフェースを実装する。

Public Class recordCompare : Implements System.Collections.IComparer
    Public Function Compare(ByVal right As Object, ByVal left As Object) As Integer Implements IComparer.Compare
        ' right > left	: 正の値を返す。
        ' right == left	: 0を返す。
        ' right < left	: 負の値を返す。

        ' 店舗コード、仕入先、納品日、伝票番号の順に比較する

        ' 店舗コードで比較
        If (CType(right, record)).tencd - (CType(left, record)).tencd > 0 Then
            Return 1
        ElseIf ((CType(right, record)).tencd - (CType(left, record)).tencd < 0 Then
            Return -1
        Else
            ' 仕入先コードで比較
            If (CType(right, record)).siire - (CType(left, record)).siire > 0 Then
                Return 1
            ElseIf (CType(right, record)).siire - (CType(left, record)).siire < 0 Then
                Return -1
            Else
                    ' 納品日で比較
                If (CType(right, record)).nouhindate - (CType(left, record)).nouhindate > 0 Then
                    Return 1
                ElseIf (CType(right, record)).nouhindate - (CType(left, record)).nouhindate < 0 Then
                    Return -1
                Else
                    ' 伝票番号で比較
                    If (CType(right, record)).denno - (CType(left, record)).denno > 0 Then
                        Return 1
                    Else
                        Return -1
                    End If
                End If
            End If
        End If
    End Function
End Class

Compareメソッドでは、引数としている2つのオブジェクトの比較を行い、rightの方が大きい(後ろに並ぶ)場合は1、leftの方が大きいときは-1を返す。
そこで、まず店舗コードで比較を行う。同じであれば仕入先コードで比較。と言った具合にソートしたい項目の順序で比較の定義を行う。

実際にソートを行うときは、ArrayListクラスのSortメソッドを利用する。
引数にインターフェースを定義した、recordCompareを指定する。

Sub Main()

    ' レコードのオブジェクト
    Dim rec As record
    ' レコードオプジェクト配列
    Dim list As ArrayList = New ArrayList()

    '==============================
    ' 構造体の配列にデータを挿入(省略)
    '==============================
		
    '並び替え
    list.Sort(New recordCompare)

End Sub

こうすることで、ArrayLsit listは店舗、仕入先、納品日、伝票番号の順でソートされる。