2010年01月18日

Sun, Jan 17




donkichi at 05:34|PermalinkComments(1)TrackBack(0)

2010年01月17日

Sat, Jan 16




donkichi at 05:35|PermalinkComments(0)TrackBack(0)

2010年01月16日

twtr2srcを使ってtwitterのつぶやきをブログに自動投稿

twtr2srcのサービスを利用して、twitterのつぶやきが、当ブログに自動投稿されるされるようにしてみました。

donkichi at 18:08|PermalinkComments(0)TrackBack(0)

2009年06月09日

Class_Initialize、Class_Terminate、の実行について(7)

●テストプログラムの実行
ExcelVBAで以下のモジュールを作成してModule22のプロシージャを1つずつ実行してどういう結果になるか確認してみてください。

●インスタンスの識別番号を生成する標準モジュール
この記事を参照

●クラスモジュール
この記事を参照

●テストプログラム
'=============================>>>>>>>>>>
'標準モジュール:Module22
'変数の宣言とインスタンスの生成を
'同時に行った場合(2)
'=======================================
Option Explicit

Sub Test1()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定。
    Dim obj As New clsA
    'このタイミングで
    'Class_Initializeは実行されない。
    'インスタンスが代入されていない変数で
    'プロパティを実行。
    Debug.Print "mod1:P1(1)"
    obj.P1 = "1"
    'Class_Initializeが実行される。
    'プロパティが正常に実行される。
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test2()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定。
    Dim obj As New clsA
    'このタイミングで
    'Class_Initializeは実行されない。
    'インスタンスが代入されていない
    '変数にNothingを代入。
    Debug.Print "mod1:Nothing(1)"
    Set obj = Nothing
    'このタイミングで
    'Class_Terminateは実行されない。
    'Nothingを代入した変数で
    'プロパティを実行。
    Debug.Print "mod1:P1(1)"
    obj.P1 = "xxx"
    'Class_Initializeが実行される。
    'プロパティが正常に実行される。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    'Class_Terminateが実行される。
End Sub

Sub Test7()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定1。
    Dim obj1 As New clsA
    'クラス変数の宣言時にNewを指定2。
    Dim obj2 As New clsA
    '変数1にインスタンスを代入。
    Debug.Print "mod1:Set(1)"
    Set obj1 = New clsA
    'Class_Initializeが実行される。
    '変数2に変数1を代入。
    Debug.Print "mod1:Set(2)"
    Set obj2 = obj1
    '変数1にNothingを代入。
    Debug.Print "mod1:Nothing(1)"
    Set obj1 = Nothing
    'このタイミングで
    'Class_Terminateは実行されない。
    'Nothingを代入していない変数で
    'プロパティを実行。
    Debug.Print "mod1:P1(1)"
    obj2.P1 = "xxx"
    'プロパティが正常に実行される。
    Debug.Print "mod1:P1(2)"
    'Nothingを代入した変数で
    'プロパティを実行。
    obj1.P1 = "xxx"
    'Class_Initializeが実行される。
    'プロパティが正常に実行される。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    'Class_Terminateが実行される。
End Sub
'<<<<<<<<<<=============================


donkichi at 20:54|PermalinkComments(0)TrackBack(0)Excel VBA 

Class_Initialize、Class_Terminate、の実行について(6)

●テストプログラムの実行
ExcelVBAで以下のモジュールを作成してModule21のプロシージャを1つずつ実行してどういう結果になるか確認してみてください。

●インスタンスの識別番号を生成する標準モジュール
この記事を参照

●クラスモジュール
この記事を参照

●テストプログラム
'=============================>>>>>>>>>>
'標準モジュール:Module21
'変数の宣言とインスタンスの生成を
'同時に行った場合(1)
'=======================================
Option Explicit

Sub Test1()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定。
    Dim obj As New clsA
    'このタイミングで
    'Class_Initializeは実行されない。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    'Class_Terminateは実行されない。
End Sub

Sub Test2()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定。
    Dim obj As New clsA
    'このタイミングで
    'Class_Initializeは実行されない。
    '変数にNothingを代入。
    Debug.Print "mod1:Nothing(1)"
    Set obj = Nothing
    'Class_Terminateは実行されない。
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test3()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定。
    Dim obj As New clsA
    'このタイミングで
    'Class_Initializeは実行されない。
    '変数にインスタンスを代入。
    Debug.Print "mod1:New(1)"
    Set obj = New clsA
    'Class_Initializeが実行される。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    'Class_Terminateが実行される。
End Sub

Sub Test4()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定。
    Dim obj As New clsA
    '変数にインスタンスを代入。
    Debug.Print "mod1:New(1)"
    Set obj = New clsA
    'Class_Initializeが実行される。
    '変数にNothingを代入。
    Debug.Print "mod1:Nothing(1)"
    Set obj = Nothing
    'Class_Terminateが実行される。
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test5()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定。
    Dim obj As New clsA
    '変数にインスタンスを代入。
    Debug.Print "mod1:New(1)"
    Set obj = New clsA
    'インスタンスが代入されている変数に
    'さらにインスタンスを代入。
    Debug.Print "mod1:New(2)"
    Set obj = New clsA
    '古いインスタンスの
    'Class_Terminateが実行される。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    '新しいインスタンスの
    'Class_Terminateが実行される。
End Sub

Sub Test6()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定。
    Dim obj As New clsA
    '変数にインスタンスを代入。
    Debug.Print "mod1:New(1)"
    Set obj = New clsA
    'インスタンスが代入されている変数に
    'さらにインスタンスを代入。
    Debug.Print "mod1:New(2)"
    Set obj = New clsA
    '古いインスタンスの
    'Class_Terminateが実行される。
    '変数にNothingを代入。
    Debug.Print "mod1:Nothing(1)"
    Set obj = Nothing
    '新しいインスタンスの
    'Class_Terminateが実行される。
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test7()
    Debug.Print "mod1:>>>>>"
    'クラス変数の宣言時にNewを指定1。
    Dim obj1 As New clsA
    'クラス変数の宣言時にNewを指定2。
    Dim obj2 As New clsA
    '変数1にインスタンスを代入
    Debug.Print "mod1:Set(1)"
    Set obj1 = New clsA
    '変数1に変数2を代入
    Debug.Print "mod1:Set(2)"
    Set obj2 = obj1
    '変数1にNothingを代入
    Debug.Print "mod1:Nothing(1)"
    Set obj1 = Nothing
    'このタイミングでは
    'Class_Terminateは実行されない。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    'Class_Terminateが実行される。
