ChaichanPapa-World !

燈明日記(2006/12

◆ インデックス

◆ 2006年12月

■ 2006-12-31 法華経ノートとVB-TIPSメモを更新

法華経ノートとVB-TIPSメモを更新しました。

たぶん、これが、今年最後の更新となります。

この一年間、本サイトにアクセスして頂いた皆様、心から御礼申し上げます。

ありがとうございました!

来年も、よろしくお願い致します。皆様、良いお年を!!

最後に、今年一番の格言を皆様に贈ります。

『すべての幸福は、感謝の気持ちがつくるのです。』  By そうじ力の著者

来年は、間違えなく九紫火星(S30,S39,S48,S57,H03)の年です。

8年間続いた長くて暗いトンネルからのやっとの脱出【謎】!!

最後の最後に、素敵な曲を聞きながら……。

■ 2006-12-29 最速エクスプローラ起動

前回、タスクバーのスタートボタンの上で右クリックのエクスプローラ選択が、最速と言いましたが、『WINDOWSキーを押しながらeキー』が、もっと速かったです。

■ 2006-12-28 VBでの標準入出力

結論から言えば、私が標準入出力系のAPIを駆使して試みた限りでは、VB6での標準入出力は出来ません。

しかし、VB6でオブジェクトを作成(ActiveX DLL)しておき、前回ご紹介した、VBSからCreateObjectすれば、標準入出力はVBSにまかせ、データ処理はVB6で行うことは可能です。


また、VB.NETでの標準入出力は、以下のように、言語仕様でサポートされています。


標準入力から入力された文字列を大文字に変換して標準出力に出力するサンプル・プログラム

 1: Module Module1
 2: 
 3:   Sub Main()
 4:     Do
 5:       Dim s As String
 6:       s = Console.ReadLine()
 7:       If s Is Nothing Then
 8:         Exit Do
 9:       End If
10:       Dim r As String
11:       r = s.ToUpper()
12:       Console.WriteLine(r)
13:     Loop
14:   End Sub
15: 
16: End Module

■ 2006-12-27 VBSでの標準入出力

VBSでは、WSHのWScriptオブジェクトを使用することにより標準入出力の処理が可能です。

以下がそのサンプルで、標準入力からデータを受け取って標準出力するフィルタプログラムです。

尚、サンプルでは、フィルタ無しで、標準入力データをそのまま標準出力しています。

Option Explicit

'エラーが発生しても中断しない
On Error Resume Next

Dim objStdIn    '標準入力用オブジェクト
Dim objStdOut   '標準出力用オブジェクト
Dim intExitCode '終了コード

'標準入力用オブジェクトのインスタンス作成
Set objStdIn = Wscript.StdIn

'標準出力用オブジェクトのインスタンス作成
Set objStdOut = Wscript.StdOut

'標準入力を1行ずつ読み込み標準出力へ書き込む

Do While objStdIn.AtEndOfStream = false

  objStdOut.WriteLine  objStdIn.ReadLine

Loop

'インスタンスの破棄
Set objStdIn   = Nothing
Set objStdOut  = Nothing

If Err.Number <> 0 Then
    intExitCode = 1 'エラー
Else
    intExitCode = 0 '正常
End If

'Quitメソッドの引数値は、バッチファイルでerrorlevelになる。
Wscript.Quit(intExitCode)

◆ 使用例

C:\Documents and Settings\xxx>dir * | cscript.exe VBStdInOut_TEST.vbs

VBSソース(VBStdInOut_TEST.vbs)は、あくまでcscript.exeの引数です。

■ 2006-12-26 VBでの独自エラー(vbObjectError)について

たとえば、Visual Basicで定義されているエラーのほかにも、独自のエラーを定義したい場合があります。

そのような場合は、定数 vbObjectError にエラー番号を加算して番号を作成します。


定数 vbObjectError には、vbObjectError + 512 までの範囲の数が予約されていて、エラー番号をこの範囲を超える数に指定すると、Visual Basic の将来のバージョンや、その他の Microsoft Basic 製品との重複を防ぐことができます。


(注意:アプリケーションで使用しているActiveXコントロールでも、独自のエラー番号を定義している可能性があり、重複を避けるための確認が必要な場合があります。)


独自のエラー番号を定義するには、モジュールの宣言セクションで定数として宣言します。

' エラー定数
Const gcstUserErr1 = 1 + vbObjectError + 512
Const gcstUserErr2 = 2 + vbObjectError + 512

このようにしておくと、通常のエラーの場合と同様に、Raise メソッドを使って独自のエラーを発生させることができます。

この場合、Err オブジェクトの Description プロパティは、"アプリケーション定義またはオブジェクト定義のエラーです。" という標準の記述を返します。

独自のエラーの記述を使う場合は、記述を Raise メソッドに引数として与える必要があります。

例、
Err.Raise gcstUserErr1, "メイン処理", "独自のエラーメッセージ"

尚、本コンテンツは、MSDN(2001)ヘルプ『エラーの生成』を大変参考にさせて頂きました。

■ 2006-12-26 一番の供養

亡くなった人への一番の供養は、自分がしっかりと生き抜くこと。

そして、亡くなった人へ心配を掛けないこと。


お墓参りは、後悔の祈り参りではなく、ましてや幸福のお願い参りではなく、しっかり生きていることの報告参り。


いつまでも、下を向いていては、亡くなった人が心配して上に逝ってくれないよ……。


実は今日、江原さんの番組をたまたま拝見して、同じことを言っていました。




ちゃいちゃん、パパは、あらためて、しっかりと生きるよ!

ママもしっかりと生きるように応援してね……。

■ 2006-12-25 VBAでの変更を保存するかどうかの確認ダイアログを黙らすには

VBAでの変更を保存するかどうかの確認ダイアログを黙らすには、Excel ApplicationオブジェクトのDisplayAlertsプロパティをfalseにします。

Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = True

objExcel.DisplayAlerts = FALSE

Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")

Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(1, 1).Value = Now

objWorkbook.SaveAs("C:\Scripts\Test.xls")

objExcel.Quit

これ、VBAだけでなく、VB6からEXCELを制御している時も、当然有効です。

ただ、VBAじゃないので、気がつかない時があり、気づいたときに脱力…とか。

■ 2006-12-24 私が編み出したワンツウスリー

先日、ご紹介した『そうじ力』の本に書いてあった心に残ったフレーズをリストしときます。


で、私が編み出した幸福へのワンツウスリーです。

  1. あいさつ力(家でも会社でも、まずは、挨拶)
  2. かんしゃ力(すべての幸福は、感謝の気持ちが作る)
  3. そうじ力(そうじを実践して、自分の心もピカピカに)

この3力を実践して、幸福になりたいと思います!

■ 2006-12-24 FTPで送れるファイルサイズに制限はあるか?

IIS6.0のFTPでは、制限はないとのことです。

IIS4.0までは、仕様制限が4GBとのことです。

そもそもPCのディスクファイルシステムが98系のFAT32だと、1ファイルの最大サイズは4GBです。

XP系のNTFSだとファイルサイズの制限はないそうです。

しかし、ギガバイト単位のFTPなんてしたくない、したくない…。

■ 2006-12-23 VBのすすめ(VB,VBA,VBS,WSH,HTA,HTM,VB.NET)

VBSは、XP等のWINDOWS系に標準バンドルされている。

VBAは、EXCEL等のoffice系に標準バンドルされている。

VBSは、WSH、HTA、HTMの標準スクリプトとして実装されている。

VB.NETは、完全オブジェクト指向言語になっている。


よって、VB系は、おすすめなのです。

MS系は、始めから最後までベーシック言語なのです。たぶん。

■2006-12-22 祝!! WEB相談室7000スレッド!

2000年から丸7年間で、7000スレッド達成!!

皆様のお蔭様でここまで来れました。ありがとうございました。

これからも、よろしくお願い致します。

■ 2006-12-22 貧乏なワケ

先日、ご紹介した『そうじ力』の本に書いてありましたが、お金に感謝していない人は貧乏になるとのことでした。

反対にお金に感謝している人は、お金持ちになり、お札を折り曲げるようなお財布は使わないとのことでした。


やば!、私の場合、普段着はGパンで、中学校の時から折り曲げるお財布を右側のおしりのポケットに入れています。

つまり、約40年間毎日、感謝とはほど遠い、折り曲げて、かつ、おしりのポケットに入れているのです。

だから、お金が逃げていって、貧乏なワケや…と思う次第です。


まず、お財布を折り曲げないタイプのを買って、お金を大切に、そして、感謝していきたいと思います。

最後に例のお言葉をもう一度。

『すべての幸運は、感謝の気持ちがつくる』

感謝の気持ち、感謝のこころ、感謝の……。

■ 2006-12-22 『一括コピー ホストのデータファイルが開けません。』

BCPコマンドで DB to TEXT を実現した後、時が経ち、なにかの拍子にフォーマット(.fmt)ファイルが無くなっていた場合、このエラーが出ます。


実は、単にフォーマット(.fmt)ファイルが無い時に出ます。


また、テキストに落とすファイルに書き込み権がないときも、このエラーが出ました。

■ 2006-12-21 「鬼十則」 吉田秀雄

VBのエラーを調べるので、たまたま見つけた、仕事に対する魂に響いたメッセージです。

1.仕事は自分から「創る」べきで、与えられるべきでない。

2.仕事とは、先手先手と「働き掛け」ていくことで、受身でやるものでない。

3.「大きな仕事」と取り組め、小さな仕事はおのれを小さくする。

4.「難しい仕事」を狙え、そしてこれを成し遂げる所に進歩がある。

5.取り組んだら「放すな」、殺されても放すな目的完遂までは・・・・・

6.周囲を「引きずり廻せ」、引きずるのと引きずられるのとでは永い間に天地のひらきがでる。

7.「計画」を持て、長期の計画を持っていれば、忍耐と工夫とそして正しい努力と希望が生まれる。

8.「自信」を持て、自信がないからきみの仕事には迫力も粘りもそして厚味すらない。

9.頭は常に「全回転」、八方に気を配って一分の隙もあってはならない。サービスとはそのようなものだ。

10.「摩擦を怖れるな」、摩擦は進歩の母、積極の肥料だ。でないときみは卑屈未練になる。

特に8番は、私の場合、魂が真っ二つに切り裂かれた感じがしました。『粘りもそして厚味すらない』自信か…。

■ 2006-12-21 VBA版タグ挿入スクリプト

前回(VB6版)前々回(VBS版)のVBA版です。

たとえば、フォルダ内にqa0001.htmからqa7000.htmの7000個のhtmファイルがあったとします。

とある事情で、bodyタグの直後にscriptタグを追加したい場合、手作業で追加するのは大変です。

そこで、以下のようなプログラムをEXCELのVBAで組んで見ました。

以下のプログラムをそのフォルダ内で実行すると一発で7000個ファイルを更新することが出来ます。

Dir関数の引数やLike演算子のオペランドをカスタマイズして、何かに流用してもらえれば、幸いです。

とにかく、フォルダ内の複数のファイルに対しいて処理するときの雛型として使えると思います。

'---------------------------------------------------------------------------------------------
'[VBA版タグ挿入スクリプト]
'カレントフォルダにあるqa*.htmでマッチしたファイルすべてにbodyタグの直後にscriptタグを追加する。
'
'---------------------------------------------------------------------------------------------
Option Explicit
Private Sub Workbook_WindowActivate(ByVal Wn As Window)

Dim vntp As Variant
Dim strWk As String
Dim strCurrentDirectory As String
Dim intIdx As Integer

    'カレントディレクトリを求める。
    For intIdx = Len(ActiveWorkbook.FullNameURLEncoded) To 1 Step -1
      If Mid(ActiveWorkbook.FullNameURLEncoded, intIdx, 1) = "\" Then Exit For
    Next
    strCurrentDirectory = Mid(ActiveWorkbook.FullNameURLEncoded, 1, intIdx - 1)
    
    'カレントディレクトリを設定する。
    ChDrive Mid(strCurrentDirectory, 1, 1)
    ChDir strCurrentDirectory
    
    'カレントフォルダにあるq*.htmでマッチしたファイルすべて処理する。
    'ちなみに『*』は、ワイルドカード。
    vntp = Dir("q*.htm", vbNormal)
    Do While vntp <> ""

        Open "tmp.log" For Output As #2
        Open vntp For Input As #1
        Do While Not EOF(1)
            Line Input #1, strWk
            Print #2, strWk
            
            '文字列の中をLike検索する。ちなみに『*』はワイルドカード。
            If strWk Like "<body>*" Then
               Print #2, "<script src=""header.js"" type=""text/javascript"" charset=""Shift_JIS""></script>"
            End If
        Loop
        Close #1
        Close #2
        
        FileCopy "tmp.log", vntp
        Kill "tmp.log"
        vntp = Dir

    Loop
    Application.Quit

End Sub

以下が、少し参考になるかも。

■ 2006-12-20 VBS版タグ挿入スクリプト

前回のVB6版のVBScript版です。


たとえば、フォルダ内にqa0001.htmからqa7000.htmの7000個のhtmファイルがあったとします。

とある事情で、bodyタグの直後にscriptタグを追加したい場合、手作業で追加するのは大変です。

そこで、以下のようなプログラムをVBSで組んで見ました。


以下のプログラムをそのフォルダ内で実行すると一発で7000個ファイルを更新することが出来ます。

2つのRE.Patternの正規表現をカスタマイズして、何かに流用してもらえれば、幸いです。

とにかく、フォルダ内の複数のファイルに対しいて処理するときの雛型として使えると思います。

'---------------------------------------------------------------------------------------------
'[VBS版タグ挿入スクリプト]
'カレントフォルダにある^qa.*htm$でマッチ(正規表現)したファイルすべてにbodyタグの直後にscriptタグを追加する。
'
'---------------------------------------------------------------------------------------------
Option Explicit
    Dim fs, f, f1, fc, RE
    Dim objWshShell

    Set objWshShell = WScript.CreateObject("WScript.Shell")
    Set RE = CreateObject("VBScript.RegExp")
    'カレントフォルダにある正規表現^qa.*htm$でマッチしたファイルすべて処理する。
    
    RE.Pattern ="^qa.*htm$"
    
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(objWshShell.CurrentDirectory)
    Set fc = f.Files
    For Each f1 in fc
        If RE.Test(f1.name) then
   If TestFileEdit(f1.name) = 1 then
    Exit For
   End IF
        End If 
    Next
    Set fs = Nothing
    Set RE = Nothing
    Set objWshShell = Nothing

Function TestFileEdit(fname)
const ForReading = 1, ForWriting = 2, ForAppending = 3
Dim strPathIn
Dim strPathOut
Dim fs, fr, fw, RE, strWk
Dim intSts

 Set RE = CreateObject("VBScript.RegExp")
 
 RE.Pattern ="<body>"

 strPathIn = fname
 strPathOut = "testOut.tmp"
 Set fs = CreateObject("Scripting.FileSystemObject")

 If fs.fileexists(strPathIn) then
   Set fr = fs.OpenTextFile(strPathIn, ForReading)
  Set fw = fs.OpenTextFile(strPathOut, ForWriting,True)

  Do While Not fr.AtEndOfStream
   strWk = fr.ReadLine
   fw.WriteLine strWk
   If RE.Test(strWk) Then
    fw.WriteLine "<script src=""header.js"" type=""text/javascript"" charset=""Shift_JIS""></script>"
    End If
  Loop

  fw.Close
  fr.Close
  Set fw = Nothing
  Set fr = Nothing
  fs.CopyFile "testOut.tmp", fname
  fs.DeleteFile "testOut.tmp"
  intSts = 0
 Else
  Call MsgBox("ファイル見つからない!",48,"エラー")
  intSts = 1
  
 End if
 Set fs = Nothing
 Set RE = Nothing
 TestFileEdit = intSts
End Function

■ 2006-12-19 VB6版タグ挿入スクリプト

たとえば、フォルダ内にqa0001.htmからqa7000.htmの7000個のhtmファイルがあったとします。

とある事情で、bodyタグの直後にscriptタグを追加したい場合、手作業で追加するのはとんでもなく大変です。

そこで、以下のようなプログラムをVB6で組んで見ました。


以下のプログラムをそのフォルダ内で実行すると一発で7000個のファイルを更新することが出来ます。

Dir関数の引数やLike演算子のオペランドをカスタマイズして、何かに流用してもらえれば、幸いです。

とにかく、フォルダ内の複数のファイルに対しいて処理するときの雛型として使えると思います。

'---------------------------------------------------------------------------------------------
'[VB6版タグ挿入スクリプト]
'カレントフォルダにあるq*.htmにマッチしたファイルで、その内容のbodyタグの直後にscriptタグを追加する。
'
'---------------------------------------------------------------------------------------------
Option Explicit
Private Sub Main()
Dim vntP As Variant
Dim strWk As String

    'カレントフォルダにあるq*.htmでマッチしたファイルすべて処理する。
    'ちなみに『*』は、ワイルドカード。
    vntP = Dir("q*htm", vbNormal)
    Do While vntP <> ""

        Open "tmp.log" For Output As #2
        Open vntP For Input As #1
        Do While Not EOF(1)
            Line Input #1, strWk
            Print #2, strWk
            
            '文字列の中をLike検索する。
            'ちなみに『*』は、ワイルドカード。
            If strWk Like "<body>*" Then
               Print #2, "<script src=""header.js"" type=""text/javascript"" charset=""Shift_JIS""></script>"
            End If
        
        Loop
        Close #1
        Close #2
        
        FileCopy "tmp.log", vntP
        Kill "tmp.log"
        vntP = Dir

    Loop
End Sub

■ 2006-12-18 そうじ力

三笠書房から出ている『そうじ力』(著者:舛田光洋)を読み終えました。

感想を一言で云えば、素晴らしいの一言です。

なにが素晴らしいって、そりゃ単なるそうじのノウハウ本でなく、ある意味、はっきり云って良質の宗教本だと思うからです。

というか、逆にトンデモ本だと決め付ける人もいるかもしれません。それは……。


内容を一言で云えば、『そうじをすれば、幸せになれる』です。

そう、見えない世界を前提にしているのです。


法華経信者の私には、そうじが法華経でいう実践行そのものだと受け止めさせてもらいました。

そうじで、家がきれいになるは、家と自分の魂がきれいになることだと思いました。

そして、著者は、以下のようにおしゃっています。

『すべての幸福は、感謝の気持ちがつくるのです。』

このお言葉、私の魂に響きました。私も本当にそう思います。

いや、良い本にめぐり会いました。


また、プログラマの私には、そうじの整理整頓は、スパゲティソースの整理整頓に通じるところがあり、そうじと同じく幸せに(プログラマ以外は謎)になれるのです。


実は、この本の冒頭に、うつ病の妻のエピソードがあり、それがきっかけでこの本を買いました。

うちの妻も、なんとかこの本でよくなってくれると有り難いのですが……。

■ 2006-12-18 IsArray関数の誤解

VB6のIsArray関数は変数が配列かどうかを判断する関数です。


しかし、引数にVariant型の変数しか使えないとの誤解があるようです。

これは、他のIsなんちゃら系がほとんどVariant型であることと、某参考書までもVariant型と誤って明記されているからかも知れません。


IsArray関数は、Variant型はもちろん、文字列型、整数型でも問題なく使えます。


あと、配列をUBound関数の引数に渡す時に、配列の要素がないとエラーになります。

ですので、Dimで配列宣言した後、ReDimの0で、一つの配列要素をとるとエラーになりません。

だたし、その後の処理でインデックス0の配列の処理を特別に意識しないとなりません。

Dim strWk() As String
Dim vntWk() As Variant
Dim intWk() As Integer
Dim intWk2 As Integer
ReDim strWk(0)
ReDim vntWk(0)
ReDim intWk(0)

If IsArray(vntWk) Then
    intWk2 = UBound(vntWk)
    MsgBox "配列"
End If
If IsArray(strWk) Then
    intWk2 = UBound(vntWk)
    MsgBox "配列"
End If
If IsArray(intWk) Then
    intWk2 = UBound(vntWk)
    MsgBox "配列"
End If

■ 2006-12-17 VBScript(VBスクリプト)でDIRするには?

たとえば、フォルダ(ディレクトリ)内のすべてのファイルに対して処理をしたい場合が、結構あります。

VB6では、DIR関数を使って比較的簡単に実装できますが、VBSでは、DIR関数そのものがありません。

したがって、VBSでは、正規表現オブジェクトとFilesコレクションを使います。


留意点として、VB6とVBSはカレントディレクトリが違いますので、これに関しては、以下のリンク先を参照してください。

また、正規表現オブジェクトに関しては、以下のリンク先を参照してください。

VB6
Option Explicit
Dim vntP As Variant

 vntP = Dir("qa*htm", vbNormal)
 Do While vntP <> ""
  
  'フォルダ内の各ファイルに対しての処理を記述する。
  
  vntP = Dir
 Loop
VBS
Option Explicit
Dim fs, f, f1, fc, RE, objWshShell

 Set objWshShell = WScript.CreateObject("WScript.Shell")
 Set RE = CreateObject("VBScript.RegExp")
 RE.Pattern ="qa.*htm"
 Set fs = CreateObject("Scripting.FileSystemObject")
 Set f = fs.GetFolder("objWshShell.CurrentDirectory")
 Set fc = f.Files
 For Each f1 in fc
  If RE.Test(f1.name) then
  
   'フォルダ内の各ファイルに対しての処理を記述する。
  
  End If 
 Next
 Set fs = Nothing
 Set RE = Nothing

■ 2006-12-16 カレントディレクトリの求め方

VB6では、実行ファイルがあるディレクトリが、カレントディレクトリになります。

しかし、VBSやVBAでは、WSH本体やEXCEL本体のあるディレクトリが、カレントディレクトリになります。

したがって、VBスクリプト(.vbs)やEXCELブック(.xls)があるディレクトリのパス情報も必要になるケースがあります。

以下は、そのパス情報取得のスクリプトです。

VBSの場合
Dim vntCurrentDirectory
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
vntCurrentDirectory = objWshShell.CurrentDirectory
MsgBox vntCurrentDirectory
Set objWshShell = Nothing
VBAの場合
Dim vntCurrentDirectory
Dim intIdx As Integer
For intIdx = Len(ActiveWorkbook.FullNameURLEncoded) To 1 Step -1
  If Mid(ActiveWorkbook.FullNameURLEncoded, intIdx, 1) = "\" Then Exit For
Next
vntCurrentDirectory = Mid(ActiveWorkbook.FullNameURLEncoded, 1, intIdx - 1)  
MsgBox vntCurrentDirectory

VB6の場合
Dim vntCurrentDirectory
vntCurrentDirectory = CurDir

■ 2006-12-15 VBSとWSHの境界線

バッチ用のプログラムをVBSで組んでいるとVBSなのかWSHなのか分からなくなる時があります。

というか、この時点でVBSとWSHの境界が混乱しているのです。


整理します。

WSHとは、VBSやJScriptのスクリプトを実行するプログラムです。

VBSとは、VBScriptという名のプログラム言語です。

WSH実行プログラムは、VBSプログラム言語で組んだプログラムの内容を引数として受け取り、それを実行するのです。

以上、明快です。


しかし、VBSで扱うWScriptオブジェクトもWSHと呼ばれることがあります。

そして、VBS内では、WScriptオブジェクトは宣言なしで使えたりします。

また、VBSには、CreateObject関数あるのに、WScriptオブジェクトには、CreateObjectメソッドがあったりして混乱してくるわけです。


ちなみに、CreateObject関数とCreateObjectメソッドの違い


と言う訳で、VBSとWSHの境界線、わかりましたか?

■ 2006-12-15 WORDを使いこなす3つのポイント(見出し、項番、書式コピー)

たとえば、2つのワード文書をコピー&ペーストして合体させる場合、項番がバラバラになります。

しかし、両文書とも項番を見出し毎に自動採番していると、ペーストした時、項番が上手い具合に自動修正されます。感動です。

スタイルが微妙に違っているとダメですが、そのときは、『類似した書式の文字列を選択』して書式コピーで一発です。


つまり、WORDを使いこなす3つのポイントは以下の通り。

  1. 見出しスタイルの指定。
  2. 項番の自動採番(見出しの上で、右クリックメニュー->箇条書きと段落番号->アウトライン)。
  3. 『類似した書式の文字列を選択』しての書式コピー(コピー:Ctrl+Shift+c、ペースト:Ctrl+Shift+v)。

とにかく、書式コピーは、使えるぞ!

■ 2006-12-14 すべての幸福は、感謝の気持ちがつくる

今、とある本を読んでいます。そこに書いてあった、私にとって耳の痛いメッセージです。

感謝しない人のまわりからは、人が去っていきます。

感謝しない人には、お金が入ってこなくなります。

感謝しない人は、孤独になります。

だから、孤独で貧乏なんや…。感謝しないと!

とある本は、追って感想文を書きますね!

■ 2006-12-14 EXCELを単なるVBプログラムとして使う!

普通、VBがXPにインストールされていることは、プログラマのPC以外では、まずないですね。

しかし、XPには標準でWSH機能を介してVBSが使えます。

またしかし、VBSはファイルI/Oがイマイチ使いづらいです。

そのような時は、準標準(謎)で入っているEXCELを使います。

EXCELのVBAで、あたかもVBプログラムのように使用するのです。

以下は、その方法です。

  1. VBAでThisWorkbookモジュールにWorkbook_WindowActivateサブルーチンを定義する。
  2. Workbook_WindowActivateサブルーチン内にやりたい処理を記述する。
  3. 最後にApplication.Quitを実行する。
Private Sub Workbook_WindowActivate(ByVal Wn As Window)

    'やりたい処理を記述する。

    Application.Quit

End Sub

これで、上記のVBAのブックを実行すると、やりたい処理だけが実行される。

しかし、例のセキュリティダイアロが出るのが玉に瑕ですが…。

■ 2006-12-13 いやなページ

私は、以下のリンク先での『よかった探しリース』に参加しています。

たとえば、右手リンクをずーっと辿って行くと、一回りして自分のページに帰ってくるものです。

しかし、ほとんど帰ってこれません。

原因は、いろいろですが、ざーっと以下の通りです。

『ページが重い』ヤツ、貧弱な環境で巡回している者の身になって、ページを作って欲しい。

『別ウィンドウを開く』ヤツ、はっきり言ってむかつきます!

『謎プログラムをインストールしようとする』ヤツ、問題外!

■ 2006-12-13 VBScript(VBスクリプト)でLikeするには?

VB6やVBAでのlike検索は、文字列をワイルドカード(*,?)で検索できます。

しかし、VBS(VBスクリプト)では、like演算子そのものがありません。

では、どうするかというと、正規表現のオブジェクトを使います。


ワイルドカード『*』に対応する正規表現は『.*』です。

ワイルドカード『?』に対応する正規表現は『.』です。


あと、正規表現の場合には、先頭に『^』、後尾『$』を付け加えます。

なぜかと言うと、like演算子は文字列全体に対しての比較です。

それに対して、Testメソッドは、単なる文字列サーチです。

なので、先頭に『^』、後尾『$』を付け、文字列全体サーチにして、比較すればlike演算子とイコールになるはずなのです。

VB6
If "aaaxxxbbbyccczzz" Like "aa*bbb?ccczzz" Then
    Call MsgBox("ヒット")
Else
    Call MsgBox("アウト")
End If
VBScript
Option Explicit
Dim objRE

Set objRE = CreateObject("VBScript.RegExp")
objRE.Pattern = "^aaa.*bbb.ccczzz$"

If objRE.Test("aaaxxxbbbyccczzz") Then
 Call MsgBox("ヒット")
Else
 Call MsgBox("アウト")
End If
Set objRE = Nothing
正規表現メモ
Testメソッド
RegExp オブジェクト

■ 2006-12-12 ディスクトップ上で実行中のウィンドウを整列させるには

ディスクトップ上で、2つのAPのウィンドウを見比べて、作業したい場合があります。

そんな時は、簡単にウィンドウを整列させたいのですが、どうすればよいのでしょうか?

要は、普通ディスクトップの一番下にあるタスクバーで、整列させたい起動中のアイコンをコントロールキーを押しながらクリックし、右クリックメニューの『上下に並べて表示』または『左右に並べて表示』を選択します。


おまけ

IEなどでリンク先を別ウィンドウを開いてやる場合は、リンクの上で右クリックメニューの『新しいウィンドウで開く』です。

では、普通のエクスプローラでは、どうすればよいのでしょうか?


フォルダの上で右クリックメニューの『エクスプローラ』を選択します。

これ、意外と知られていないみたいです。


おまけ2

とにかく早く、エクスプローラを起動したい場合、スタートボタンの上で右クリックメニュー『エクスプローラ』を選択します。

たぶんこれが、一番早いと思います。(もっと素早いのがあったら教えて!)

■ 2006-12-11 .NET本まるごと & .NET-TIPS

改訂版 プロフェッショナルVB.NETプログラミング

.NETプログラミングにピンポイントで役立つテクニックとヒント集


この2つのリンク先の情報で.NETは事足りるかも!

■ 2006-12-10 信仰とは

今日、某教会で三鷹市教育委員会の委員長さんの講演会があり、久しぶりに行って参りました。

そして、先日、お話しした開祖さまのお言葉をちゃんとメモして参りました。

http://d.hatena.ne.jp/chaichanPaPa/20061126/1164540019

信仰とは、何事も起こらぬ平穏無事を願うものではなく、

人生は次ぎから次ぎへ問題が起こってくるものと覚悟して、

それに立ち向かい、乗越えられる力をつけるためのものなのです。

なぜか、今、このお言葉が、心にすーっと入ってくるんですね。

■ 大切な子供を育てる4つの『離さず』

で、教育委員長さんのお話しですが、三鷹市では、全国に先駆けて、近い地域の小学校と中学校を一緒にして、生徒だけでなく先生の交流も深め、かつ、地域の父兄にボランティアで参加していただき、地域毎にコミュニティを作って、地域全体で生徒を教育して行く方針とのことでした。

また、教育は学校任せでなく、以下のように愛情をもって育て欲しいとのことでした。

なかなか、上手いこと言う。

ウチなんか、まさにそうやって育てたな。だから、みんないい子なんだ。すまん親バカでした。

■ 2006-12-10 しるし

http://musicmovie.blog48.fc2.com/blog-entry-1218.html

最近、この歌に、親子してはまっています。

■ 2006-12-08 OLEからCOM+へ、そして .NET

OLE(ActiveX)は、オーエルイー、オーラ、オーレ Object Linking and Embedding(オブジェクトのリンクと埋め込み)。Microsoft が開発した複合ドキュメントや複合アプリケーションのための技術。現在はActiveXと呼ばれている。


OCX(ActiveXコントロール)は、OLE Control eXtension。OLE のインプロセスサーバーとして動作するコンポーネントオブジェクト。Visual BasicやVisual C++などからパーツとして利用し、複合アプリケーションが作成できる。現在はActiveXコントロールと呼ばれている。


COMは、Component Object Model。コンポーネントオブジェクトモデル。特定の機能だけをもつプログラム部品を組み合わせることによって、アプリケーションの開発をスムーズに行えるようにするもの。オブジェクトによってモジュールを構成するための、ActiveXの核となるインタフェース仕様。従来は、OLEオートメーションと呼ばれていた。


MTSは、Microsoft Transaction Server。Windows NT Server 4.0において、イントラネットなどネットワークを利用した企業システムにトランザクション処理機能を追加するソフトウエア。関連する一連の複数の処理がひとつの処理単位としてまとめて扱われることをトランザクションという。トランザクション処理では、一連の処理がすべて成功か、あるいはすべて失敗かのいずれかであることが保証される。


DCOMは、Distributed COM。インターネットなどのネットワークを介し、別のコンピュータ上にあるCOMコンポーネントを利用することが可能になる。また、DCOMは、Windowsだけでなく、UNIXやMacOSでも用いることが出来るように設計されている。


COM+は、Component Object Model Plus。COMにMTS、DCOMの機能がプラスされたもの。トランザクション、キューイング、ロードバランシング、セキュリティ、IMDB などのサービスを提供するCOMの拡張仕様。COMでは、開発言語がVisual C++やVisual Basicなどに限定されていたが、COM+においては、開発言語は限定されていない。



どうやら、COM+と進化してきたものが、.NETに取り込まれた形になっているらしい…。

■ 2006-12-08 成道会

今日、12月8日は、仏さまこと釈尊がお悟りを開いた日だったような気がする……。

■ 2006-12-07 NewキーワードとCreateObject関数でのオブジェクト作成の違い

NEWキーワードとCreateObject関数はともにオブジェクトを生成しますが、違いはなんでしょうか…。


NEWキーワードの時は、生成するオブジェクト(COM)のインターフェイスが変更されると、参照がタイプライブラリ経由なのでAPまで再コンパイルが必要。

CreateObject関数の時は、参照が引数を元にレジストリ経由なので、COMのインターフェイスが変更されても、APの再コンパイルは必要がない。


したがって、CreateObject関数で生成したオブジェクトへの参照を、実行時バインディングにするならば、タイプライブラリの参照設定も必要ない。

なんか、『タイプライブラリの参照設定』『事前/実行時バインディング』が結構絡んできて分かりづらいですが…。


とりあえず、VBからEXCELを制御するときは、事前バインディングでCreateObject関数が定石のようです(MSが推奨、以下のURL参照)。


■ 2006-12-06 事前バインディングと実行時バインディングの違い

Dim xlsApp As Excel.Application '事前バインディング変数
Dim xlsApp As Object '実行時バインディング変数

事前バインディング変数とは、タイプライブラリを参照して、そのオブジェクトタイプ(型)で宣言する。

実行時バインディング変数とは、Object型で宣言する。


事前バインディングとは、オブジェクトタイプ(型)で宣言した時点でオブジェクトがバインドされる。

実行時バインディングとは、実行した時点でオブジェクトがバインドされる。


事前バインディング(アーリーバインディング)の変数を使うオブジェクトの参照の方が、実行時バインディング(レイトバインディング)の変数を使うオブジェクトの参照よりも処理が高速になる。


また、コーディング段階で、オブジェクトで使われているプロパティやメソッドの構文等が自動メンバ表示されて、誤りがあるとエラー表示される。


歴史的には、実行時バインディングの方が先で、後からの実行速度や自動メンバ表示の機能改善された事前バインディングの方を使うのが推奨される。


しかし、バインドするCOMのインターフェイスが変更される可能のある場合や一つのObject型変数を違うオブジェクトで使い回しするときなどは、実行時バインディングも使われる。


■ 2006-12-05 マイクロソフトでのタイプライブラリとは

マイクロソフト系の技術文書を読んでいると結構出てくるタイプライブラリって何・・・。そこでちょっと調べてみました。


タイプライブラリとは、VBからCOMオブジェクトへアクセスするための「インターフェイス」が格納されているライブラリ。


「インターフェイス」とは、『メソッドやプロパティの宣言の集まり』の事を指します。これはある意味では「クラス」に似ていますが、クラスとは異なり、プログラムコードの「実装」がありません。あくまで、メソッドの定義だけなのです。


しかし、VB6では、インターフェイスを定義することが出来ないため、それらを「タイプライブラリ」という物にしておき、それを通してアクセスする事になるのです。使いたいCOMの「タイプライブラリ」はVB6統合環境のメニューのプロジェクトの参照設定で指定できます。


つまり、タイプ ライブラリは、COMオブジェクトで公開されるプロパティおよびメソッド等の型が記述され、COMオブジェクトとスクリプト言語(VB)との間に橋渡しを提供します。


タイプ ライブラリそのものを説明しているページがヒットしなかったけど、VBSからもタイプ ライブラリをアクセスする方法が記述されたページがヒットしたのでご紹介します。


■ 2006-12-04 マイクロソフトでのオートメーションとは

マイクロソフト系の技術文書を読んでいると結構出てくるオートメーションって何・・・。そこでちょっと調べてみました。


普通、自動化のことをオートメーションといいますが、マイクロソフトの場合は、ちょっと違うみたいです。


マイクロソフトでのオートメーションとは、COM (Component Object Model) を使用して、あるソフトウェア コンポーネントが別のソフトウェア コンポーネントとの通信や制御を行う処理のことをいうみたいです。


オートメーションは、Visual Basic や Visual Basic for Applications (VBA) などの言語で使用される大部分のコンポーネント間通信の基盤であり、大半のプログラムで標準的に使用されるようになっている。


つまり、オートメーションとは、開発者が VB,VBAやVC++等のコードを使ってソフトウェア オブジェクトを作成し制御できるようにするための、コンポーネントオブジェクトモデル(COM)テクノロジーです。



実は、このテクノロジーはWINDOWSのキーテクノロジーで、16ビット時代のVBXからの流れを汲み、OLE,OCX,OLE2,OLEオートメーション,COM,DCOM,MTS,COM+と進化して来ているみたいです。

■ 2006-12-03 よかった探しリース(2006年)

ようこそ、ちゃいちゃんパパのページへ!

このページは結城浩さんの『よかった探しリース』に参加しています。


<<--左手

右手-->>


実は、去年、父の介護で大変な思いをして、今年の初めに亡くなり、

その後、介護による連続休暇等が原因でのリストラ(1月に)や相続などでいろいろと忙しい一年でした。

2月から新しい職場で今日までリストラされずに働かさせて貰っています。

とりあえず、良かったことは3つだけど、悪かったことは沢山あるよ。

でも、今、こうして暮らしていけることが、本当によかったと思える今日この頃です。

追記(2006/12/13)

しかし、リースを巡回すると、なぜか途中でPCがストールする。

WIN98でスピード3Mだからかな……。

あと、勝手にウィンドウが開くのは勘弁して欲しい。

また、不明なプログラムのインストール強要も勘弁ね!

■ 2006-12-03 末日を求めるには

月の末日を求めるには、うるう年の計算とかで、結構やっかいです。

そこで、IsDate関数を使って末日を31日からデクリメントして求めていけば、うるう年の計算を考慮しないで済むわけです。

Private Sub Command1_Click()
     Dim strMatujitu As String
     
     strMatujitu = GetMatujitu(Now)
End Sub
Public Function GetMatujitu(MyDate As String) As String
     Dim strWkDate    As String
     Dim vntMatubi    As Variant
     
     strWkDate = Year(MyDate) & "/" & Format(Month(MyDate), "00") & "/31"
     vntMatubi = 30
     '日付として認識できるまで繰り返す
     Do While Not IsDate(strWkDate)
          strWkDate = Year(MyDate) & "/" & Format(Month(MyDate), "00") & "/" & vntMatubi
          
          '1日前にする
          vntMatubi = vntMatubi - 1
     Loop
     GetMatujitu = strWkDate
End Function

尚、日にちのデクリメントには、DateAdd関数が使えそうですが、存在しない日をDateAdd関数の第3引数に渡すとエラーとなりました。