□技術メモ - VB.NET ※管理人の個人的な技術メモです。このページの内容を実行した結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ※このころは少々いい加減な記述をしていたように思います。 しばらくしたら閉めます(2019.03.03記す) ----------------------------------------------------------- ○DBから取得した日付を表示可能な文字列に変換(日付がNULLの場合あり) Dim strWk as String = String.Empty If DataTable.Rows(x)(y) IsNot Nothing Then Dim objBuf as Object = DataTable.Rows(x)(y) If Not IsDBNull(objBuf) Then 'DbNull判定 Dim dtWk as Date = CDate(objBuf) 'CType(obj, Date)の方が良いだろうか? strWk = dtWk.ToString("yyyy/MM/dd") 'ToStringは書式指定できる。y,M,dの大文字/小文字を間違えないこと End If End If ○Usingの使用法 Objectの破棄は厳密に記述しようとすると難しいことがある。 Usingを使うとUsing句終了時にObjectが破棄される。 以下はTEXTファイルを読み込む場合の例。 Private Sub GetStrBuf() Using ファイルReadObjectの生成 '読み込み処理 End Using 'Objectの破棄が自動で行われる End Sub Try catchと組み合わせるとFinallyでエラーが起きた場合に Objectが破棄されないことを回避できる。 Using Objectの生成 Try '処理 Catch 'エラー処理 End Try End Using 'Objectの自動破棄 ○VBによるExcelの操作 参照の設定 - COM - Microsoft Office 12.0(もしくは14.0) Object Libraryを追加 DebugもしくはReleaseの直下にMicrosoft.Office.Interop.Excel.dll を配置する。 ※実行するとexeのあったフォルダにExcel関連のdllがいくつか生成(複写?)されるが これは一体なんだろう?→調査中です。 -------- Option Strict On 'コメントにすると遅延バインディングを許可 Option Explicit On Import Microsoft.Office.Interop 'モジュール変数 Private m_xlApp as Excel.Application Private m_xlBooks as Excel.Workbooks Private m_xlBook as Excel.Workbook Private m_xlShts as Excel.Sheets Private m_xlSht as Excel.Worksheet Private m_xlRange as Excel.Range 'ブックを開く Private Sub OpenBook(ByVal pFilePath as String) m_xlApp=New ExcelApplication m_xlBooks=New m_xlAppWorkBooks m_xlBook=m_xlBooks.Open(pFilePath) 'Bookを開く '新規作成の場合は m_xlBooks.Add m_xlShts=m_xlBookj.Worksheets m_xlApp.Visible=False End Sub 'シートを選択する Private Sub SelectSheet(ByVal pShtNm as String) m_xlSht=CType(m_xlWShts(pShtNm), Excel.Worksheet) End Sub '保存して閉じる Private Sub SaveClose() '順番を間違えると閉じないので注意 '----Save m_xlBook.Save() '----Range m_xlRange=Nothing '----Sheet m_xlSht=Nothing m_xlShts=Nothing '----Book m_xlBook.Close() m_xlBook=Nothing m_xlBooks=Nothing '----App m_xlApp.Quit() m_xlApp=Nothing End Sub '値を設定 Private Sub SetValue(ByVal pFilePath as String, ByVal pShtNm as String) Call Open(pFilePath) Call SelectSheet(pShtNm) m_xlRange=m_xlSht.Range("A1:F4") m_xlRange.Value="こんにちは" 'Rangeの中をm_xlRange.Valueのパターンで埋めていく 'この場合はRangeの全てのセルに同じ値がセットされる。 '---- Dim saData1 as String() = New String() {"A", "B", "C"} m_xlRange.Value=saData1 '1次元配列の場合は複数行にセットする 'この場合は1行3列のデータを複数行にセットする '---- Dim saData2 as String(,) = New String(,) {{"A", "B", "C"}} m_xlRange.Value=saData2 '2次元配列で1行M列の場合は1次元配列と同じように複数行にセットされる。 'この場合は1行3列のデータを複数行にセットする '---- Dim saData3 as String(,) = New String(,) {{"A"}, {"D"}, {"G"}} m_xlRange.Value=saData3 '2次元配列でN行1列の場合は複数列にセットされる 'この場合は3行1列のデータを複数列にセットする '---- Dim saData4 as String(,) = New String(,) {{"A", "B", "C"}, {"D", "E", "F"}} m_xlRange.Value=saData4 '2次元配列でN行M列の場合は左上を起点に1つだけ貼り付ける '空きになったセルは #N/A になる(N行1列、1行M列の場合でも同様) '---- Call SaveClose() End Sub -------- ○app.configの参照、更新 ※app.configはアプリケーションの起動時に読み込むもので、頻繁に更新するファイルではないらしい。 アプリケーション終了時の状態の保存などには別の方法を使った方がいいらしい。 ※動作確認する際はapp.configの構造をよく確認すること。 ConfigurationManager.RefreshSection("appSetting") 'リフレッシュ(キャッシュを破棄して再取得する) ConfigurationManager.AppSetting(key) '参照 wConfig as Configuration=ConfigurationManager.OpenExeConfigration(ConfigurationUserLevel.None) '更新用オブジェクト wConfig.AppSetting.Settings.Remove(key) '削除 wConfig.AppSetting.Settings.Add(key, value) '追加 wConfig.Save(ConfigurationSaveMode.Modifies) '保存 ※更新の際は最後に一度リフレッシュすることで最新の値を取得できるようになります。 ○DataGridViewのセル編集中のKeyPressイベントを取得する ・DataGridViewのセル編集中に表示されているコントロールはDataGridViewではなく、 DataGridViewTextBoxEditingControl(DataGridViewにて編集中のTextBoxコントロール、そのままですな) なので、このコントロールのイベントを取得する必要がある。 ・DataGridView_EditingControlShowingにおける引数は以下の2つ sender As Object e As DataGridViewEditingControlShowingEventArgs ・CType(sender, DataGridView)で、DataGridView自身を取得する ・CType(e.Control, DataGridViewTextBoxEditingControl)で、編集用コントロールを取得する ・編集用コントロールには動的にイベントハンドラを追加する必要がある。 AddHandler 編集用コントロール.KeyPress, AddressOf 「任意のメソッド名」 これで「任意のメソッド名」は編集用コントロール.KeyPressイベントとして動作するようになる。 ・ただし何回も追加してはいけない。追加済みであることをフラグ等で管理するか、もしくは RemoveHandler 編集用コントロール.KeyPress, AddressOf 「任意のメソッド名」 これでイベントハンドラを一度削除してから、再度追加する。 ・サンプル 銀行コードに該当する銀行名を表示する場合 -------- Private Sub DgvBank_EditingControlShowing( ByVal sender As Object, _ ByVal e As DataGridViewEditingControlShowingEventArgs) _ Handles DgvBank.EditingControlShowing 'DataGridViewTextBoxEditingControlを編集中であることの判定 If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then 'データグリッドビューの取得 Dim DtGrdView as DataGridView = CType(sender, DataGridView) '編集用コントロールの取得 Dim EdtCtrl as DataGridViewTextBoxEditingControl = CType(e.Control, DataGridViewTextBoxEditingControl) 'イベントハンドラの追加 If mbEventAdd = False Then If DtGrdView.CurrentCell.OwningColumn.Name = "BankCode" Then AddHandler EdtCtrl.KeyPress, AddressOf BankCodeChanged 'BankCodeChangedメソッドをイベントハンドラとして追加する mbEventAdd = True End If End If End If End Sub Private Sub BankCodeChanged( _ ByVal sender As Object, _ ByVal e As KeyPressEventArgs) 'BankCodeに応じた銀行名を表示する End Sub --------