End Sub
'<<<<<<<<<<=============================


donkichi at 20:53|PermalinkComments(0)TrackBack(0)Excel VBA 

Class_Initialize、Class_Terminate、の実行について(5)

●テストプログラムの実行
ExcelVBAで以下のモジュールを作成してModule12のプロシージャを1つずつ実行してどういう結果になるか確認してみてください。

●インスタンスの識別番号を生成する標準モジュール
この記事を参照

●クラスモジュール
この記事を参照

●テストプログラム2
'==================================>>>>>
'標準モジュール:Module12
'変数の宣言とインスタンスの生成を
'別々に行った場合(2)
'=======================================
Option Explicit

Sub Test1()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言。
    Dim obj As clsA
    'インスタンスが代入されていない変数で
    'プロパティを実行すると
    '実行時エラー(91)。
    obj.P1 = "1"
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test2()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言。
    Dim obj As clsA
    '変数にNothingを代入。
    Set obj = Nothing
    'Class_Terminateは実行されない。
    'Nothingが代入されている変数で
    'プロパティを実行すると
    '実行時エラー(91)。
    obj.P1 = "xxx"
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test7()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言1。
    Dim obj1 As clsA
    'クラス型の変数の宣言2。
    Dim obj2 As clsA
    '変数1にインスタンスを代入。
    Debug.Print "mod1:Set(1)"
    Set obj1 = New clsA
    '変数2に変数1を代入。
    Debug.Print "mod1:Set(2)"
    Set obj2 = obj1
    '変数1にNothingを代入。
    Debug.Print "mod1:Nothing(1)"
    Set obj1 = Nothing
    'このタイミングでは
    'Class_Terminateは実行されない。
    'obj2はNothingが代入されていないので
    'プロパティは正常に実行される。
    obj2.P1 = "xxx"
    'obj1はNothingが代入されているので
    'プロパティは実行すると
    '実行時エラー(91)。
    obj1.P1 = "xxx"
    Debug.Print "mod1:<<<<<"
End Sub
'<<<<<<<<<<=============================


donkichi at 20:51|PermalinkComments(0)TrackBack(0)Excel VBA 

Class_Initialize、Class_Terminate、の実行について(4)

●テストプログラムの実行
ExcelVBAで以下のモジュールを作成してModule11のプロシージャを1つずつ実行してどういう結果になるか確認してみてください。

●インスタンスの識別番号を生成する標準モジュール
この記事を参照

●クラスモジュール
この記事を参照

●テストプログラム1
'=============================>>>>>>>>>>
'標準モジュール:Module11
'変数の宣言とインスタンスの生成を
'別々に行った場合(1)
'=======================================
Option Explicit

Sub Test1()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言。
    Dim obj As clsA
    '変数にインスタンスを代入せずに
    'プロシージャを終了する。
    Debug.Print "mod1:<<<<<"
    'Class_Terminateは実行されない。
End Sub

Sub Test2()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言。
    Dim obj As clsA
    'インスタンスを代入していない変数に
    'Nothingを代入。
    Set obj = Nothing
    'Class_Terminateは実行されない。
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test3()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言。
    Dim obj As clsA
    '変数にインスタンスを代入
    Debug.Print "mod1:New(1)"
    Set obj = New clsA
    '変数にNothingを代入せずに
    'プロシージャを終了。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    'Class_Terminateが実行される。
End Sub

Sub Test4()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言。
    Dim obj As clsA
    '変数にインスタンスを代入。
    Debug.Print "mod1:New(1)"
    Set obj = New clsA
    '変数にNothingを代入。
    Debug.Print "mod1:Nothing(1)"
    Set obj = Nothing
    'Class_Terminateが実行される。
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test5()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言。
    Dim obj As clsA
    '変数にインスタンスを代入。
    Debug.Print "mod1:New(1)"
    Set obj = New clsA
    'インスタンスが代入されている変数に
    'さらにインスタンスを代入。
    Debug.Print "mod1:New(2)"
    Set obj = New clsA
    '古いインスタンスの
    'Class_Terminateが実行される。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    '新しいインスタンスの
    'Class_Terminateが実行される。
End Sub

Sub Test6()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言
    Dim obj As clsA
    '変数にインスタンスを代入
    Debug.Print "mod1:New(1)"
    Set obj = New clsA
    'インスタンスが代入されている変数に
    'さらにインスタンスを代入
    Debug.Print "mod1:New(2)"
    Set obj = New clsA
    '古いインスタンスの
    'Class_Terminateが実行される。
    Debug.Print "mod1:Nothing(1)"
    '変数にNothingを代入
    Set obj = Nothing
    '新しいインスタンスの
    'Class_Terminateが実行される。
    Debug.Print "mod1:<<<<<"
End Sub

Sub Test7()
    Debug.Print "mod1:>>>>>"
    'クラス型の変数の宣言1。
    Dim obj1 As clsA
    'クラス型の変数の宣言2。
    Dim obj2 As clsA
    '変数1にインスタンスを代入。
    Debug.Print "mod1:Set(1)"
    Set obj1 = New clsA
    '変数2に変数1を代入。
    Debug.Print "mod1:Set(2)"
    Set obj2 = obj1
    '変数1にNothingを代入。
    Debug.Print "mod1:Nothing(1)"
    Set obj1 = Nothing
    'このタイミングでは
    'Class_Terminateは実行されない。
    Debug.Print "mod1:<<<<<"
    'プロシージャ終了後に
    '新しいインスタンスの
    'Class_Terminateが実行される。
