英和辞典まるごと一冊分の巨大テキストはこちら(圧縮してあるけどダブルクリックで自己解凍するEXE型)
↑これを元に、↓のコードで、前ページのソフト用の辞書データベースを作るときは、ファイル名に注意





戻る


↓程度に整然と並んだテキストならデータベース化することが出来ます。

"fld1","fld2"
"coralline","サンゴ性(質)の,サンゴ色の,(石灰を含んだ)サンゴ藻,(ヒドロムシなど)サンゴ状動物"
"corbel","(重量を支えるため壁から突き出た石・木材の)持ち送り,(桁・梁の)受け材(で支える)"
"cord","コード,紐"
"cordage","(集合的に)索具,ロープ類"
"cordial","心からの"
"cordiality","真心,親切"
"cordially","心から"
"cordillera","(通例大陸を走る)山系"
"cordite","コルダイト爆薬"
"cordless phone","コードレス電話"
"cordon","飾りひも,綬章(じゆしよう),非常線,交通遮断線"
"corduroy","コールテン"
"cordwood","薪(の束)"
"core","のしんを抜く,磁気コア,中心,核心"

ためしに↑をコピーしてメモ帳に貼り付け、sampleという名前で保存してみてください
余計な拡張子なんか足さないでただ sample とだけ入れて保存ボタン押してくれたほうが話は簡単に済むんですが、どうしても余計なことがしたいというなら、sample.csv でもべつにかまいません。

このsampleファイルをもとにデータベースファイルをつくります。
以下、10行のコードをコピーしてメモ帳に貼り付けたうえ、sampleファイルと同じ場所に保存してください。
ファイル名は何でもいいですけど、これは何が何でも尻尾に .vbsです。
このvbsファイルをダブルクリック。
と、その前に。
sampleファイルをcsvにした場合は、コード中"sample#txt"の部分を"sample#csv"に書き換える必要があります(全部で3か所)
(これで出来上がったjishoファイルが本当にデータベースになっているかどうか、確認したかったらこちらへ)

Set MyADOXC = CreateObject("ADOX.Catalog")
MyADOXC.Create ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='jisho'")
Set MyADOXC = Nothing
Set MyDbCnn = CreateObject("ADODB.Connection")
MyDbCnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='jisho'")
MyDbCnn.Execute ("CREATE TABLE tbl00(fld1 String, fld2 Memo)")
MyDbCnn.Execute ("CREATE INDEX MyIDX ON tbl00(fld1)")
MyDbCnn.Execute ("INSERT INTO tbl00 ( fld1, fld2 ) SELECT [sample#txt].fld1, [sample#txt].fld2 FROM sample#txt in '" & CreateObject("WScript.Shell").CurrentDirectory & "' 'Text;'")
MyDbCnn.Close
Set MyDbCnn = Nothing

