毎回書いていると出だしと終わりは決まっている
素人がVBAやVBSを扱っていると、大体出だしと終わりは同じことを書いています。
なので、そういうのはコピペで済ませられないか。
しかしPCにおいておけばどこかに行きます。
このため、技術系サイトにおいておくとよいのではないかと思いました。
定跡の基本
1.参考サイトを注釈に置く。
最初に参照するサイトを置きます。
' Reference '[ExcelWorkInof](https://excelwork.info/excel/adodbstream/)
素人は1度書くとすぐ忘れるので、こうしてサイトを載せておかないと意味が分からなくなります。
2.遅延バインディングで書く
参照設定は指示しつつも遅延バインディングで書いておきます。
すると参照設定を忘れても大丈夫ですし、VBSCRIPTでも動くのが大きいです。
遅延バインディング(事後バインディング、レイトバインディング)というのは CreateObject("ADODB.Stream")
と書くということです。
この方法はやや遅いこと、、Constが使えないことです。
そこでConstをあらかじめ定跡に書き込んでおくということになります。
一番痛いのはオブジェクトブラウザ、プロパティ名の候補が示されないことです。
その時は、レイトバインディングでも、参照設定しておいて書くという非常に卑怯な手を使っています。
3.Const で書く定数名は同じにする
そこでコツが2つあります。
この時Enumurationと同じ名前にするということです。
こうすると参照設定をしているような雰囲気でコード(スクリプト)が書いていけます。
第二のコツは、参照設定をしたら削除するかコメントアウト(行頭に Shift + 7 の '
)するということです。
4.定数にも注釈とサイト名を
1.でのべたように余計なところは消せばいいので、定数名にもMicrosoftの参照サイトを記載します。もっとも日本語になっておらず、なんの役にも立たないのですが。。。
5.変数宣言部はVBAとVBSと2つ書いておく。
VBAのほうは参照設定したときのもの。コピペして使うときはどちらか一つを使う
VBAは参照設定をしないときはVBSのように書いても間違いではないので、これを流用します。VBSの変数宣言ではASは機能しませんが、Asを注釈形式で書き足すことで、何の型に使おうとしているかがわかるようにしています。
6.終端部を書く
Save
Close
Nothingを書く
7. ADODBならではの定跡
WriteとReadを書いておく
ReadはさらにReadAllと ReadLineを書いておきます
8.Binaryはテキストとは独立して今後定跡化
BinaryのRead / WriteはClassを作ってアプローチする方法が多いです。
特にVBSはBinaryが原則扱えないため(Byte型がない)
ADODB.Streamに書き込めるバイナリデータを生成するクラス
http://sei.qee.jp/docs/program/hta/sample/bstream.html
VBScriptでバイナリファイルを読み書きする これが今後定跡化できそうです
http://tambourine.cocolog-nifty.com/dengon/2006/12/vbscript_1d8d.html
VBScriptでバイナリを書く プログラムとか日本語とか
http://moritora.seesaa.net/article/260857963.html
このため、テキストでは不要なClassがつくため冗長になります。このためバイナリの情背kは今後は作る予定です。
' 参考サイト
' Reference '[ExcelWorkInof](https://excelwork.info/excel/adodbstream/)
' Global/Public 定数宣言部
' About ADODB.Steam Property ADODB.Stream.ConnectEnumMode
' ConnectModeEnum ' https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/connectmodeenum
' Stream.Mode Usable Enum is 3 [Mode Property] https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/mode-property-ado
Const adModeUnknown = 0, adModeRead = 1, adModeWrite = 2, adModeReadWrite = 3
Const adOpenStreamAsync = 1, adOpenStreamFromRecord = 4, _
adopenstreamunspecified = -1 'StreamOpenOptionsEnum Stream オブジェクトを開くときのオプションを表します OR 演算子 ’https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/streamopenoptionsenum
Const adPosUnknown = -1, adPosBOF = -2, adPosEOF = -3 'PositionEnum https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/positionenum
Const adTypeText = 2, adTypeBinary = 1 'StreamTypeEnum 'https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/streamtypeenum
Const adReadAll = 1, adReadLine = -2 'StreamReadEnum 読み取りの時の定数。Stream オブジェクトから、ストリーム全体を読み取るか、または次の行を読み取るか。 'https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/streamreadenum
Const adWriteChar = 0, adWriteLine = -1 'StreamWriteEnum 'https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/streamwriteenum
Const adCRLF = -1, adCr = 13, adLF = 10 'LineSeparatorsEnum 'https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/lineseparatorsenum
Const adSaveCreateNotExist = 1, adSaveCreateOverWrite = 2 'SaveOptionsEnum SaveCreateNotExistファイルがないと作成 ファイルがあれば上書き AND結合可能 'https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/saveoptionsenum
' Charset , Sorry not all. Only I use or I will use and Many people may use
' https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/charset-property-ado
' HKEY_CLASSES_ROOT\MIME\Database\Charset
Const adCSASCII = "ascii", adCSB5 = "Big5", adCSeujp = "euc-jp", adCSeuckr = "euc-kr", adCSSJis = "s_jis", adCSiso2022jp = "iso-2022-jp", adUTF8 = "utf-8", adUTF7 = "utf-7", adCSuascii = "us-ascii", adCSUseCurrentAnsi = "_autodetected", ISO_8859_1_1987 = "ISO_8859-1:1987"
' 変数宣言部
' --- Case VBA
' Dim sr As ADODB.Stream
' Set sr = New ADODB.Steam
' Dim buf As String
' Dim strFileName 'As String
' --- Case VBSCRIPT
Dim sr: Set sr = CreateObject("ADODB.Steam")
Dim buf 'As String
Dim strFileName : strFileName = "C:\hoge\Filename.txt" 'strFileName As String
Dim CNT 'As Long
' Open for Write
sr.Mode = adModeReadWrite
sr.Type = adTypeText
sr.Charset = adCSSJis
sr.LineSeparater = adCRLF
sr.Open
'sr.Write Buffer ' adTypeBinary
sr.WriteText "abcd", adWriteLine ' recommend adwriteline
' 終末部
sr.SaveToFile strFileName, adSaveCreateNotExist ' Steam Position Set 0
sr.Close
If Not sr Is Nothing Then Set sr = Nothing
' Open for Read
sr.Type = adTypeText
sr.Charset = adUTF8
sr.Mode = adModeRead
sr.Open
sr.LoadFromFile strFileName
’ sr.ReadText 'numChars adReadAll Or adReadLine
' ---- Read All
buf = sr.ReadText(adReadAll)
' ---- Read Lines
Do Until sr.EOF = True
buf = sr..ReadText(adReadLine)
'sr.read 'Numbytes
' 終末部
sr.Close
If Not sr Is Nothing Then Set sr = Nothing
http://tambourine.cocolog-nifty.com/dengon/2006/12/vbscript_1d8d.html
上記サイトのコードが下記のものですが、これだとそのまま読んで書いてしまうのでこういうのと読むだけと書くだけの3つが必要かもしれません。
Dim sIn,sOut
'改行コードを作成
Set sTmp = CreateObject("ADODB.Stream")
sTmp.Type = 2 'テキストモード
sTmp.Charset = "shift_jis"
sTmp.Open
sTmp.WriteText vbCrLf
sTmp.Position = 0
sTmp.Type = 1
bCrLf = sTmp.Read(2)
Set sTmp = Nothing
'本体処理
If WScript.Arguments.Count = 3 Then
Set sIn = CreateObject("ADODB.Stream")
Set sOut = CreateObject("ADODB.Stream")
sIn.Type = 1
sOut.Type = 1
sIn.Open
sOut.Open
sIn.LoadFromFile(WScript.Arguments(0))
rlen = CInt(WScript.Arguments(2))
Do Until sIn.EOS
line = sIn.Read(rlen)
sOut.Write line
sOut.Write bCrLf
Loop
sOut.SaveToFile WScript.Arguments(1), 2
Else
WScript.Echo "引数エラー"
End If