End Sub
'<<<<<<<<<<=============================


donkichi at 20:50|PermalinkComments(0)TrackBack(0)Excel VBA 

Class_Initialize、Class_Terminate、の実行について(3)

●クラスモジュール
'=============================>>>>>>>>>>
'クラスモジュール:clsA
'=======================================
Option Explicit

Private mstrCode As String
Private mstrP1 As String

Private Sub Class_Initialize()
    mstrCode = modUtil.Code
    Debug.Print "clsA[" & mstrCode & "]:Class_Initialize"
End Sub

Private Sub Class_Terminate()
    Debug.Print "clsA[" & mstrCode & "]:Class_Terminate"
End Sub

Public Property Let P1(pstrNewValue As String)
    Debug.Print "clsA[" & mstrCode & "]:P1<Let>"
    mstrP1 = pstrNewValue
End Property

Public Property Get P1() As String
    Debug.Print "clsA[" & mstrCode & "]:P1<Get>"
    P1 = mstrP1
End Property

Public Sub Sub1()
    Debug.Print "clsA[" & mstrCode & "]:Sub1"
End Sub
'<<<<<<<<<<=============================



donkichi at 20:45|PermalinkComments(0)TrackBack(0)Excel VBA 

Class_Initialize、Class_Terminate、の実行について(2)

●インスタンスの識別番号を生成する標準モジュール
'=============================>>>>>>>>>>
'標準モジュール:modUtil
'=======================================
Option Explicit

Private mlngIndex As Long

Public Property Get Code() As String
    mlngIndex = mlngIndex + 1
    Code = "0000" & Trim(CStr(mlngIndex))
End Property
'<<<<<<<<<<=============================


donkichi at 20:44|PermalinkComments(0)TrackBack(0)Excel VBA 

Class_Initialize、Class_Terminate、の実行について(1)

 VBAではクラス型の変数をあつかうときは、「Set objA = New ClaA」のように変数にインスタンスを代入する命令を書くとClass_Initializeが実行されて、「Set ObjA = Nothing」のように変数にNothingを代入する命令を書くとClass_Terminateが実行されます。

 しかし、Class_InitializeとClass_Terminateはどちらもイベントプロシージャです。イベントプロシージャであるため、プログラムでそれらのプロシージャを明示的に実行することはできません。

 変数を宣言するときにNewをつけるかどうかでインスタンスが生成されるタイミングは異なります。また、変数に代入されているインスタンスの状態によっては、インスタンスを変数に代入すると必ずClass_Initializeが実行されるわけではありません。また、Nothingを代入したからといって必ずClass_Terminateが実行されるわけではありません。

 変数を宣言するときにNewをつけるかどうか、変数の状態がどうなっているかに着目してテストプログラムを作って実行してみるとよくわかります。

 以下にそれらのテストプログラムを載せます。実際に実行してみて、イミディエイトウィンドウにどういう結果が表示されるか確かめてみてください。

 なお、実行結果は、以下のように表示されます。
 クラスの処理が実行される場合は"CA[00006]:Class_Initialize"といった感じで、クラス名のあとにインスタンスを識別する番号が出力されるようにしてあります。番号が同じものは同じインスタンスであることを意味しています。
----------------------------------------
mod1:>>>>>
mod1:Nothing(1)
mod1:P1(1)
clsA[00006]:Class_Initialize
clsA[00006]:<Let>P1
mod1:<<<<<
clsA[00006]:Class_Terminate
----------------------------------------
 

donkichi at 20:43|PermalinkComments(0)TrackBack(0)Excel VBA 

2009年02月03日

VBAで依存性注入

 これから数回にわたって依存性注入をExcelVBAで実現する方法について書こうと思います。

 依存性注入については、以下の各サイトの記事に詳しく書かれています。

All About(オールアバウト)プログラミングJavaプログラミングSeasarでDI体験!

@ITSpring Frameworkで理解するDI(1)

ITProJava開発を変える最新の設計思想「Dependency Injection(DI)」とは

ウィリアムのいたずらの開発日記のDIのフレームワーク、SpringとSeasar2をHelloWorldで比較してみた

 依存性注入の詳細については上の記事を読んでもらうとして、VBAで実現するときのポイントは以下の3点だと思います。これらの問題をVBAでどう実現するかを考えて、最後にそれらを組み合わせて依存性注入を行うプログラムを作ってみたいと思います。

・外部ファイルの設定情報を読み込む
・文字列を元にクラスのインスタンスを生成する
・文字列を元にプロパティやメソッドを実行する
・インターフェースを利用する


donkichi at 22:08|PermalinkComments(1)TrackBack(0)Excel VBA 

2008年12月22日

VBAの今後について

 VBA 作法/コーディング規約 集約中 ( Excel Access 他)というブログの今後のVBAの予想という記事を読んで、かなり前に、Microsoft Officeの今後についての勝手な妄想という記事を書いていたことを思い出しました。

 その当時、よくわからないままに書いていたので、WordやExcelといったOfficeアプリがIEのプラグインになるかもなどと書いてありますね。今だとWEBサービスということになるのでしょうか。

 Microsoft Officeの今後についての勝手な妄想の記事とも関連しますが、VBAやマクロの記録機能がどうなるを考えるときには、WordやExcelVBAのVBAがアプリケーションのマクロ言語であるということから、以下のような流れで考える必要があると思います。(AcessのVBAはマクロ言語とは趣がことなるのでここでは除外します)

・WordやExcelなどのアプリ本体がどうなるのか?
 →PCのインストールする現在の形のままなのか?
 →Webサービスになるのか? 
 →両者のいいとこ取りした形になるか  

・Word文書や、Excelワークブックはどこに保存されることになるのか?
 →PCのローカルディスク
 →アプリがWebサービス化されるのであればWebサービスが存在するWebサーバー?
 →PCにも、Webサーバーのどちらにも保存できる

