3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VBA VBScript ADODB.Stream の定跡 Standard Scripting of ADODB.Stream

Last updated at Posted at 2019-10-10

毎回書いていると出だしと終わりは決まっている

素人が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
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?