実際のところ↑みたいな書き方は手抜きにもほどがあるという感じなんですが、実験用としてはこれで充分でしょう。
というかむしろこのほうが、何をやろうとしているのか、不慣れな人でも想像しやすい気がします。
Set MyADOXC = CreateObject("ADOX.Catalog") データベース作成係の小人を召喚するおまじない。
MyADOXC.Create ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='jisho'") "jisho"という名前でデータベースファイル作成(この時点ではまだ中身はからっぽ)
Set MyADOXC = Nothing もう用はないから小人はどっか行っちゃえ、のおまじない。
Set MyDbCnn = CreateObject("ADODB.Connection") データベース接続係の小人を召喚するおまじない。
MyDbCnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='jisho'") "jisho"に接続(データベースに接続してはじめていろんなことができる)
MyDbCnn.Execute ("CREATE TABLE tbl00(fld1 String, fld2 Memo)") テーブルと呼ばれるデータの格納表作成。テーブル名は"tbl00"、列名は"fld1"と"fld2"
MyDbCnn.Execute ("CREATE INDEX MyIDX ON tbl00(fld1)") fld1の列にインデックス作成(インデックスつけると検索が速くなるという噂)
MyDbCnn.Execute ("
INSERT INTO tbl00 ( fld1, fld2 )
SELECT [sample#txt].fld1, [sample#txt].fld2
FROM sample#txt
in '" & CreateObject("WScript.Shell").CurrentDirectory & "' 'Text;'")
同じディレクトリ(フォルダ)中にあるsampleファイルからtbl00にデータ流し込み(fld1→fld1, fld2→fld2)
MyDbCnn.Close 接続解除
Set MyDbCnn = Nothing もう用はないから小人はどっか行っちゃえ、のおまじない。

テーブル作成のところで、StringとかMemoとか謎の言葉が出てきますが、大した意味はありません。
いや、本当はすごく重要な意味があるんですが、この場合は単に「必要になりそうな文字数の違い」だと考えてもらって差し支えないです。
String型には255文字までしか格納できない。Memo型だと20億文字ぐらいまで入る。
だったらどっちもMemo型でいいじゃん、と、言いたいところでしょうけど。
何というか、これは気分です。
検索の対象となるfld1にMemo型はねーだろと。
いや、べつにあってもいいんですけど。
20億文字の英単語があってたまるかと。
いや、べつにあってもいいんですけど。
それでもやっぱり気分です。
こういう気分の問題は大事にしたほうがいいです(テーブルをもっとメモ帳でごちゃごちゃいじりたくなった人はこちらへ)

それよりも謎の言葉はMyADOXC、MyDbCnn、あたりですかね。
これは小人を召喚する場所というか箱というか着ぐるみみたいなものの名前なんですが、こちらが勝手につけたものです。
hoeとかpuniとか書き換えてもちゃんと動きます。
(いまこの場で書き換えて実験してみたくなったら、直前につくったjishoファイルはいちど削除してください。でないと「すでに存在しています」のエラーが出ます)

こういうふうに勝手につけた名前ってのは、あらかじめ申請しておいたほうがいいような気がします。
あらかじめ申請してない言葉はいっさい使わないぞ、と、マニフェストすれば、処理が速くなる(という噂です)
何より、その場の思いつきで次々に勝手な言葉を使いまくると、プログラムコードが長くなった場合混乱の元になります。

Option Explicit
この一行を頭に書くと、無申請の勝手な言葉は使えなくなります。

Dim MyADOXC, MyDbCnn
MyADOXC, MyDbCnnの2つを、箱の名前として使わせてもらうぜ、まだ何を入れるか決めてないけどさ、ってな具合で申請。
(余談ですが、他の多くのプログラム言語だと「何を入れるか」はともかく「どんなものを入れるか」まで決めておかないと怒り出します)

Option Explicit

Dim MyADOXC, MyDbCnn

Set MyADOXC = CreateObject("ADOX.Catalog")
MyADOXC.Create ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='jisho'")
Set MyADOXC = Nothing

Set MyDbCnn = CreateObject("ADODB.Connection")
MyDbCnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='jisho'")
MyDbCnn.Execute ("CREATE TABLE tbl00(fld1 String, fld2 Memo)")
MyDbCnn.Execute ("CREATE INDEX MyIDX ON tbl00(fld1)")
MyDbCnn.Execute ("INSERT INTO tbl00 ( fld1, fld2 ) SELECT [sample#txt].fld1, [sample#txt].fld2 FROM sample#txt in '" & CreateObject("WScript.Shell").CurrentDirectory & "' 'Text;'")
MyDbCnn.Close
Set MyDbCnn = Nothing

↑こんなふうに書いたからって、処理が速くなった気はしませんよね。
この程度の短いプログラムで早さの違いなんて出るわけありません。
それでも、Option Explicit〜Dim は入れといたほうがいいです。いや、いろんな意味で。
あと、コード中の空改行は読みやすくするために気分で入れてるだけなので気にしないでください(プログラム実行に関しては何ら影響なし)

速さの問題なんかより、ちゃんとしたプログラムならエラー処理みたいなことをやっておかなきゃならないんだろうなと。
たとえば、当然そこあると思っているsampleファイルはもしかしたらないかもしれない。
「見つかりません」なんてコンピュータに怒られてるようじゃ負けです。
ないならなくてもいいんですが、「ないぞ」と、こちらが仕込んだメッセージが出てくるようでなきゃダメです。
jishoファイルにしてもそう。すでにあるものと同じ名前のデータベースを同じ場所に作ろうとすると、コンピュータは怒り出します。
コンピュータに怒られるってのはとにかく精神衛生上よくない。
何というか屈辱的な気分になります。
先回りしてこっちが怒って見せなきゃダメです
な感じでいろいろ追加していった結果が下のコード。
コード中、'〜 みたいに、頭に'のついた部分(たぶん違う色になってる)は、プログラム実行に影響なしなので一緒にコピーしちゃってかまいません。

Option Explicit

Dim MyWSHLL, MyFSO, MyADOXC, MyDbCnn
Dim MyStrCurrDir
Dim MyChkDB, MyChkSAMPLE

Set MyWSHLL = CreateObject("WScript.Shell") 'MyWSHLLと名づけた箱に、現在地取得係の小人を召喚
MyStrCurrDir = MyWSHLL.CurrentDirectory '箱の中の小人に教えてもらった現在地を、MyStrDirと名づけた箱に一時保管
Set MyWSHLL = Nothing '小人バイバイ

Set MyFSO = CreateObject("Scripting.FileSystemObject") 'MyFSOと名づけた箱に、ファイル有無判別係の小人を召喚
MyChkDB = MyFSO.FileExists(MyStrCurrDir & "\jisho") 'この場所にjishoというファイルがあるかどうか、有無の結果を、MyChkDBと名づけた箱に一時保管
MyChkSAMPLE = MyFSO.FileExists(MyStrCurrDir & "\sample.txt") 'この場所にsample.txtというファイルがあるかどうか、有無の結果を、MyChkSAMPLEと名づけた箱に一時保管
Set MyFSO = Nothing '小人バイバイ

If MyChkDB = True Then
    MsgBox "もう1回実験したいなら、そっちを消してから", vbOKOnly, "jishoファイルはすでにある"
    WScript.Quit 'プログラムはここで終了。この先は実行しない。
End If
If MyChkSAMPLE = False Then
    MsgBox "sample.txtがない", vbOKOnly, "NG"
    WScript.Quit
End If

Set MyADOXC = CreateObject("ADOX.Catalog")
MyADOXC.Create ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & MyStrCurrDir & "\jisho'")
Set MyADOXC = Nothing

Set MyDbCnn = CreateObject("ADODB.Connection")
MyDbCnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & MyStrCurrDir & "\jisho'")
MyDbCnn.Execute ("CREATE TABLE tbl00(fld1 String, fld2 Memo)")
MyDbCnn.Execute ("CREATE INDEX MyIDX ON tbl00(fld1)")
MyDbCnn.Execute ("INSERT INTO tbl00 ( fld1, fld2 ) SELECT [sample#txt].fld1, [sample#txt].fld2 FROM sample#txt in '" & MyStrCurrDir & "' 'Text;'")
MyDbCnn.Close
Set MyDbCnn = Nothing