・アプリの操作を記録するマクロはどこに保存される?
 →現状と同じようにWord文書やExcelワークブック
 →文書に保存されるとしたら、文書の保存先がWebサーバの場合、
  文書経由でマクロ用の処理(サービス)を別途呼び出すことになる?

・記録したマクロの起動方法は?
 →アプリが現在の形のままであれば各アプリにマクロの記録がある?
 →アプリがブラウザ経由で使用するWebサービスの形になるのであれば
  マクロの記録機能は各アプリではブラウザの機能になる?

 仮に、近い将来、Officeの各アプリが仮にWebサービス化されて、ドキュメントがWebサーバーに保存されるものとします。

 そうなったら、マクロとして記録した処理を実行するためには、PC側からブラウザを通してWebサーバーに保存されているドキュメントの中にある処理を実行しないといけなくなります。となると、マクロ言語は、VB.NETやC#のような.NET系の言語に書かれたWebサービスの形の処理になるのかなという気がします。

 ただ、今のVBAでも初心者にとっては十分敷居が高いと思われる部分があるのに、.NET系のげんごになったら今以上に敷居が高くなるんだろうなぁ。

donkichi at 21:08|PermalinkComments(1)TrackBack(0)MS-Office よもやま話 

2008年07月20日

VBAの特徴

 某SNSの日記にVBAの記事を書いていて、VBAの特徴として、もともとある機能を別の用途に利用しているものがあるんだな、そして、別の用途に使った場合は一方通行的にしか使えないんだな、と改めて感じました。

 たとえば、エラー処理、イベントプロシージャ、インターフェイスのプロシージャの実装機能なんかです。

 エラー処理の場合、もともとあるサブルーチンを利用しています。On Error Goto文を書くと、エラーが発生したときに、On Error Gotoで指定されたサブルーチンに制御が移ります。エラーが発生したときだけ、そのサブルーチンはエラー処理とみなされるわけです。

 裏を返せば、エラーが発生していないときにgoto文で強制的にエラー処理として指定されているサブルーチンに制御を移しても、エラー処理とはみなされないわけです。

 たとえば、エラー処理として指定されているサブルーチンにErr.Raiseでエラーを発生する処理が書かれていたとします。この場合、エラーが発生していないときに、goto文でエラー処理として指定されているサブルーチンに制御を移すと、そのサブルーチンは2回実行されます。

 goto文で制御が移った1回目はエラーが発生していないので、サブルーチンに制御が移ってもエラー処理とはみなされません。単純にサブルーチンに制御が移っただけとみなされるわけです。そして、Err.Raiseでエラーが発生するとOn Error Gotoの指定が有効になってエラー処理として指定されているサブルーチンに再度制御が移るわけです。

 エラー処理として指定されているサブルーチンに、エラーが発生していないときにGoTo文で制御を移したとしても、エラー処理とみなされるわけではない。これが一方通行であるということです。

 イベントプロシージャの場合は、もともとあるPrivateなプロシージャをイベントプロシージャとして利用しています。

 たとえば、ユーザーフォームにTextBox1、TextBox2という2つのテキストボックスがあったとします。

 ユーザーフォーム実行時に、TextBox1からTextBox2にフォーカスを移すとTextBox1_Exitというイベントプロシージャが実行されます。しかし、Texbox1にフォーカスがある状態で、内部的にTextBox1_ExitをCallしても、そこに記述されている処理は実行されますが、TextBox1のExitイベントは発生しません。そのためフォーカスも移動しません。

 イベントが発生していないときに、イベントプロシージャとして指定されているプロシージャを実行しても、そのイベントが発生するわけではない。これが一方通行であるということです。

 インターフェイスの実装機能の場合、もともとあるPrivateなプロシージャをImplementsしたクラスのインターフェイス用のプロシージャとして利用しています。

 たとえば、clsAに「Implements clsX」と記述してあるとします。clsXにはSubXというPublicなSubプロシージャがあるとします。

 このときに、clsAのインスタンスをclsX型の変数に代入すると、clsAのclsX_SubXが呼び出されます。しかし、clsAのインスタンスをclsA型の変数に代入しても、clsX_SubXを実行することはできません。

 clsAのインスタンスをclsX型の変数に代入するとclsX_SubXはclsXに定義してあるとPublicなプロシージャとみなされます。しかし、clsAのインスタンスをclsA型の変数に代入したときには、clsX_SubXは単なるPrivateなプロシージャとしかみなされないからです。

 また、clsAの別のプロシージャ内から、clsX_SubXをPrivateなプロシージャとして実行することはできます。しかし、clsX_SubXが実行されたからといって、実行中のインスタンスがclsA型からclsX型に変わるわけではありません。

 これが一方通行であるということです。


donkichi at 17:42|PermalinkComments(0)TrackBack(0)Excel VBA 

2008年06月30日

WPFのImageコントロールでイメージファイルを読み込めない

 WPFのImageコントロールの使い方がわからない。

 コントロールをはりつけて、そのあとで、どうやってファイル名を指定するんだろうか。

 デザイナのプロバティウィンドウとコードの両方でSourceプロバティに文字列でファイル名を指定したが実行時にエラーになってしまった。

 サンプルやチュートリアルをもうちょっと詳しく調べてみないとだめかな。

donkichi at 23:11|PermalinkComments(0)TrackBack(0)

2008年06月27日

VB2008とBLENDでWPF

 少し前に金沢で、Visual Studio .NET 2008の研修を受けてきた。そのときに評価版のVisualStudio2008が入手できたので、Expressionの評価版をマイクロソフトのサイトからダウンロードして、VB.NET2008とBLEND2の両方を使ってWPFプログラムをいくつか作ってみている。

 昔、VB4で作ったドラッグ&ドロップを使った画面をWPFで作ろうとしているがはっきりいってまだまだ使い方がわかっていない。中途半端に.NETフレームワークのWindowsフォームに似ているから余計に混乱する。イベントにバブルイベントとかトンネルイベントとかあるらしい。リストボックスをクリックしたときにMouseDownイベントが発生する方法
