ChaichanPapa-World !

燈明日記(2006/09

◆ インデックス

◆ 2006年9月

■ 2006-09-30 MS-WORDの使い方 FOR プログラマ 16:31

普段、メモ帳やテキストエディターしか使わない人(もちろん私)が、たまに、MS-WORDで文章を書くと、とりあえず、2つの概念の壁にぶち当たります。

  1. ページの概念の壁
  2. 書式の概念の壁

1は、各ページのトップに見出しが来るようのしたいのだけれど、修正するたびに、ずれるずれる。

これは、Ctrl+Enterで解決。とにかく、ページの最後にはCtrl+Enterを!


2は、文字のコピー&ペーストで、なんで書式までコピーされるんや!

どう考えたって、書式は、貼り付け先に合わせるべきだろ・・・。

これは、「貼り付けオプション」でなんとか、私の場合は、マクロを組んでショートカットに割り付けた。


これで、2つの壁は乗り越えられました。


つぎに、MS-WORD2003は、以下の4つのスタイル指定をもっていて、その指定を使って文書構造を明示します。

  1. 段落
  2. リスト
  3. 文字

段落には、見出しや項番が先頭にあるのが普通で、見出しには、段落スタイルの見出し書式を指定します。

すると、目次を作る時に自動的にこの見出しが使用されるのです。

また、項番は、自分で書き込むのでなく、メニューから段落番号指定をすると、以後の見出し書き込み時に自動採番してくれるのです。

つまり、目次も項番も自分で書くのでなく、ワードが自動的にやってくれるのです。


このように、文書構造をHTMLでマークアップするのと同じ感じで、スタイル指定&書式指定でワード文書を作成することが出来るのです。

ワードもなかなか楽しいな・・・と思えるようになってきた今日この頃です!

■ 2006-09-29 URL強制変更 22:55

約7年掛けて更新してきたサイトのURLが、一日にして強制変更させられた!!

グーグルページランク5で、法華経ナンバーワンサイトが、すべて振り出しになってしまった【残念】。

自サイトの約8千ページのリンクも、新しいURLへ変更しないとならない(実はもう90%完了)。

■ 2006-09-29 VBSでのファイル入出力 22:55

VBS(VBスクリプト)が他のVB系との一番の違いは、変数の型がvariantしかなく、ファイル入出力がストリームしかないことだと思います。

つまり、従来のファイルに対してのオープンクローズでなく、ストリームオブジェクトに対してのオープンクローズ操作になるのです。

また、変数はvariantしかないので、型を宣言する必要がなく、関数のリターン値の型も宣言する必要がなのです。

ストリームオブジェクトを使ったファイルコピーのサンプル
WScript.Echo "TEST開始"
If TestFileCopy = 0 then
 WScript.Echo "コピー正常"
Else
 WScript.Echo "コピー異常"
End if
WScript.Echo "TEST終了"
WScript.Quit(0)

Function TestFileCopy()
'----------------------------------------------------
'TEST testIn.csv copy to testOut.csv
'----------------------------------------------------
const ForReading = 1, ForWriting = 2, ForAppending = 3
Dim strPathIn
Dim strPathOut
Dim fs, fr, fw
Dim intSts

 strPathIn = "testIn.csv"
 strPathOut = "testOut.csv"
  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
    fw.WriteLine fr.ReadLine
  Loop

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

尚、OpenTextFileの第3引数は、省略可能で、Trueを指定した場合は、ファイルがなければ新規に作成するという指定になります。

■ 2006/09/29 22:55 22:55

25200

■ 2006-09-28 VBでのハッシュ配列について 19:38

VBでもPerlのようにハッシュ配列(連想配列)が利用できます。

VBでのハッシュ配列サンプル
Dim objPcToBumon As Object
Dim strBumonMei_soumu As String
Dim strBumonMei_jinji As String

Set objPcToBumon = CreateObject("Scripting.Dictionary")

Call objPcToBumon.Add("PC名01", "総務部")
Call objPcToBumon.Add("PC名02", "人事部")

strBumonMei_soumu = objPcToBumon("PC名01")
strBumonMei_jinji = objPcToBumon("PC名02")

あと、Existsメソッドで要素有無の確認、Removeメソッドで要素削除が出来る。

■ 2006-09-28 オブジェクトの破棄 19:38

オブジェクトを使ったあとに結構気になるのが、後始末処理のオブジェクトの破棄です。

VB6では、オブジェクトを生成したとき、オブジェクトのインスタンス毎に、オブジェクト内部の参照数がカウンタアップされます。

オブジェクトの破棄をするためには、参照数を減らしてゼロすると即座に破棄されるとのことです。

そして、参照数を減らすには、使っているオブジェクト変数にSetステートメントでNothingするか、別オブジェクトを代入します。

また、オブジェクト変数がスコープ外やプログラム終了時にも破棄されるとのことです。

ただし、例外ケースもあるとのことなので、プログラム終了前には、必ず、Nothingしましょう。異常終了の割り込み処理の所にもね。

また、Nothingの前に、CloseメソッドやDisposeメソッドが必要なオブジェクトもあるので注意が必要です。

■ 2006-09-28 BCPコマンドでDBアクセス! 19:38

Microsoft SQL Serverのユーティリティに、DBのデータを汎用的にコピーするBCPコマンドというものがあります。

コピーすることに関しての使用パターンはいろいろ広いのですが、とりあえず、一番必要と思われる DB to CSVテキストを紹介します。

それには、まず、TestBCP.vbsとTestBCP.fmtを用意します。

それらの内容は以下の通りで、XDBName.dbo.XtableテーブルからTestBCP.csvファイルへデータをコピーします。

VBSでBCPを使用した場合のソース(TestBCP.vbs)
Option Explicit
Dim shell, bcpcmd

 Set shell = WScript.CreateObject("WScript.Shell")

        'SQLを編集する
 bcpcmd = """select LogDate, Host, Path  from XDBName.dbo.Xtable " & _
                   """ queryout TestBCP.csv " &_
                   "-P xxxx -f TestBCP.fmt > TestBCP.log"

        'コマンドを発行
 shell.run "cmd /C ""bcp " & bcpcmd & """", 0, True
 
 Set shell = Nothing
 WScript.Quit(0)


フォーマット指定ファイルのソース(TestBCP.fmt)
8.0
3
1       SYBCHAR       0       8       ","                   1     LogDate         ""
2       SYBCHAR       0       65      ","                   2     Host            ""
3       SYBCHAR       0       512     "\r\n"                3     Path            ""

8.0はバージョン番号、3はデータのフィールド数(サンプルでは3)、

左1列目は、フィールドのシーケンス番号

左2列目は、データ型でCSVテキストではSYBCHARとなる

左3列目は、プレフィックス長でCSVテキストでは0となる

左4列目は、フィールド長で項目毎に指定

左5列目は、フィールドの終端文字でCSVの時は、『,』で、最後の項目は『\r\n』

左6列目は、とりあえず、左1列目と同じでよいみたい

左7列目は、フィールド名

左8列目は、とりあえず、『""』でよいみたい

参考 http://www.systeminfinity.co.jp/sub/tech/doc/SQLServer_BCP/BCP1.html

19:47

25059

■ 2006-09-27 MS-WordでのちょっとしたTips 21:34

とりあえず、Word初心者に送る(また私)ちょっとしたTipsです。

■ 2006-09-27 MS-Wordのコピー&ペーストで書式を貼り付け先に合わせるには? 21:34

「貼り付けオプション」を使って選択すれば、可能ですが、一発操作でなんとかやりたい…。

そこで、「貼り付けオプション」のデフォルト値を変える方法を探してみましたが、ありませんでした。

しかし、マクロ(VBA)を使うと一発操作が可能だということが以下のページでわかり、やってみました。いい感じです。

要は、PasteAndFormatメソッド使って、「書式を貼り付け先あわせる(wdFormatSurroundingFormattingWithEmphasis)」をセットしてやる。

そして、このマクロを適当なショートカットキーに割り当てる(私はCtrl+bに割り当てた)

尚、ショートカットキーの割り当て方も、上記のページに載っています。

■ 2006-09-27 MS-Wordで『音声認識データを保存する十分な空き領域がないため、データは失われました』を黙らせるには? 21:34

メニューのツール->オプション->保存タグで「言語データの埋め込む」のチェックを外す。

■ 2006-09-27 2006/09/27 21:46 21:45

24900

■ 2006-09-25 「教えの流れ」を追加 22:15

教えの流れ

よろしければ、どうぞ!

■ 2006-09-25 はじめてのExcel関数 22:15

Excel関数を使用したことないEXCEL素人の方(実は私)に送る『はじめてのExcel関数』です。

EXCELを起動すると普通3つのシート(Sheet1〜3)がついて、Sheet1の行と列で構成される表が表示される。そして、表を構成する一つ一つのます目は、セルと呼ばれています。

セルには、普通データを格納しますが、実は、データ以外にも数式を格納することができます。数式には、他のセルの値の四則演算はもちろん、Excel関数というものが利用できます。

Excel関数についての具体的な使用方法や種類は、Excel関数についての解説サイトがたくさんありますので、そちらに譲り、ポイントだけメモします。

例、IF関数、AND関数、OFFSET関数、ROW関数、OR関数を使った数式のサンプル
=IF(AND(OFFSET(CellKoike,ROW(),0,1,1)="○",OR(A1="△",A2="△")),"△","")
Excel関数解説サイト

しかし、セルの中の沢山の関数を組み合わせた一行の式は、なんとなく、複雑なSQLや正規表現と似ているな。

なれていないせいかもしれないけれど、普通のプログラムより数段難しい気がします。そういえば、SQLや正規表現もはじめはそう思った…。

■ 2006-09-25 セルの中の数式は、なんと呼ぶ? 22:15

EXCEL使いの世界では、セル中に記述する数式に対して、いろいろな呼び方をしているみたいです。

で、結局、すべて「数式」の呼び方で良いみたい。しかし、Excel初心者泣かせだ・・・。

参考:http://hpcgi1.nifty.com/kenzo30/a_cbbs/cbbs.cgi?mode=al2&namber=89815&rev=&no=0&P=v61k3

■ 2006-09-24 ファルコン準優勝!! 17:51

今日(9/24)、東京府中のNECニューライフプラザ体育館で、東京都ミニバスケット優勝大会の決勝戦がありました。

うちの三男坊のまちゃがファルコンというチームで出場しました。

上位4チームの総当たり戦で、2勝1敗の準優勝、東京都2位になりました!!

これは、ファルコン史上2番目の快挙です。

ちなみに、1番目の快挙は長男の時の全国3位ですが・・・。すみません、完全に親ばかです。

事実上、2位決定戦の「清瀬」との戦いは、壮絶を極め、終了1分前までリードしていたが、逆転され、シーソーゲームへ、同点まま、終了3秒前に逆転、怒涛の歓声のなか試合終了!!

歓喜に両腕を振り上げる「ファルコン」の子供達、泣き崩れる「清瀬」の子供達、明暗がクッキリと分かれてしまいました。

そして、1位の「宮城」とともに関東大会の出場権を獲得。これからが、また大変だ・・・。

■ 2006-09-24 VB6からEXCELを制御するには 17:52

VBAは内部からEXECLを制御しますが、VB6なら以下のサンプルのように外部からも制御ができます。

注意点としては、シートやブックのメソッドやプロパティは、必ずオブジェクト名変数で修飾します。

アクティブになっているシートなどのメソッドやプロパティは、オブジェクト名修飾なしでも、あたかも問題なく動いているようですが、水面下で問題(メモリリーク)を起こしているとのことです。

また、アーリーバインディングとは、事前バインディングことで、実行時バインディング(レイトバインディング)より一般的に処理が速くなり、コーディング時は、自動メンバ表示等をしてくれます。

あと、インスタンス生成は、CreateObjectを使用します(EXCELに関してMSが推奨)。

VB6からのEXCEL制御サンプル
'変数は宣言を必須とする。
Option Explicit 
Sub main()

    'エラー割り込みがあったら、次のステップから実行する。
    On Error Resume Next

    'アーリーバインディング(ちなみにレイトバインディングはObject型で宣言する)
    Dim xlsApp    As Excel.Application

    'ブックオブジェクト名変数の宣言
    Dim bokBook   As Excel.Workbook

    'シートオブジェクト名変数の宣言
    Dim shtWork   As Excel.Worksheet

    'EXCELのときは、Newではなく、CreateObjectでインスタンスする。
    Set xlsApp = CreateObject("Excel.Application")

    'ブックをオープンする。
    Set bokBook = xlsApp.Workbooks.Open("C:\TEST01.xls")
    
    'シートのオブジェクトを格納する。
    Set shtWork = bokBook.Worksheets(1)
    
    'シート内のセルの編集する
    shtWork.Cells(1, 1).Value = "12345"  
    shtWork.Cells(2, 1).Value = "ABCDEF"
    shtWork.Cells(1, 2).Value = "2006/08/25"
    shtWork.Cells(2, 2).Value = 98765
    
    'ファイルを保存する。
    bokBook.Save

    '終了処理をする。
    xlsApp.Quit
    Set shtWork = Nothing
    Set bokBook = Nothing
    Set xlsApp = Nothing
End Sub

■ 2006-09-23 「供養とは何か?」を追加 20:02

供養とは何か?

よろしければ、どうぞ!

■ 2006-09-23 EXCELでの日付データ読み込みの注意点 20:02

CSVファイルをクリックして、日付データのフィールドを含むCSVやTSVファイルを読み込むと、デフォルトでは、文字列形式ではなく、日付形式になって表示が想定外になってしまいます。

そんな時は、EXCEL本体から起動して、そのCSVファイルを読み込むと『テキストファイルウィザード』が起動され、そこで文字列形式を指定して読み込むことが出来ます。

■ 2006-09-23 チェンジドライブ・ディレクトリの注意点 20:02

VB上でChDir(チェンジディレクトリ)関数の処理をする場合は、必ず、ペアでChDrive(チェンジドライブ)関数の処理もしましょう!

インストール先のドライブが想定出来ないので、想定外のドライブにインストールされると、突然、動かなくなります。

また、同じロジックでも、VBAでは動いて、VB6だと動かなくなるケースもあります。これは、ブック(VBA)が別ドライブでも、EXCEL本体とChDirで指定したファイルが同じディレクトリならChDriveしなくても動いてしまうのです。

■ 2006-09-23 ファイルアクセスでのデフォルトパスの注意点 20:02

実行ファイルからデータファイルにアクセスする時、同じフォルダーの場合は、問題ないのですが、ChDirするロジックが追加されたりすると、カレントフォルダーが変わって、従来動いていたデータファイルのアクセスが動かなくなります。

したがって、データファイルにアクセスする時は、必ず、フルパス指定にしましょう。

ちなみに、実行ファイルのあるフルパスは、特殊オブジェクトAppのPathプロパティです。

■ 2006-09-23 GotoでなくResumeを使え! 20:02

On Error Gotoでエラーハンドラに割り込みが発生した場合に、エラーハンドラ内の処理後、普通Resumeで同じ行か、または、Resume Nextで次の行に戻ります。しかし、どこかのラベル(Labelxx)へ飛ばす時は、普通Gotoを考えてしまいますが、これもResume Labelxx を使用します。

Goto LabelxxでもとりあえずOKみたいなのですが、その後のプログラムの振る舞いがResume Labelxxと微妙に違ってきます。

ということで、Resume Labelxxを使いましょう。

ちなみに、Labelxxは、あなたが任意につけたラベル名です。

■ 2006-09-23 コマンドプロンプトのMicrosoft Telnetで文字化けが発生したら 20:02

telnetでサーバーにログインした時に漢字が文字化けすることがよくあります。そのような時は、setコマンドでcodesetに文字化けしない漢字コード指定をします。

手順は、まず、コマンドプロンプトでtelnetと入力すると以下の『Microsoft Telnet>』プロンプトが表示されます。

つぎに、『set ?』を入力するとcodesetで指定できる漢字コード一覧がでますので、文字化けしなそうな文字コードを選びます。

以下サンプルは、サーバーの漢字コードがEUCの場合です。

Microsoft Telnet>set ?
               (プロパティや漢字コード一覧が表示される)
Microsoft Telnet>set Japanese EUC
Microsoft Telnet>open 172.xxx.xxx.xxx

■ 2006-09-22 VBでの漢字チェックルーチン 20:25

VBは文字コードにUnicodeを採用しています。

Unicodeの漢字の正規表現は、以下でほぼ間違いないそうです。(参考:http://d.hatena.ne.jp/toton/20051102/1130971334)

[一-龠]+|[ぁ-ん]+|[ァ-ヴ]+]+|[a-zA-Z0-9]+

したがって、VBでの漢字チェックルーチンは以下の感じです。

Public Function CheckKanji(strIn As String) As Boolean
    
    Dim RE As New RegExp

    RE.Pattern = "[一-龠]+|[ぁ-ん]+|[ァ-ヴ]+]+|[a-zA-Z0-9]+"

    If RE.Test(strIn) Then
        'MsgBox "入力文字列には、漢字が含まれてます。"
        CheckKanji = True
    Else
        'MsgBox "入力文字列には、漢字が含まれていません。"
        CheckKanji = False
    End If

End Function

■ 2006-09-22 EXCEL系制御での『アプリケーション定義またはオブジェクト定義のエラー』について 20:25

たとえば、DBからデータをSQLして、そのデータをEXCELのセルに代入するとします。

このとき、ノーチェックだと『アプリケーション定義またはオブジェクト定義のエラー』が発生する場合があります。

これは、セルに格納するデータの先頭に『=』が入っていると文字列だと見なさず、数式扱いされ、『=』の以降が定義エラーになると思われます。

したがって、代入する文字列の先頭に『=』がある場合は、『'』を『=』の前に付加してやると数式でなく文字列扱いされ、正常に処理されます。

'イメージサンプル
 
           for lngIdx = 0  to UBound(datDB) step 1
               If (Mid(datDB(lngIdx).strURL, 1, 1) = "=") Then
                    'セルデータの一カラム目が『=』のときは、数式になるため、『'』を先頭に付加して文字列にする。
                    strWk = datDB(lngIdx).strURL
                    datDB(lonIdx).strURL = "'" & strWk
                End If
                shtSheet.Cells(lngIdx, 1) = datDB(lngIdx).strURL
           Next

■ 2006-09-22 ADOでのDBアクセス時間切れについて 20:30

VBでADOを使ってDBアクセスしていると、データ量が少ないときは問題がないのですが、莫大な量になってくると「アクセス時間切れ」が発生するようになります。

そのような時は、CommandTimeoutプロパティを調整すれば、いいらしい。

Dim objRS  As ADODB.Recordset
Dim strSQL As String

strSQL = "select * from Xtable"

Set objRS  = New ADODB.Recordset
con.CommandTimeout = 100        '<------ 単位は秒でタイムアウト時間を指定できる。
objRS.Open strSQL, con, adOpenFormwardOnly

タイムアウトの時間は一度設定したらディスコネクトするまで保持されます。 したがって、遅い処理が終わったら再度小さい値にセットした方がいいです。 デフォルトは30秒です。

尚、conは、ADODB.Connectionオブジェクトです。

■ 2006-09-22 VBAでのコマンドライン引数の取得 20:30

普通、VBAには、コマンドラインからの引数は渡せません。

しかし、VBSをかますことにより、あたかも、コマンドラインからの引数を渡すことができます。

以下がサンプルです。

要は、VBSでEXCELのシートのセルに引数の値を書き込み、それをVBAで取得するわけです。

かましたVBSのスクリプト

Dim my_name
Dim my_para
Dim xlsApp
Dim bokWork

'コマンドラインの引数の個数チェック    
If WScript.Arguments.Count <> 2 Then WScript.Quit

'ブック名(.xls)取得(コマンドライン第1引数)
my_name = WScript.Arguments(0)

'コマンドラインの引数を取得(コマンドライン第2引数)
my_para = WScript.Arguments(1)

Set xlsApp = WScript.CreateObject("Excel.Application")
xlsApp.Visible = True

Set bokWork = xlsApp.Workbooks.Open(my_name)
bokWork.Worksheets(1).Cells(1, 1).Value = my_para
xlsApp.Run "GetHikisuu"

Set bokWork  = Nothing
Set xlsApp = Nothing
WScript.Quit

引数を受け取る側のVBA

'my_nameで指定するxlsファイルの標準モジュール
Sub GetHikisuu()
    MsgBox Worksheets(1).Cells(1, 1).Value
End Sub

コマンドプロンプトからの引数を指定しての起動

'コマンドラインから引数を指定して実行
WScript.exe GetPara.vbs "C:\Test01.xls" "abc"

尚、本サンプルは、http://www.vbasekai.com/vbscript.html#vbs0004を大変参考にさせて頂きました。

■ 2006-09-18 「秋のお彼岸会」と「複数の一神教」を追加 13:21

秋のお彼岸会

複数の一神教

よろしければ、どうぞ!

■ 2006-09-18 MS-SQLサーバーで日付をWhereするには 13:21

日付データをWhereする時、普通の文字列と同じように考えてしまい、残念な思いをすることがよくあります。普通、日付データは、文字列型ではなくdatetime型です。 datetime型をWhereするときは、以下のような単一引用符 (') で囲まれた形式の文字列が、実は日付時刻データとして認識されるのです。

数値日付形式 ('1998/4/15'、'1998-4-15'など)

区切りのない文字列形式 ('19981207'、'December 12, 1998' など)

尚、日付の年月日形式(ymd)は、SQL Serverのdefault languageで決まります。 ymd (年、月、日)の順は、default languageがJapaneseの場合です。

また、datetime型データには、日付データだけでなく時刻データも入っているので、大小比較は注意が必要です。

たとえば、2006/09/13のデータが欲しいときは

Where YMD = '2006/09/13'

でなく

Where YMD >= '2006/09/13' And YMD < '2006/09/14'

となります。

YMD = '2006/09/13' だと YMD = '2006/09/13 00:00:00.000' と等価になってしまうのです。

ちなみに、文字列型ではないので、'2006/09/13' を'2006-09-13'または、'20060913'としても問題ありません。('2006/9/13' 、'2006-9-13'でもOK、しかし、'2006913'はNG)

尚、SQL Server には、datetime 型以外に smalldatetime 型 (短精度日付/時間型) があります。

また、時刻だけまたは日付だけを個別に格納するデータ型はありません。 datetime 型または smalldatetime 型の値を設定する場合、時刻だけを指定すると、日付のデフォルト "January 1, 1900" が使用されます。日付だけを指定すると、時刻のデフォルト "12:00AM (深夜)" が使用されます。

■ 2006-09-13 VBAでブックのパスを求める方法 22:13

以下のプロパティで、EXCELブックのフルパスが求められます。

ActiveWorkbook.FullNameURLEncoded

■ 2006-09-13 VBでのスリープ処理 22:13

VBではAPIでスリープ処理を行います。単位は1000ミリセコンドです。つまり1000指定で1秒。

例では、1分スリープ。

    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Sleep 1000 * 60 

■ 2006-09-13 VB6の実行ファイル(exeファイル)をリリースするには 22:13

VBで作成したプログラムは、作成したプログラム以外にもランタイムDLL等が必要な時代がありました。

しかし、最近は、exeファイルだけでも大丈夫ですね。ネットで以下のメッセージをみつけました。


Windows Me/2000以降のOSにはVB6ランタイムが最初から含まれています。

■ 2006-09-13 VBSでのコマンドライン引数の取得 22:13

VB6では、Commmand関数でコマンドライン引数を取得できますが、VBSでは、Commmand関数がありません。ではどうするかというと、以下の感じです。

Set args = WScript.Arguments
msgbox "引数の数は" & args.Count & "で、第1引数は" &  args.item(0) & "で、第2引数は" &  args.item(1) & "です。"
'起動方法(DOSコマンドラインまたは、「ファイル名を指定して実行」ダイアログから)
wscript.exe "C:\args.vbs" "abc" "123" 

■ 2006-09-10 観世音菩薩普門品 第二十五 更新 13:21

観世音菩薩普門品 第二十五


よろしければ、どうぞ!

■ 2006-09-10 ログオンユーザID取得時の謎の異常終了 13:21

VBでのWINDOWSのログオンユーザID取得は、APIを使用しますが、それでも一筋縄では取得できません。

どこが一筋縄でないかというと、普通にGetUserNameでゲットするとString型のエリアを壊してしまうのです(たぶん)。そして、異常終了。

VBの仕様では、String型は2Gバイトまで自動拡張で代入できるはずなのにです。

これは、String型への代入の方式が、VBの世界ではエリアを確保したあと代入するのにたいして、APIの世界では、いきなり代入してしまうのかなと思う次第です。

したがって、あらかじめエリアを確保したあと、代入するとGetUserNameでも上手くログオンユーザIDが取得できます。

しかし、まだ、以下の条件があります。

GetUserNameで取得するログオンユーザIDのサイズはMAXで256。

取得したログオンユーザID文字列の最後の文字の直後にゼロが入っている。

したがってエリア的には、257バイト確保。上記を踏まえてコーディングすると以下のような感じになります。

    Declare Function GetUserName Lib "advapi32.dll" _
            Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
    
    Const UNLEN = 256
    Dim intPos As Integer
    Dim strUserNameBuffer As String

    'ユーザー名を取得
    strUserNameBuffer = Space(UNLEN + 1)
    GetUserName strUserNameBuffer, UNLEN
    intPos = InStr(strUserNameBuffer, Chr$(0))
    If intPos > 0 Then
        strUserNameBuffer = Left$(strUserNameBuffer, intPos - 1)
    End If

■ 2006-09-09 妙法蓮華経 妙音菩薩品 第二十四 更新 20:11

妙法蓮華経 妙音菩薩品 第二十四


よろしければ、どうぞ!

■ 2006-09-09 Cells形式からRange形式に変換 20:11

VBAでは、セル指定に2通りの形式があります。計算機よりのCellsと人間よりのRangeです。

Cellsでセルの配列処理をしたあと、そのセルにたいしてSELECTしたい場合は、Rangeを使います。そのときCells形式からRange形式へ変換が必要になるのです。

その変換には、CellsのAddressメソッドでRange形式に変換を行います。

calls(1, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False)

で、

A1

ちなにみ、正式には、Cells形式をR1C1形式、Range形式をA1形式と云うらしい。

一番初めのセルを行(Row)1、列(Column)1と指定するR1C1形式。

一番初めのセルをA列の1行と指定するA1形式。

■ 2006-09-09 DOSウィンドウをそのままにするには 20:11

通常、BATファイルを実行するとDOSウィンドウが一瞬立ち上がりますが、ずっと立ち上がりのままにするには、cmd.exeコマンドでkオプションを指定します。

(例)

C:\WINDOWS\system32\cmd.exe /k "schtasks"

■ 2006-09-06 悪魔の部屋 追加 20:51

悪魔の部屋


よろしければ、どうぞ!

■ 2006-09-06 VBからDOSコマンドを順番に処理するには 20:51

VBAまたはVBSからWSHで複数のDOSコマンドを起動する時に、コマンドが順番に実行しないでバラバラに処理される場合があります(デフォルト)。すると、意図しない結果に終わって残念な思いをします。

このような場合は、Runメソッドの第3引数をTrueにすると順番に処理されます。

Dim WshShell As Object

Dim strWkcmd As String

Set WshShell = CreateObject("Wscript.Shell")

strWkcmd = Environ("ComSpec") & " /c ""schtasks /create /TN (以下略)

WshShell.Run strWkcmd, 0, True

strWkcmd = Environ("ComSpec") & " /k ""schtasks """

WshShell.Run strWkcmd, 0, True

■ 2006-09-03 第18話:未来釈尊(WCRP)追加 11:39

第18話:未来釈尊(WCRP)


よろしければ、どうぞ!

■ 2006-09-03 ファイル名に年月日を入れてリネームするには 11:39

とあるファイルを、DOSコマンド(date)でファイル名に日付を付加して保存したい場合、以下のようにすると安全です。

dateコマンドの振る舞いがバージョンによって異なる場合があり、dateコマンド出力結果のお尻から指定すると良いようです。

XLOG.csvをXLOG20060814.csvへリネーム

rename XLOG.csv XLOG%date:~-10,4%%date:~-5,2%%date:~-2,2%.csv

たとえば、『~-10,4』でdateコマンド出力結果のお尻から頭に向かって10桁目がトップで、そこから4桁分を取得。

echo %date%

2006/08/14

echo %date:~-10,4%

2006

echo %date:~-5,2%

08

echo %date:~-2,2%

14

参考URL

http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html#ope

■ 2006-09-02 薬王菩薩本事品 第二十三 更新 11:41

薬王菩薩本事品 第二十三

よろしければ、どうぞ!

■ 2006-09-02 VB系でメール送信するには 11:41

VB系でメール送信するには、とりあえず3種類の方法があります。

  1. WINDOWS標準オブジェクトのCDO(コラボレーション・データ・オブジェクト)を使用する方法。
  2. フリーのメール送信DLL(たとえば、BASP21 DLL)を使う方法
  3. MAPIでOutlookExpressの機能を使う方法。

各々、メリットデメリットがありますが、やはり、WINDOWS標準オブジェクトCDOを使うのがベターかも。

■ 2006-09-01 妙荘巌王本事品 第二十七 更新 20:41

妙荘巌王本事品 第二十七

よろしければ、どうぞ!

■ 2006-09-01 EXCELでのCSVファイル出力仕様 20:41

EXCELやDBへのデータ移行で一般的なCSVファイルは、実は、統一的な仕様はないとのことです。

しかし、事実上、EXCELでのCSVファイル出力仕様が、デファクトスタンダードなっています。

デファクトスタンダードの仕様は以下の2つがポイントです。

1、項目データ中にカンマがある時は、その項目のみダブルクォーテーションで囲む(すべての項目をダブルクォーテーションで囲まないので注意)。

  aaa,bbb,"ccc,ccc",dddd

2、項目データ中にダブルクォーテーションがある時は、ダブルクォーテーションを2つ並べる。

  aaa,bbb,"ccc""ccc",dddd

結構この仕様をしっている人は、意外に少ないようです。

ちなみに、デファクトスタンダードのデファクト(de facto)は英語ではなく、ラテン語だそうです。