Dim MyWSHLL, MyFSO, MyADOXC, MyDbCnn
Dim MyStrCurrDir
Dim MyChkDB, MyChkSAMPLE

これは1行にまとめて

Dim MyWSHLL, MyFSO, MyADOXC, MyDbCnn, MyStrCurrDir, MyChkDB, MyChkSAMPLE

というふうに書いても問題はありません。
ただ、入れようとしているものの性質が違うのに全部同列に並べちゃうのは気持ち悪い、ってことで3段に分けただけです。
どう違うのかって、最初の4つは何となく分かりますよね。
まず箱に小人を呼んで(Set -- = CreateObject)いろいろやってもらって、用が済んだらバイバイ(Set -- = Nothing)
他は本当にただの箱。使ったら使いっぱなし。空っぽにする手続きも不要。
まあどっちにしてもここで使われるイコール( = )って記号はちょっと不思議です。

foo = 1 これでfooという箱に1という数字が入ります
foo = foo + 2 fooという箱に元から入っている1に2が足され、3になります
foo = foo & "a" fooの中身の扱いは数字から文字に変わり、"3a"になります
foo = 5 "3a"の文字は押し出されて消滅、fooの中身は数字の5です
foo = "b" 5は押し出されて消滅、fooの中身は文字の"b"です
foo = foo & "c" 元から入っている"b"に"c"が足され、"bc"になります
foo = foo + "d" 元から入っている"bc"に"d"が足され、"bcd"になります
foo = foo & 6 元から入っている"bcd"に"6"が足され、"bcd6"になります
foo = foo + "7" 元から入っている"bcd6"に"7"が足され、"bcd67"になります
foo = foo + 8 エラーになります(8を""でくくるか、+ を & に変えれば"bcd678")