も微妙に違っている。

 ざっくりといって、ウィンドウの上にレイアウト用のパネルをはって、その上に実際に使うコントロールを貼り付けていくことになるんだけど、VB.NETよりもJavaのSWINGでGUIを作る感覚に近い気がする。とりあえずもう少し触ってみよう。

 ところで、VBユーザーって結構数が多くて、VB6ユーザーがVB.NETに移行するかどうかがいまだに大きな問題になっているらしい。VB6からVB.NETに移行するためには、オブジェクト指向の考え方や、.NETのWindowsフォームの使い方がわかってないといけないのです。

 そんな状態であるにもかかわらず、.NETフレームワークでは、WindowsフォームやWEBフォーム関連の機能アップは凍結して、今後、GUI関係はデスクトップかWEBかに関係なくすべてWPFで統一して、WPFを機能アップさせていくらしい。

 VB.NETに移行していないVB6ユーザーが、今後、VB.NETに移行する場合、覚えないといけないのは、Windowsフォームではなくて、WPFの使いかたってことになりそうですね。VB6のソースをWidnowsフォームを使ったVB.NETのソースに変換するコンバーターはあるけど、VB6のソースやWindowsフォームを使ったVB.NETのソースをWPFのソースに変換してくれるコンバーターってないですよね。マイクロソフトは用意してくれないのかな。

donkichi at 21:55|PermalinkComments(2)TrackBack(0)

2008年06月04日

エラー処理の確認方法

前回のプログラムのエラー処理の確認方法について説明します。

一度、すべの処理が正常終了する状態でExecTest003を実行します。
「M_KOKYAKU.sql」、「T_ZAIKO.sql」、「T_URIAGE.sql」が生成されて、ログファイルの内容は以下のようになっているはずです。
(日付と時間は実際に実行した日付と時間になります。)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
2008/06/02 19:48:24 M_KOKYAKU.sql出力開始
2008/06/02 19:48:24 M_KOKYAKU.sql出力正常終了
2008/06/02 19:48:24 T_ZAIKO.sql出力開始
2008/06/02 19:48:24 T_ZAIKO.sql出力正常終了
2008/06/02 19:48:24 T_URIAGE.sql出力開始
2008/06/02 19:48:24 T_URIAGE.sql出力正常終了
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

その後、Wordで「T_ZAIKO.sql」を開きます。
そうすると、Wordが「T_ZAIKO.sql」を排他状態でオープンします。
その状態で再度ExecTest003を実行すると、ログファイルの内容は以下のようになっています。
(日付と時間は実際に実行した日付と時間になります。)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
2008/06/02 19:48:24 M_KOKYAKU.sql出力開始
2008/06/02 19:48:24 M_KOKYAKU.sql出力正常終了
2008/06/02 19:48:24 T_ZAIKO.sql出力開始
2008/06/02 19:48:24 T_ZAIKO.sql出力正常終了
2008/06/02 19:48:24 T_URIAGE.sql出力開始
2008/06/02 19:48:24 T_URIAGE.sql出力正常終了
2008/06/02 19:49:18 M_KOKYAKU.sql出力開始
2008/06/02 19:49:18 M_KOKYAKU.sql出力正常終了
2008/06/02 19:49:18 T_ZAIKO.sql出力開始
2008/06/02 19:49:18 *** エラー ***:T_ZAIKO.sql出力異常終了
2008/06/02 19:49:18 T_URIAGE.sql出力開始
2008/06/02 19:49:18 T_URIAGE.sql出力正常終了
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

ログファイルの内容から「T_ZAIKO.sql」の生成には失敗していますが、「M_KOKYAKU.sql」と「T_URIAGE.sql」は正常に生成されていることがわかります。

donkichi at 20:48|PermalinkComments(0)TrackBack(0)Excel VBA 

エラー処理を追加

目次
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
●エラー処理を追加

前回のプログラムのソース生成処理にエラー処理を記述して、エラーが発生しても処理を続けるようにします。
最終的にできあがった時には複数のソースを続けて出力することを考えています。
そのときに途中でエラーがあった場合でも中断せずに処理を続行するようにします。
また、複数のソースファイルを自動生成したときの処理結果をログファイルを出力するようにします。

エラー処理を記述したVBAのプログラムを実行する場合は、エラー処理が動作するようにVBEの設定を変える必要があります。
VBEでエラー処理が動作するように設定を変える手順は以下のとおりです。

・VBEでメニューから「ツール」、「オプション」を選ぶ。
・「オプション」画面で「全般」タブを選ぶ。
・「エラートラップ」で「エラー処理対象外のエラーで中断」を選ぶ。
・「OK」ボタンを押す。

VBEの設定は、Excelアプリケーションの設定として保存されています。
そのために、エラー処理が書かれているVBAのプログラムを実行するときにエラー処理が動くようにするためには
実行するPCのExcelのエラートラップの設定を変更しなければなりません。

今回は、ソース出力処理にだけエラー処理を記述します。
次回は、ログファイル出力処理をモジュール化してそこにエラー処理を記述することになります。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
'########################################
'標準モジュール:module003
'参照設定:
' Microsoft Scripting Runtime
'########################################
Option Explicit
'ログファイル
Private mobjLogFile As TextStream

'Test003テストプログラム
Sub ExecTest003()
    Dim objFSO As FileSystemObject
    'ログファイル名
    Dim strLogFileName As String
    
    'ログファイル名(logYYYYMMDD.txt)の設定
    '"YYYYMMDD"の部分は本日日付の西暦年月日
    strLogFileName = ActiveWorkbook.Path _
        & "\log" & Format(Now, "yyyymmdd") & ".txt"
    Set objFSO = New FileSystemObject
    
    'ログファイルのオープン(追加出力)
    Set mobjLogFile = objFSO.OpenTextFile( _
        strLogFileName, ForAppending, True)
    
    'ソースファイルの生成
    'エラーが発生して生成に失敗したソースがあっても処理を続ける
    '生成に成功したかどうかはログファイルを見ればわかる
    Call Test003("M_KOKYAKU", "顧客マスタ")
    Call Test003("T_ZAIKO", "在庫データ")
    Call Test003("T_URIAGE", "売り上げデータ")
    
    'ログファイルのクローズ
    mobjLogFile.Close
    Set mobjLogFile = Nothing
