■閉鎖した昔のブログの記事復活
[2025/05/11] VB.NET:VB.NETでメモリにプロセスが残らない、エクセルファイルの処理について (No.398)
[2025/05/11] PostgreSQLのバックアップ (No.397)
[2025/05/11] VB.NET:USBメモリーの存在確認の方法 (No.396)
[2025/05/11] フリーのC#開発環境SharpDevelopを使って、C#ソースをVBに変換 (No.395)
[2025/05/11] 【自営業者ネタ】預金金利の勘定科目は何? (No.394)
[2025/05/11] PostgreSQLのバックアップ (No.397)
[2025/05/11] VB.NET:USBメモリーの存在確認の方法 (No.396)
[2025/05/11] フリーのC#開発環境SharpDevelopを使って、C#ソースをVBに変換 (No.395)
[2025/05/11] 【自営業者ネタ】預金金利の勘定科目は何? (No.394)
-
VB.NETでエクセルファイルを処理する場合、エクセルのプロセスがメモリ上に残るときがあります。
プロセスにエクセル(EXCEL.EXE)が残ると、エクセルを扱うプログラムでエクセルファイルのアクセスを行い、 同時にエクセルを起動して処理したい場合に不都合が発生します。
VB.NETプログラムからエクセルを扱う場合は、以下のソースの様にエクセルアプリケーションオブジェクト、 ブックスオブジェクト、ブックオブジェクト、シートオブジェクト等を利用しますが、それぞれ使用した後では オブジェクトを廃棄してやる必要があります。
また、オブジェクトを2回参照すること、つまり"."(ドットでの参照)の参照は1回のみにします。
さらに、処理を終えるところではブックオブジェクトはCloseし、エクセルアプリケーションオブジェクトはQuitする様にします。
'''
エクセルファイル処理 '''xlsxファイル名 Private Sub TestXlsx(ByVal strXlsxFileName As String) 'エクセル・オブジェクト宣言 Dim objExcel As Object = Nothing Dim objWorkBooks As Object = Nothing Dim objWorkBook As Object = Nothing Dim objSheet As Object = Nothing Dim objCells As Object = Nothing Dim objCell As Object = Nothing Try 'CreateObjectでExcelObjectを実行時バインディングする objExcel = CreateObject("Excel.Application") objExcel.visible = False objWorkBooks = objExcel.Workbooks objWorkBook = objWorkBooks.open(System.IO.Path.GetFullPath(strXlsxFileName)) objSheet = objWorkBook.Worksheets(1) objCells = objSheet.Cells '文字列の連結 Dim strTest As String = "" '内容を1行ずつ読み込む For Row As Integer = 1 To 10 objCell = objCells(Row, 1) strTest &= _ObjToStr(objCell.Value).Trim _ReleaseComObject(objCell) 'セルオブジェクト廃棄 objCell = objCells(Row, 2) strTest &= _ObjToStr(objCell.Value).Trim _ReleaseComObject(objCell) objCell = objCells(Row, 3) strTest &= _ObjToStr(objCell.Value).Trim & vbCrLf _ReleaseComObject(objCell) Next MsgBox(strTest) Finally '各オブジェクトの廃棄 If Not IsNothing(objCell) Then _ReleaseComObject(objCell) End If If Not IsNothing(objCells) Then _ReleaseComObject(objCells) End If If Not IsNothing(objSheet) Then _ReleaseComObject(objSheet) End If If Not IsNothing(objWorkBook) Then objWorkBook.Close(False) 'ファイルを閉じる _ReleaseComObject(objWorkBook) End If If Not IsNothing(objWorkBooks) Then _ReleaseComObject(objWorkBooks) End If If Not IsNothing(objExcel) Then objExcel.Quit() 'EXCELを閉じる _ReleaseComObject(objExcel) End If End Try End Sub '''明示的にCOMオブジェクトの参照を解放 '''COMオブジェクトの参照 Private Sub _ReleaseComObject(ByRef obj As Object) Try If Not obj Is Nothing Then Marshal.FinalReleaseComObject(obj) End If Finally obj = Nothing End Try End Sub '''Object型からString型への変更 '''変換元Object型データ '''変換後String型データ Private Function _ObjToStr(ByVal objStr As Object) As String Try Return objStr.ToString Catch ex As Exception Return "" End Try End Function
尚、今回のエクセルの処理で煩雑にならないように以下の関数を定義しています。
・「_ReleaseComObject」はオブジェクトの参照を解放するためのローカル関数です。
・「_ObjToStr」はオブジェクトの値から文字列へ変換するためのローカル関数です。
=====
2016/01/12:の時の情報
PR -
データベースは日々データに変化が発生しますので、毎日ある時点で定期的にバックアップする必要が出てきます。
バックアップ・リストアは pgAdmin を使えば簡単にできます。 しかし、定期的なバックアップ作業はバッチ処理とし、サーバのスケジューラで起動することが一般的だと思います。
Windows上のPostgreSQLのバックアップについて、コマンドプロンプトから行う方法を説明します。 尚、このコマンドはPostgreSQLサーバーの稼動しているマシンで実行することが前提になります。
■全データベースのバックアップ
pg_dump --format=t --file=bakup.dmp --username=postgres test
対象となるデータベースは test で、出力されるファイル名を bakup.dmp とし、ファイル形式はテキストで生成します。
データベースへのユーザ名は postgres で、これはPostgreSQLを最初に導入したときのAdminのユーザです。 このコマンドにはパスワードの指定がありませんが、pgAdminでログインし、パスワードの保存をしてあれば指定が必要ありません。
(エディタで %APPDATA%\postgresql\pgpass.conf にパスワードを登録してもOKです)
pg_dumpのコマンドですが、「pg_dump --HELP」と指定すれば、コマンドの一覧が表示されます。 多くのコマンドが表示されますが、中で使用すると言えば、テーブルの指定ぐらいでしょうか。 ■データベースの内のあるテーブルのバックアップ
pg_dump --format=t --file=bakup.dmp --username=postgres --table=table1 test
全データベースのバックアップに --table=table1 のコマンドを付加し table1 のテーブルをバックアップします。
=====
2015/04/27:の時の情報
-
USBメモリーの存在確認を行うために、 PCのハードウェア情報の取得をWMI(Windows Management Instrumentation)を使います。
ManagementObjectSearcherクラスを使って、WMIの情報を取得します。
WMIにはいろいろな情報を持っていますが、それを取得するための言語WQL(WMI Query Language)を使って取得します。
SQL言語のような記述で、以下のソースの中では
「SELECT * FROM Win32_DiskDrive where InterfaceType='USB'」
の部分です。
ManagementObjectSearcherクラスのコンストラクタの第1引数のスコープの指定で、"root\cimv2"と設定します。
この"root\cimv2"はシステム管理者にとって関心のあるWMIクラスのほとんどが格納されているそうです。
(cimv2とはCommon Information Model Version 2 というらしい)
さてSELECT文の中のWin32_DiskDriveですが、 Win32_DiskDriveクラスは、Win32 オペレーティング システムを 実行しているコンピューターで見ることができる物理ディスクドライブを表すそうです。
InterfaceTypeには以下の種類があります。
・SCSI
・HDC
・IDE
・USB
・1394
この中の”USB”を指定します。
'''
尚、上記のプログラムをテストする場合に、プロジェクトの中の参照設定にSystem.Management.dllを追加する必要があります。''' USBメモリの存在チェック ''' ''' <param name="strPNPDeviceID">USBメモリのPNPDeviceID文字列</param> ''' <param name="lst">USB機器を列挙情報</param> '''True:存在する、False:存在しない Public Function CheckExistUSB(ByVal strPNPDeviceID As String, _ Optional ByRef lst As Hashtable() = Nothing) As Boolean '戻り値初期化 CheckExistUSB = False 'USBメモリの存在チェック処理 Try 'WMI(Windows Management Instrumentation)を利用してUSBの情報を取得 Dim searcher As New System.Management.ManagementObjectSearcher( _ "root\CIMV2", _ "SELECT * FROM Win32_DiskDrive where InterfaceType='USB'") '全てのUSB機器を列挙 For Each queryObj As System.Management.ManagementObject In searcher.Get() Dim s As String = "" If Not lst Is Nothing Then 'USB機器の情報をHashtableに格納 Dim hash As New Hashtable hash.Add("Caption", queryObj("Caption")) hash.Add("DeviceID", queryObj("DeviceID")) hash.Add("PNPDeviceID", queryObj("PNPDeviceID")) 'Hashtableの配列に格納 Dim i As Integer = LBound(lst) If Not lst(0) Is Nothing Then i += 1 ReDim Preserve lst(i) End If lst(i) = hash End If '指定のPNPDeviceIDが等しいかチェック If queryObj("PNPDeviceID") = strPNPDeviceID Then '指定のUSBメモリが見つかった CheckExistUSB = True Exit For End If Next Catch ex As System.Management.ManagementException MsgBox("WMI Error: " & ex.Message, MsgBoxStyle.Critical) End Try End Function '''''' USBをチェックするためのボタンClickイベント ''' Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click 'USB機器を列挙情報用のHashtable設定 Dim lst As Hashtable() ReDim lst(0) 'USBメモリの存在チェック(USB機器を列挙) Me.CheckExistUSB("", lst) 'USB機器を列挙 Dim str As String = "" For i As Integer = 0 To UBound(lst) If i > 0 Then str += vbCr For Each col As System.Collections.DictionaryEntry In lst(i) str &= col.Key & " : " & col.Value & vbCr Next Next MsgBox(str) End Sub
=====
2015/04/16:の時の情報
-
C#で作成されたシステムをVB.NETに変換したいことはよく発生します。
WEB上でC#のソースをVB.NETなどに変換してくれるサイトは存在するのですが、 もっと良いものがないかと探してみました。
フリーのソフトで SharpDevelop というC#の開発環境がありました。
これ自体でWindowsFormのアプリケーションを作ることができます。
SharpDevelop
http://www.icsharpcode.net/OpenSource/SD/Default.aspx
これをインストールして動作させてみました。
ダウンロードは以下のURLから「Downloads for SharpDevelop 4.4 」をダウンロードしました。
http://www.icsharpcode.net/OpenSource/SD/Download/
インストールは表示される内容に従って行えば特に問題なく終わります。
以下はSharpDevelopを最初に起動した画面です。
とあるc#のソリューションを読込ませます。
(このソースはあるサイトのオープンソースのものです)
メインメニューの中から以下の操作をします。
[File] ⇒ [Open] ⇒ [Project/Solution... Ctrl+Shift+O]
ソリューションが読込まれた様子がわかります。
そこで、ソリューション全体をVB.NETに変換してみます。
メインメニューの中から以下の操作をします。
[Project] ⇒ [Convert] ⇒ [From C# to VB.NET]
C#のソリューション名が「Socktes」なのでVB.NETの方は「Socktes.Converted」となり、ソースは全て「cs」から「vb」に変わったことが分かります。
1個のC#ソースをVB.NETに変換したい場合は、1個のソースファイルを選択状態にしておいてメインメニューの中から以下の操作をします。
[Tools] ⇒ [Convert code to] ⇒ [VB.NET]
「Generated.vb」というタブが生成されますので、この中身をコピーして別のところにでも貼り付ければOKです。
=====
2015/04/15:の時の情報
-
預金通帳をみると「お利息」という入金がありました。
この利息ですが、会計処理ではどの様に扱うのか?
私は自営業者なので、預金金利の勘定科目は「事業主借」としています。
なのですが、この利息そのものには既に分離課税として20%分が差し引かれています。
これを小口現金の収入換算して所得税の計算に参入すると二重課税になりますし...
ところで、二重課税といえばガソリンがあります。
ガソリン代として半分ぐらいガソリン税が占め、更にその金額に消費税が加わります。
これ何とかならないのでしょうか?
ガソリン税が導入されたのは1970年代かの田中角栄さんの時に導入されたと思います。
道路をいっぱい作る関係から導入したそうですが、これが無くなればガソリンも安くなるのですが。
さて、「利息」の話に戻しますが普通の会社では、相手勘定は「受取利息」として処理すればよい様です。
=====
2015/03/18:の時の情報