数字と文字の扱いに注意してほしい、なんて話はどうでもいいとして。
foo = foo + 2 なんて表記は数学ではありえないでしょ。
fooはあくまでfooです。
= は等号を意味してるわけじゃない。
でも一方で
If foo = 2 Then
何かの処理〜
End If
なんて書くこともあったりする。
もしfooの中身が2なら何か処理しろ、と。
この場合はまあ等号です。
だから何がどうしたって話でもないです。何かちょっとだけ気持ち悪いですねという話。

ところで。
Dim MyWSHLL, MyFSO, MyADOXC, MyDbCnn、と、小人を召喚する箱は4つ用意しました。
でもこの処理の流れだったら、本当は1つでもいいんです。
なぜかって、複数が同時に埋まってる個所が全然ないじゃないですか。

Option Explicit

Dim MyWITCH
Dim MyStrCurrDir
Dim MyChkDB, MyChkSAMPLE

Set MyWITCH = CreateObject("WScript.Shell")
MyStrCurrDir = MyWITCH.CurrentDirectory
Set MyWITCH = Nothing

Set MyWITCH = CreateObject("Scripting.FileSystemObject")
MyChkDB = MyWITCH.FileExists(MyStrCurrDir & "\jisho")
MyChkSAMPLE = MyWITCH.FileExists(MyStrCurrDir & "\sample.txt")
Set MyWITCH = Nothing

If MyChkDB = True Then
    MsgBox "もう1回実験したいなら、そっちを消してから", vbOKOnly, "jishoファイルはすでにある"
    WScript.Quit
End If
If MyChkSAMPLE = False Then
    MsgBox "sample.txtがない", vbOKOnly, "NG"
    WScript.Quit
End If

Set MyWITCH = CreateObject("ADOX.Catalog")
MyWITCH.Create ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & MyStrCurrDir & "\jisho'")
Set MyWITCH = Nothing

Set MyWITCH = CreateObject("ADODB.Connection")
MyWITCH.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & MyStrCurrDir & "\jisho'")
MyWITCH.Execute ("CREATE TABLE tbl00(fld1 String, fld2 Memo)")
MyWITCH.Execute ("CREATE INDEX MyIDX ON tbl00(fld1)")
MyWITCH.Execute ("INSERT INTO tbl00 ( fld1, fld2 ) SELECT [sample#txt].fld1, [sample#txt].fld2 FROM sample#txt in '" & MyStrCurrDir & "' 'Text;'")
MyWITCH.Close
Set MyWITCH = Nothing

↑これでも問題なく動きます。