End Sub

'SQL文作成プロシージャ
'引数
' pstrTableName:テーブル名(英字)
' pstrTableDescription:テーブル名(日本語)
Sub Test003( _
    pstrTableName As String _
    , pstrTableDescription As String _
)
'エラー発生時はエラー処理に強制移動
On Error GoTo error_proc
    Dim objFSO As FileSystemObject
    'ログ出力データ
    Dim strLogData As String
    '出力ファイルオープン中フラグ
    Dim blnFlgOutOpen As Boolean
    Dim objOutText As TextStream
    Dim strOutFileName As String
    'ソース出力データ
    Dim strOutData As String

    'ログファイルに処理開始メッセージを出力
    strLogData = ""
    strLogData = strLogData & Format(Now, "yyyy/mm/dd hh:nn:ss")
    strLogData = strLogData & " " & pstrTableName & ".sql出力開始"
    mobjLogFile.WriteLine (strLogData)

    '出力ファイルオープン中フラグの初期化
    blnFlgOutOpen = False
    
    '出力ファイル名の指定
    strOutFileName = ActiveWorkbook.Path & "\" & pstrTableName & ".sql"

    Set objFSO = New FileSystemObject

    '出力ファイルのオープン
    Set objOutText = objFSO.OpenTextFile(strOutFileName, ForWriting, True)
    '出力ファイルオープン中フラグの設定
    blnFlgOutOpen = True

    '出力ファイルへのテキスト出力
    objOutText.WriteLine ("/**************************************/")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "/* "
    strOutData = strOutData & pstrTableDescription
    strOutData = strOutData & "("
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & ")"
    strOutData = strOutData & " */"
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine ("/* テーブル、インデックス作成 */")
    objOutText.WriteLine ("/**************************************/")
    objOutText.WriteLine ("/**************************************/")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "/* "
    strOutData = strOutData & pstrTableDescription
    strOutData = strOutData & "("
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & ")"
    strOutData = strOutData & " */"
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine ("/* テーブル作成 */")
    objOutText.WriteLine ("/**************************************/")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "CREATE TABLE "
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & "("
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine (" KOKYAKU_ID NUMBER(5) /* 顧客ID */")
    objOutText.WriteLine (" ,KOKYAKU_NAME CHAR(20) /* 顧客名 */")
    objOutText.WriteLine (" ,JYUSYO CHAR(50) /* 住所 */")
    objOutText.WriteLine (" ,YUUBIN NUMBER(7) /* 電話番号 */")
    objOutText.WriteLine (" ,DENWA NUMBER(11) /* 電話番号 */")
    objOutText.WriteLine (" ,TANJYOUBI DATE /* 誕生日 */")
    objOutText.WriteLine (");")
    objOutText.WriteLine ("/**************************************/")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "/* "
    strOutData = strOutData & pstrTableDescription
    strOutData = strOutData & "("
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & ")"
    strOutData = strOutData & " */"
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine ("/* インデックス作成 */")
    objOutText.WriteLine ("/**************************************/")
    
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "CREATE UNIQUE INDEX "
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & "_INDEX_01 ON M_KOKYAKU ("
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine (" KOKYAKU_ID")
    objOutText.WriteLine (");")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "CREATE INDEX "
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & "_INDEX_02 ON M_KOKYAKU ("
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine (" YUBIN, JYUSYO")
    objOutText.WriteLine (");")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "CREATE INDEX "
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & "_INDEX_03 ON M_KOKYAKU ("
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine (" TANJYOUBI, YUBIN, JYUSYO")
    objOutText.WriteLine (");")
    
    '出力ファイルのクローズ
    objOutText.Close
    Set objOutText = Nothing
    '出力ファイルオープン中フラグのクリア
    blnFlgOutOpen = False
    
    'ログファイルに処理正常終了のメッセージを出力
    strLogData = ""
    strLogData = strLogData & Format(Now, "yyyy/mm/dd hh:nn:ss")
    strLogData = strLogData & " " & pstrTableName & ".sql出力正常終了"
    mobjLogFile.WriteLine (strLogData)
    
    '正常終了時はエラー処理を行う必要がないので
    'ここでプロシージャをぬける
    Exit Sub
'エラー処理
error_proc:
    'ログファイルに処理異常終了のメッセージを出力
    'ログファイルの内容をみたときにエラーの部分がすぐにわかるように
    '「*** エラー ***」と強調して出力する
    strLogData = ""
    strLogData = strLogData & Format(Now, "yyyy/mm/dd hh:nn:ss")
    strLogData = strLogData & " *** エラー ***:" & pstrTableName & ".sql出力異常終了"
    mobjLogFile.WriteLine (strLogData)

    '出力ファイルが設定されているとき
    If Not objOutText Is Nothing Then
        '出力ファイルをオープン中のとき
        If blnFlgOutOpen = True Then
            '出力ファイルのクローズ
            objOutText.Close
            Set objOutText = Nothing
        End If
    End If
End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
目次


donkichi at 20:44|PermalinkComments(0)TrackBack(0)Excel VBA 

2008年05月25日

置換データを引数で渡す

目次
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
●置換データを引数で渡す

前回のプログラムを、英数字テーブル名と日本語テーブル名を引数で渡して置換するように修正すると以下のようになります。

ExecTest002プロシージャを実行すると、「M_KOKYAKU.sql」、「T_ZAIKO.sql」、「T_URIIAGE.sql」という3つのSQL文を格納したファイルが生成されます。

生成されたファイルを見ると、英数字テーブル名と、日本語テーブル名が引数で指定したものに置き換わっているのがわかります。

