◆ インデックス
- 2006-09-30 MS-WORDの使い方 FOR プログラマ
- 2006-09-29 URL強制変更
- 2006-09-29 VBSでのファイル入出力
- 2006-09-28 VBでのハッシュ配列について
- 2006-09-28 オブジェクトの破棄
- 2006-09-28 BCPコマンドでDBアクセス!
- 2006-09-27 MS-WordでのちょっとしたTips
- 2006-09-27 MS-Wordのコピー&ペーストで書式を貼り付け先に合わせるには?
- 2006-09-27 MS-Wordで『音声認識データを保存する十分な空き領域がないため、データは失われました』を黙らせるには?
- 2006-09-25 「教えの流れ」を追加
- 2006-09-25 はじめてのExcel関数
- 2006-09-25 セルの中の数式は、なんと呼ぶ?
- 2006-09-24 ファルコン準優勝!!
- 2006-09-24 VB6からEXCELを制御するには
- 2006-09-23 「供養とは何か?」を追加
- 2006-09-23 EXCELでの日付データ読み込みの注意点
- 2006-09-23 チェンジドライブ・ディレクトリの注意点
- 2006-09-23 ファイルアクセスでのデフォルトパスの注意点
- 2006-09-23 GotoでなくResumeを使え!
- 2006-09-23 コマンドプロンプトのMicrosoft Telnetで文字化けが発生したら
- 2006-09-22 VBでの漢字チェックルーチン
- 2006-09-22 EXCEL系制御での『アプリケーション定義またはオブジェクト定義のエラー』について
- 2006-09-22 ADOでのDBアクセス時間切れについて
- 2006-09-22 VBAでのコマンドライン引数の取得
- 2006-09-18 「秋のお彼岸会」と「複数の一神教」を追加
- 2006-09-18 MS-SQLサーバーで日付をWhereするには
- 2006-09-13 VBAでブックのパスを求める方法
- 2006-09-13 VBでのスリープ処理
- 2006-09-13 VB6の実行ファイル(exeファイル)をリリースするには
- 2006-09-13 VBSでのコマンドライン引数の取得
- 2006-09-10 観世音菩薩普門品 第二十五 更新
- 2006-09-10 ログオンユーザID取得時の謎の異常終了
- 2006-09-09 妙法蓮華経 妙音菩薩品 第二十四 更新
- 2006-09-09 Cells形式からRange形式に変換
- 2006-09-09 DOSウィンドウをそのままにするには
- 2006-09-06 悪魔の部屋 追加
- 2006-09-06 VBからDOSコマンドを順番に処理するには
- 2006-09-03 第18話:未来釈尊(WCRP)追加
- 2006-09-03 ファイル名に年月日を入れてリネームするには
- 2006-09-02 薬王菩薩本事品 第二十三 更新
- 2006-09-02 VB系でメール送信するには
- 2006-09-01 妙荘巌王本事品 第二十七 更新
- 2006-09-01 EXCELでのCSVファイル出力仕様
◆ 2006年9月
■ 2006-09-30 MS-WORDの使い方 FOR プログラマ
普段、メモ帳やテキストエディターしか使わない人(もちろん私)が、たまに、MS-WORDで文章を書くと、とりあえず、2つの概念の壁にぶち当たります。
- ページの概念の壁
- 書式の概念の壁
1は、各ページのトップに見出しが来るようのしたいのだけれど、修正するたびに、ずれるずれる。
これは、Ctrl+Enterで解決。とにかく、ページの最後にはCtrl+Enterを!
2は、文字のコピー&ペーストで、なんで書式までコピーされるんや!
どう考えたって、書式は、貼り付け先に合わせるべきだろ・・・。
これは、「貼り付けオプション」でなんとか、私の場合は、マクロを組んでショートカットに割り付けた。
これで、2つの壁は乗り越えられました。
つぎに、MS-WORD2003は、以下の4つのスタイル指定をもっていて、その指定を使って文書構造を明示します。
- 段落
- リスト
- 表
- 文字
段落には、見出しや項番が先頭にあるのが普通で、見出しには、段落スタイルの見出し書式を指定します。
すると、目次を作る時に自動的にこの見出しが使用されるのです。
また、項番は、自分で書き込むのでなく、メニューから段落番号指定をすると、以後の見出し書き込み時に自動採番してくれるのです。
つまり、目次も項番も自分で書くのでなく、ワードが自動的にやってくれるのです。
このように、文書構造をHTMLでマークアップするのと同じ感じで、スタイル指定&書式指定でワード文書を作成することが出来るのです。
ワードもなかなか楽しいな・・・と思えるようになってきた今日この頃です!
■ 2006-09-29 URL強制変更
約7年掛けて更新してきたサイトのURLが、一日にして強制変更させられた!!
グーグルページランク5で、法華経ナンバーワンサイトが、すべて振り出しになってしまった【残念】。
自サイトの約8千ページのリンクも、新しいURLへ変更しないとならない(実はもう90%完了)。
■ 2006-09-29 VBSでのファイル入出力
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
25200
■ 2006-09-28 VBでのハッシュ配列について
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 オブジェクトの破棄
オブジェクトを使ったあとに結構気になるのが、後始末処理のオブジェクトの破棄です。
VB6では、オブジェクトを生成したとき、オブジェクトのインスタンス毎に、オブジェクト内部の参照数がカウンタアップされます。
オブジェクトの破棄をするためには、参照数を減らしてゼロすると即座に破棄されるとのことです。
そして、参照数を減らすには、使っているオブジェクト変数にSetステートメントでNothingするか、別オブジェクトを代入します。
また、オブジェクト変数がスコープ外やプログラム終了時にも破棄されるとのことです。
ただし、例外ケースもあるとのことなので、プログラム終了前には、必ず、Nothingしましょう。異常終了の割り込み処理の所にもね。
また、Nothingの前に、CloseメソッドやDisposeメソッドが必要なオブジェクトもあるので注意が必要です。
■ 2006-09-28 BCPコマンドでDBアクセス!
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)
- Pオプションの xxxx は、DBのパスワードです。-fオプションの TestBCP.fmt は、CSVに落とすときのフォーマット指定ファイル名です。
フォーマット指定ファイルのソース(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
とりあえず、Word初心者に送る(また私)ちょっとしたTipsです。
- 改ページはCtrl+Enterキーで行う。(実はEnterキーだけで行っていた時は、ずれるずれる)
- 文字列コピーのときは、貼り付け先の右下にでる「貼り付けオプション」で調整する。(なんでデフォルトが、貼り付け先に書式に合わせるでないんだ…)
- 見出しは、見出しの書式で指定すると、自動目次(メニューの挿入->参照->索引と目次)を作成するときの元情報になる。
- 書式のコピー&ペーストのショートカットは、Ctrl+Shift+c & Ctrl+Shift+v。
■ 2006-09-27 MS-Wordのコピー&ペーストで書式を貼り付け先に合わせるには?
「貼り付けオプション」を使って選択すれば、可能ですが、一発操作でなんとかやりたい…。
そこで、「貼り付けオプション」のデフォルト値を変える方法を探してみましたが、ありませんでした。
しかし、マクロ(VBA)を使うと一発操作が可能だということが以下のページでわかり、やってみました。いい感じです。
要は、PasteAndFormatメソッド使って、「書式を貼り付け先あわせる(wdFormatSurroundingFormattingWithEmphasis)」をセットしてやる。
そして、このマクロを適当なショートカットキーに割り当てる(私はCtrl+bに割り当てた)
尚、ショートカットキーの割り当て方も、上記のページに載っています。
■ 2006-09-27 MS-Wordで『音声認識データを保存する十分な空き領域がないため、データは失われました』を黙らせるには?
メニューのツール->オプション->保存タグで「言語データの埋め込む」のチェックを外す。
■ 2006-09-27 2006/09/27 21:46
24900
■ 2006-09-25 はじめてのExcel関数
Excel関数を使用したことないEXCEL素人の方(実は私)に送る『はじめてのExcel関数』です。
EXCELを起動すると普通3つのシート(Sheet1〜3)がついて、Sheet1の行と列で構成される表が表示される。そして、表を構成する一つ一つのます目は、セルと呼ばれています。
セルには、普通データを格納しますが、実は、データ以外にも数式を格納することができます。数式には、他のセルの値の四則演算はもちろん、Excel関数というものが利用できます。
Excel関数についての具体的な使用方法や種類は、Excel関数についての解説サイトがたくさんありますので、そちらに譲り、ポイントだけメモします。
- 数式中のセル指定には、相対指定、絶対指定、名前指定があり、適材適所で使用する。
- 相対指定とは、例えばセルB1に「=A1」とすると、セルB1とセルA1が相対的に関連付けられてA1が参照できる。しかし、セルB1を他にコピーすると相対的な関連付がコピーされ、その相対的な位置にあるセルの参照になる(A1参照でない)。
- 絶対指定とは、例えばセルB1に絶対指定ある「$」を付けて「=$A$1」とすると、セルB1を他にコピーしても、かならずA1が参照できる。
- 名前指定とは、セルに名前をつけて参照する。名前の付け方は、セルを選択しメニューの挿入->名前->定義で設定できる。
- 一つのセルには、普通のプログラムで言う1ステップしか記述できない。 しかし、1ステップの中を入れ子で、いろいろなExcel関数を延々と記述できる。
- 延々と複雑のなった場合は、論理的に小分けして、それをワークセルに振り分けて記述し、その結果を参照すると、わかり易い。
例、IF関数、AND関数、OFFSET関数、ROW関数、OR関数を使った数式のサンプル
=IF(AND(OFFSET(CellKoike,ROW(),0,1,1)="○",OR(A1="△",A2="△")),"△","")
Excel関数解説サイト
- http://www.officepro.jp/excelfunc/index.html
- http://www.eurus.dti.ne.jp/yoneyama/Excel/kih_moku.htm
- http://www.kenzo30.com/excel_kiso3.htm
- http://www.ec.kansai-u.ac.jp/user/amatsuo/celladdrr.htm
しかし、セルの中の沢山の関数を組み合わせた一行の式は、なんとなく、複雑なSQLや正規表現と似ているな。
なれていないせいかもしれないけれど、普通のプログラムより数段難しい気がします。そういえば、SQLや正規表現もはじめはそう思った…。
■ 2006-09-25 セルの中の数式は、なんと呼ぶ?
EXCEL使いの世界では、セル中に記述する数式に対して、いろいろな呼び方をしているみたいです。
- 数式
- 関数
- セル関数
- エクセル関数
- シート関数
- ワークシート関数
- 関数式
- 計算式
- リンク式
- リンク
で、結局、すべて「数式」の呼び方で良いみたい。しかし、Excel初心者泣かせだ・・・。
参考:http://hpcgi1.nifty.com/kenzo30/a_cbbs/cbbs.cgi?mode=al2&namber=89815&rev=&no=0&P=v61k3
■ 2006-09-24 ファルコン準優勝!!
今日(9/24)、東京府中のNECニューライフプラザ体育館で、東京都ミニバスケット優勝大会の決勝戦がありました。
うちの三男坊のまちゃがファルコンというチームで出場しました。
上位4チームの総当たり戦で、2勝1敗の準優勝、東京都2位になりました!!
これは、ファルコン史上2番目の快挙です。
ちなみに、1番目の快挙は長男の時の全国3位ですが・・・。すみません、完全に親ばかです。
事実上、2位決定戦の「清瀬」との戦いは、壮絶を極め、終了1分前までリードしていたが、逆転され、シーソーゲームへ、同点まま、終了3秒前に逆転、怒涛の歓声のなか試合終了!!
歓喜に両腕を振り上げる「ファルコン」の子供達、泣き崩れる「清瀬」の子供達、明暗がクッキリと分かれてしまいました。
そして、1位の「宮城」とともに関東大会の出場権を獲得。これからが、また大変だ・・・。
■ 2006-09-24 VB6からEXCELを制御するには
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 EXCELでの日付データ読み込みの注意点
CSVファイルをクリックして、日付データのフィールドを含むCSVやTSVファイルを読み込むと、デフォルトでは、文字列形式ではなく、日付形式になって表示が想定外になってしまいます。
そんな時は、EXCEL本体から起動して、そのCSVファイルを読み込むと『テキストファイルウィザード』が起動され、そこで文字列形式を指定して読み込むことが出来ます。
■ 2006-09-23 チェンジドライブ・ディレクトリの注意点
VB上でChDir(チェンジディレクトリ)関数の処理をする場合は、必ず、ペアでChDrive(チェンジドライブ)関数の処理もしましょう!
インストール先のドライブが想定出来ないので、想定外のドライブにインストールされると、突然、動かなくなります。
また、同じロジックでも、VBAでは動いて、VB6だと動かなくなるケースもあります。これは、ブック(VBA)が別ドライブでも、EXCEL本体とChDirで指定したファイルが同じディレクトリならChDriveしなくても動いてしまうのです。
■ 2006-09-23 ファイルアクセスでのデフォルトパスの注意点
実行ファイルからデータファイルにアクセスする時、同じフォルダーの場合は、問題ないのですが、ChDirするロジックが追加されたりすると、カレントフォルダーが変わって、従来動いていたデータファイルのアクセスが動かなくなります。
したがって、データファイルにアクセスする時は、必ず、フルパス指定にしましょう。
ちなみに、実行ファイルのあるフルパスは、特殊オブジェクトAppのPathプロパティです。
■ 2006-09-23 GotoでなくResumeを使え!
On Error Gotoでエラーハンドラに割り込みが発生した場合に、エラーハンドラ内の処理後、普通Resumeで同じ行か、または、Resume Nextで次の行に戻ります。しかし、どこかのラベル(Labelxx)へ飛ばす時は、普通Gotoを考えてしまいますが、これもResume Labelxx を使用します。
Goto LabelxxでもとりあえずOKみたいなのですが、その後のプログラムの振る舞いがResume Labelxxと微妙に違ってきます。
ということで、Resume Labelxxを使いましょう。
ちなみに、Labelxxは、あなたが任意につけたラベル名です。
■ 2006-09-23 コマンドプロンプトのMicrosoft Telnetで文字化けが発生したら
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での漢字チェックルーチン
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系制御での『アプリケーション定義またはオブジェクト定義のエラー』について
たとえば、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アクセス時間切れについて
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でのコマンドライン引数の取得
普通、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 MS-SQLサーバーで日付をWhereするには
日付データを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でブックのパスを求める方法
以下のプロパティで、EXCELブックのフルパスが求められます。
ActiveWorkbook.FullNameURLEncoded
■ 2006-09-13 VBでのスリープ処理
VBではAPIでスリープ処理を行います。単位は1000ミリセコンドです。つまり1000指定で1秒。
例では、1分スリープ。
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sleep 1000 * 60
■ 2006-09-13 VB6の実行ファイル(exeファイル)をリリースするには
VBで作成したプログラムは、作成したプログラム以外にもランタイムDLL等が必要な時代がありました。
しかし、最近は、exeファイルだけでも大丈夫ですね。ネットで以下のメッセージをみつけました。
Windows Me/2000以降のOSにはVB6ランタイムが最初から含まれています。
■ 2006-09-13 VBSでのコマンドライン引数の取得
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 ログオンユーザID取得時の謎の異常終了
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 Cells形式からRange形式に変換
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ウィンドウをそのままにするには
通常、BATファイルを実行するとDOSウィンドウが一瞬立ち上がりますが、ずっと立ち上がりのままにするには、cmd.exeコマンドでkオプションを指定します。
(例)
C:\WINDOWS\system32\cmd.exe /k "schtasks"
■ 2006-09-06 VBからDOSコマンドを順番に処理するには
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 ファイル名に年月日を入れてリネームするには
とあるファイルを、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 VB系でメール送信するには
VB系でメール送信するには、とりあえず3種類の方法があります。
- WINDOWS標準オブジェクトのCDO(コラボレーション・データ・オブジェクト)を使用する方法。
- フリーのメール送信DLL(たとえば、BASP21 DLL)を使う方法
- MAPIでOutlookExpressの機能を使う方法。
各々、メリットデメリットがありますが、やはり、WINDOWS標準オブジェクトCDOを使うのがベターかも。
■ 2006-09-01 EXCELでのCSVファイル出力仕様
EXCELやDBへのデータ移行で一般的なCSVファイルは、実は、統一的な仕様はないとのことです。
しかし、事実上、EXCELでのCSVファイル出力仕様が、デファクトスタンダードなっています。
デファクトスタンダードの仕様は以下の2つがポイントです。
1、項目データ中にカンマがある時は、その項目のみダブルクォーテーションで囲む(すべての項目をダブルクォーテーションで囲まないので注意)。
aaa,bbb,"ccc,ccc",dddd
2、項目データ中にダブルクォーテーションがある時は、ダブルクォーテーションを2つ並べる。
aaa,bbb,"ccc""ccc",dddd
結構この仕様をしっている人は、意外に少ないようです。
ちなみに、デファクトスタンダードのデファクト(de facto)は英語ではなく、ラテン語だそうです。