さらにいうと、それぞれの箱は、名前の申請はしていますが、「どんなものを入れるか」までは申請してません。
foo = 2
foo = foo + 3
foo = foo & "a"
なんてことが出来ちゃうのは、「数字でも文字でもそれ以外でも何でも入る箱」だからです。
たとえば上のコードで、MyChkDBには"True"か"False"だけを入れてますが、途中から別なものを入れてもコンピュータは怒りません

Option Explicit

Dim MyWITCH
Dim MyStrCurrDir
Dim MyChkDB, MyChkSAMPLE

Set MyWITCH = CreateObject("WScript.Shell")
MyStrCurrDir = MyWITCH.CurrentDirectory
Set MyWITCH = Nothing

Set MyWITCH = CreateObject("Scripting.FileSystemObject")
MyChkDB = MyWITCH.FileExists(MyStrCurrDir & "\jisho")
MyChkSAMPLE = MyWITCH.FileExists(MyStrCurrDir & "\sample.txt")
Set MyWITCH = Nothing

If MyChkDB = True Then
    MsgBox "もう1回実験したいなら、そっちを消してから", vbOKOnly, "jishoファイルはすでにある"
    WScript.Quit
End If
'この時点でMyChkDBは用済み
If MyChkSAMPLE = False Then
    MsgBox "sample.txtがない", vbOKOnly, "NG"
    WScript.Quit
End If

'用済みになったMyChkDBに小人を召喚してしまう
Set MyChkDB = CreateObject("ADOX.Catalog")
MyChkDB.Create ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & MyStrCurrDir & "\jisho'")
Set MyChkDB = Nothing

Set MyChkDB = CreateObject("ADODB.Connection")
MyChkDB.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & MyStrCurrDir & "\jisho'")
MyChkDB.Execute ("CREATE TABLE tbl00(fld1 String, fld2 Memo)")
MyChkDB.Execute ("CREATE INDEX MyIDX ON tbl00(fld1)")
MyChkDB.Execute ("INSERT INTO tbl00 ( fld1, fld2 ) SELECT [sample#txt].fld1, [sample#txt].fld2 FROM sample#txt in '" & MyStrCurrDir & "' 'Text;'")
MyChkDB.Close
Set MyChkDB = Nothing

↑これでもちゃんと動いてしまうというのは、喜んでいいことなのか困ったことなのか。
このしばりのゆるさに慣れてしまうと、他のプログラミング言語いじったときあまりの厳しさにショック受けます(自分がそうでした)
いや、そんなことより、こんな書き方をしていては、後で自分で読み返して何やってんのかさっぱり分からなくなる恐れがあります。
多少の使い回しはいいとして、いくらなんでも性質の違うものを入れる場合は違う名前の箱を用意してください。


追加

CreateObject("Scripting.FileSystemObject") の仕事は、ファイル有無の判定だけじゃない

CreateObject("WScript.Shell") の仕事は、現在地取得だけじゃない


CreateObjectの機能は、ひとつひとつを単品で取り上げれば、まったく大したもんじゃありません。
わざわざ面倒なコードなんて書くまでもなく、通常のマウス操作で出来るような仕事ばかりです。
「こんなことができるんだぜ」「だから何?」と、まあ普通に考えればそんな程度のものです。
それでも世の中にはこれを有難がって使う人間がけっこういたりする。
なんでそんな奴がいるのか、という疑問に対する回答は面倒なので省略。


さらに追加で

CreateObject(fax ファックス?)
メモ帳vbsでFAXを送信してみる実験。



追加というよりは、はみ出し

メモ帳でFTPサーバーを相手にするのはさすがに無理だったけどOffceVBAなら(AccessでもExcelでもWordでも)

メモ帳でカメラを動かすのさすがに無理だったけどOffceVBAなら(AccessでもExcelでもWordでも)

これはVBAっていうより、VBAの中で本家VBの書き方が通用しちゃう例のいくつか、みたいなことになるのかな。
本家VB自体は使ったことがないから何ともいえないけど、VBAで分からないことをネットで調べるとき、けっこうな確率でVBのページが答えを出してくれちゃうってのはとても助かる。