−−−−− 標準モジュール:moduel002   ここから −−−−−→
'########################################
'# 標準モジュール:module002
'# 「Microsoft Scripting Runtime」を参照設定
'########################################
Option Explicit

'Test002テストプログラム
Sub ExecTest002()
    Call Test002("M_KOKYAKU", "顧客マスタ")
    Call Test002("T_ZAIKO", "在庫データ")
    Call Test002("T_URIAGE", "売り上げデータ")
End Sub

'########################################
'# SQL文作成プロシージャ
'# 引数
'# pstrTableName:テーブル名(英字)
'# pstrTableDescription:テーブル名(日本語)
'########################################
Sub Test002( _
    pstrTableName As String _
    , pstrTableDescription As String _
)
    Dim objFSO As FileSystemObject
    Dim objOutText As TextStream
    Dim strOutFileName As String
    '出力データ
    Dim strOutData As String

    '出力ファイル名の指定
    strOutFileName = ActiveWorkbook.Path & "\" & pstrTableName & ".sql"

    Set objFSO = New FileSystemObject

    '出力ファイルのオープン
    Set objOutText = objFSO.OpenTextFile(strOutFileName, ForWriting, True)

    '出力ファイルへのテキスト出力
    objOutText.WriteLine ("/**************************************/")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "/* "
    strOutData = strOutData & pstrTableDescription
    strOutData = strOutData & "("
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & ")"
    strOutData = strOutData & " */"
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine ("/* テーブル、インデックス作成 */")
    objOutText.WriteLine ("/**************************************/")
    objOutText.WriteLine ("/**************************************/")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "/* "
    strOutData = strOutData & pstrTableDescription
    strOutData = strOutData & "("
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & ")"
    strOutData = strOutData & " */"
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine ("/* テーブル作成 */")
    objOutText.WriteLine ("/**************************************/")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "CREATE TABLE "
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & "("
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine (" KOKYAKU_ID NUMBER(5) /* 顧客ID */")
    objOutText.WriteLine (" ,KOKYAKU_NAME CHAR(20) /* 顧客名 */")
    objOutText.WriteLine (" ,JYUSYO CHAR(50) /* 住所 */")
    objOutText.WriteLine (" ,YUUBIN NUMBER(7) /* 電話番号 */")
    objOutText.WriteLine (" ,DENWA NUMBER(11) /* 電話番号 */")
    objOutText.WriteLine (" ,TANJYOUBI DATE /* 誕生日 */")
    objOutText.WriteLine (");")
    objOutText.WriteLine ("/**************************************/")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "/* "
    strOutData = strOutData & pstrTableDescription
    strOutData = strOutData & "("
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & ")"
    strOutData = strOutData & " */"
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine ("/* インデックス作成 */")
    objOutText.WriteLine ("/**************************************/")
    
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "CREATE UNIQUE INDEX "
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & "_INDEX_01 ON M_KOKYAKU ("
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine (" KOKYAKU_ID")
    objOutText.WriteLine (");")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "CREATE INDEX "
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & "_INDEX_02 ON M_KOKYAKU ("
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine (" YUBIN, JYUSYO")
    objOutText.WriteLine (");")
    
    '置換データを使って出力データを編集して出力
    strOutData = ""
    strOutData = strOutData & "CREATE INDEX "
    strOutData = strOutData & pstrTableName
    strOutData = strOutData & "_INDEX_03 ON M_KOKYAKU ("
    objOutText.WriteLine (strOutData)
    
    objOutText.WriteLine (" TANJYOUBI, YUBIN, JYUSYO")
    objOutText.WriteLine (");")
    
    '出力ファイルのクローズ
    objOutText.Close
End Sub
←−−−−− 標準モジュール:moduel002   ここまで −−−−−

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
目次


donkichi at 22:03|PermalinkComments(0)TrackBack(0)Excel VBA 

2008年05月18日

テキストファイルに文字列を出力する

目次
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
●テキストファイルに文字列を出力する

ソースプログラムを作るということがどういうことなのかを考えてみましょう。
単純に考えると、テキストファイルに文字列を書くということではないでしょうか。

COBOL、C、C++、C#、VB、VBA、VB.NET、Java、SQL、などなどプログラミング言語やDB用の言語は数多くあります。
しかし、それらの種類に関係なく、ソースプログラムを作るということは、テキストファイルに文字列を書くということになると思います。

VBAやSQLの場合は、コピー&ペーストで貼り付けたり、インポートしたりする機能があるはずです。テキストファイルのプログラムを直接実行すことができなくても、それらの機能を使って、テキストファイルに書かれているプログラムを利用することができます。

そこで、まずは、テキストファイルに文字列を書き出すプログラムを考えてみることにしましょう。

ここでは、例として、以下のソースプログラムを「M_KOKYAKU.sql」というファイル名で出力するプログラムを考えてみたいと思います。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/**************************************/
/* 顧客マスタ(M_KOKYAKU) */
/* テーブル、インデックス作成 */
/**************************************/
/**************************************/
/* 顧客マスタ(M_KOKYAKU) */
/* テーブル作成 */
/**************************************/
CREATE TABLE M_KOKYAKU (
     KOKYAKU_ID NUMBER(5) /* 顧客ID */
    ,KOKYAKU_NAME CHAR(20) /* 顧客名 */
    ,JYUSYO CHAR(50) /* 住所 */
    ,YUUBIN NUMBER(7) /* 電話番号 */
    ,DENWA NUMBER(11) /* 電話番号 */
    ,TANJYOUBI DATE /* 誕生日 */
);
/**************************************/
/* 顧客マスタ(M_KOKYAKU) */
/* インデックス作成 */
/**************************************/
CREATE UNIQUE INDEX M_KOKYAKU_INDEX_01 ON M_KOKYAKU (
    KOKYAKU_ID
);
CREATE INDEX M_KOKYAKU_INDEX_02 ON M_KOKYAKU (
    YUBIN, JYUSYO
);
CREATE INDEX M_KOKYAKU_INDEX_03 ON M_KOKYAKU (
    TANJYOUBI, YUBIN, JYUSYO
);
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

「Microsoft Scripting Runtime」を参照設定して、FileSystemObjectを使うと以下のようなプログラムになります。
−−−−− 標準モジュール:moduel001   ここから −−−−−→
'########################################
'# 標準モジュール:module001
'# 「Microsoft Scripting Runtime」を参照設定
'########################################
Option Explicit
Sub Test001()
    Dim objFSO As FileSystemObject
    Dim objOutText As TextStream
    Dim strOutFileName As String

    '出力ファイル名の指定
    strOutFileName = ActiveWorkbook.Path & "\M_KOKYAKU.sql"

    Set objFSO = New FileSystemObject

    '出力ファイルのオープン
    Set objOutText = objFSO.OpenTextFile(strOutFileName, ForWriting, True)

    '出力ファイルへのテキスト出力
    objOutText.WriteLine ("/**************************************/")
    objOutText.WriteLine ("/* 顧客マスタ(M_KOKYAKU) */")
    objOutText.WriteLine ("/* テーブル、インデックス作成 */")
    objOutText.WriteLine ("/**************************************/")
    objOutText.WriteLine ("/**************************************/")
    objOutText.WriteLine ("/* 顧客マスタ(M_KOKYAKU) */")
    objOutText.WriteLine ("/* テーブル作成 */")
    objOutText.WriteLine ("/**************************************/")
    objOutText.WriteLine ("CREATE TABLE M_KOKYAKU (")
    objOutText.WriteLine ("     KOKYAKU_ID NUMBER(5) /* 顧客ID */")
    objOutText.WriteLine ("    ,KOKYAKU_NAME CHAR(20) /* 顧客名 */")
    objOutText.WriteLine ("    ,JYUSYO CHAR(50) /* 住所 */")
    objOutText.WriteLine ("    ,YUUBIN NUMBER(7) /* 電話番号 */")
    objOutText.WriteLine ("    ,DENWA NUMBER(11) /* 電話番号 */")
    objOutText.WriteLine ("    ,TANJYOUBI DATE /* 誕生日 */")
    objOutText.WriteLine (");")
    objOutText.WriteLine ("/**************************************/")
    objOutText.WriteLine ("/* 顧客マスタ(M_KOKYAKU) */")
    objOutText.WriteLine ("/* インデックス作成 */")
    objOutText.WriteLine ("/**************************************/")
    objOutText.WriteLine ("CREATE UNIQUE INDEX M_KOKYAKU_INDEX_01 ON M_KOKYAKU (")
    objOutText.WriteLine ("    KOKYAKU_ID")
    objOutText.WriteLine (");")
    objOutText.WriteLine ("CREATE INDEX M_KOKYAKU_INDEX_02 ON M_KOKYAKU (")
    objOutText.WriteLine ("    YUBIN, JYUSYO")
    objOutText.WriteLine (");")
    objOutText.WriteLine ("CREATE INDEX M_KOKYAKU_INDEX_03 ON M_KOKYAKU (")
    objOutText.WriteLine ("    TANJYOUBI, YUBIN, JYUSYO")
    objOutText.WriteLine (");")
    
    '出力ファイルのクローズ
    objOutText.Close
End Sub
←−−−−− 標準モジュール:moduel001   ここまで −−−−−

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
目次


donkichi at 18:28|PermalinkComments(0)TrackBack(0)Excel VBA 

2008年05月10日

ソースプログラム自動生成プログラムの概要

目次
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
●ソースプログラム自動生成プログラムの概要

 DBテーブルのアクセス用プログラム、ネットワーク通信用のプログラム、などのように、データの内容が異なるだけで同じような処理をおこなうプログラムを何十本、何百本もつくらなければいけない場合があります。

 そんなとき、すべてのプログラムを手作業で作成するのは大変です。

 元になるプログラムを1本作成してそれをコピーして作るにしても手作業で入力するとミスが発生することがあります。

 また、設計書で決められた項目名を使わなければいけないときに手作業で項目名を入力するような場合も入力ミスが発生する可能性があります。

 設計書の内容を読み取って機械的にソースプログラムを自動生成するプログラムを作ればこれらのミスは防ぐことができます。

 そこで、以下の処理を行うプログラムをExcel VBAで作成してみたいと思います。

・定型的な処理内容をテンプレートファイル(テキストファイル)から読み込む。
・テンプレートで対応できない部分は、VBAプログラムで対処する。
・Excelシートに記入されている設計書を読み込んだ値をプログラム中に埋め込む。
・生成するソースプログラムの文字コードはShift_JISを前提とする。
・複数シートに記述されている同じ書式の設計書の内容を読みってソースプログラムを自動生成する。
・Excel2000のアドイン形式のプログラムにする。
・最終的にサンプルプログラムとして、ExcelシートのDBテーブルレイアウトを読み取って、テーブル・インデックス作成用SQL文、DBアクセスプログラム(Java)、DBアクセスプログラムの引数クラス(Java)、を生成するプログラムを生成する。

 大まかな動作形態は以下のようになります。

 テンプレートファイル(テキストファイル)
  ↓(読み込み)
  ↓
  ↓ Excelシート(DBテーブルレイアウト)
  ↓  ↓(変換)
  ↓ DBレイアウト情報クラス
  ↓  ↓(読み込み)
 ソースプログラム自動生成プログラム
  ↓ (自動生成して出力)
 ソースプログラム

 いきなり完成したプログラムをのせて説明しようにも、説明するのも大変だし、プログラムを見た人が理解するのも大変だと思います。

 そこで、まずは、必要最低限の機能をもったプログラムを作って、それを少しずつ何度も何度もバージョンアップさせることで最終的に行いたいプログラムを作ることにします。

 この形であれば、最終的なプログラムが完成するまでに時間はかかりますが、無理なく理解してもらえると思います。

 それでは、次回から実際のプログラムについて説明したいと思います。


−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
目次

donkichi at 22:08|PermalinkComments(0)TrackBack(0)Excel VBA