Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5164 / 13646 ツリー ←次へ | 前へ→

【52163】OpenAsTextStreamで、テキストファイルの特定の文字列に文字を追加したい moto 07/10/26(金) 0:04 質問[未読]
【52164】Re:OpenAsTextStreamで、テキストファイル... ichinose 07/10/26(金) 8:29 発言[未読]
【52182】Re:OpenAsTextStreamで、テキストファイル... moto 07/10/26(金) 22:42 お礼[未読]
【52233】Re:OpenAsTextStreamで、テキストファイル... moto 07/11/2(金) 0:50 質問[未読]
【52235】Re:OpenAsTextStreamで、テキストファイル... ichinose 07/11/2(金) 8:36 発言[未読]
【52275】Re:OpenAsTextStreamで、テキストファイル... moto 07/11/4(日) 21:22 質問[未読]
【52278】Re:OpenAsTextStreamで、テキストファイル... neptune 07/11/4(日) 23:04 発言[未読]
【52280】Re:OpenAsTextStreamで、テキストファイル... moto 07/11/5(月) 0:07 質問[未読]
【52283】Re:OpenAsTextStreamで、テキストファイル... りん 07/11/5(月) 1:15 発言[未読]
【52290】Re:OpenAsTextStreamで、テキストファイル... ichinose 07/11/5(月) 19:42 発言[未読]
【52301】Re:OpenAsTextStreamで、テキストファイル... moto 07/11/7(水) 0:27 お礼[未読]
【52314】Re:OpenAsTextStreamで、テキストファイル... moto 07/11/8(木) 0:20 お礼[未読]

【52163】OpenAsTextStreamで、テキストファイルの...
質問  moto  - 07/10/26(金) 0:04 -

引用なし
パスワード
   こんばんは。
初めて利用させて頂きます。

SQLで抽出したテキストファイルのある特定の文字列に任意の
文字(アルファベット等)を追加するツールをエクセルのマクロで
作成しています。今までAccessのVBAは使用したことがあるのですが、
新しい職場では主にエクセルのマクロがメインで、上記のツールも
エクセルのマクロで作ることになりました。

正直、エクセルのマクロを組むのは経験が全くなかったので、
どのように組めばいいのかイメージがわきませんでした。
書籍やサイト等で調べて、FileSystemObjectのOpenAsTextStreamで
テキストファイルの更新ができるようでしたので、色々右往左往
している状況です。

イメージとしましては、エクセルのシート上にあるコマンドボタンを
押すとネットワーク上のフォルダにあるテキストファイルの特定の
文字列にアルファベットを追加するツールになります。

コードは下記の内容で色々試しているのですが中々上手くいきません。
テキストファイルを更新可能で開く段階で躓いています・・・。

どうか、ご指導の程宜しくお願い致します。

(1)--------------------------------------------------------------------
Sub test1()
    Dim FSO, TextFile, buf As String
    Set FSO = CreateObject("Scripting FileSystemObject")

    Set TextFile = FSO.OpenTextFile _
        ("C:\Documents and Settings\*****\デスクトップ\新しいフォルダ¥DDL\sample,sql")

    buf = TextFile.ReadAll
    MsgBox buf
    Set FSO = Nothing
End Sub

※上記マクロを実行すると、サンプルのファイルは表示されますが、
編集ができません。ヘルプを見ると追記はできるようですが、編集
(上書き)はできないみたいです。

(2)--------------------------------------------------------------------
Sub test2()
    Dim F, S
    Dim fs, TextFile, buf As String
    Set fs = CreateObject("Scripting FileSystemObject")

    Set F = fs. GetFile _
        ("C:\Documents and Settings\*****\デスクトップ\新しいフォルダ¥DDL\sample.sql")
    Set fs = F.OpenAsTextSteam(ForWriting, TristateUseDefault)

    S = fs.ReadLine
    MsgBox S
    fs. Close
End Sub

※上記のマクロを実行すると「プロシージャの呼び出し、または引数が不正です」とエラーが表示されます。

(3)---------------------------------------------------------------------
Sub TextStreamTest()

    Const ForReading = 1, ForWriting = 2, ForAppeding = 3
    Const TristaeUseDefault = -2, Tristatetreu = -1, TristateFalse = 0

    Dim fs, F, ts, S
    Set fs = CreateObject("Scripting FileSystemObject")

    fs. CreateTextFile "text1.txt"
    Set F = fs.GetFile("test1.txt")
    Set ts = F.OpenAsTextStream _
        ("C:\Documents and Settings\*****\デスクトップ\新しいフォルダ¥DDL\sample.sql",ForWriting,TristaeUseDefault)
    ts. Close
End Sub

※上記マクロを実行する「引数の数が一致していません。または、不正なプロパティを指定しています」と
エラーが表示されます。

(4)---------------------------------------------------------------------
Sub TextStreamTest()

    Const ForReading = 1, ForWriting = 2, ForAppeding = 3
    Const TristaeUseDefault = -2, Tristatetreu = -1, TristateFalse = 0

    Dim fs, F, ts, S
    Set fs = CreateObject("Scripting FileSystemObject")

    fs. CreateTextFile "text1.txt"
    Set F = fs.GetFile("test1.txt")
    Set ts = F.OpenAsTextStream _
        ("C:\Documents and Settings\*****\デスクトップ\新しいフォルダ¥DDL\sample.sql",2)
    ts. Close

    Set ts = F.OpenAsTextStream (ForWriting,TristaeUseDefault)
    S = ts.ReadLine
    MsgBox S
    ts. Close
End Sub

※上記マクロを実行すると「型が一致しません」とエラーが表示されます。


また、上記の作業中、いつの間にか「sample.sql」の中のデータが無くなって
いて、「もう抽出するデータはありません」(だったかな?)といったエラー
が表示されて「sample.sql」を開くとデータが無くなっています。

どのタイミングで中のデータが無くなってしまっているのかわからないのですが、
何か原因があるのでしょうか?

夜分に長々と質問させて頂きましたが、ご指導の程宜しくお願い致します。


OS:WindowsXP
Excel:2003

【52164】Re:OpenAsTextStreamで、テキストファイ...
発言  ichinose  - 07/10/26(金) 8:29 -

引用なし
パスワード
   ▼moto さん:
おはようございます。
私は、テキストファイルに関しては、VBAのOpen、Lineinput、Print
等のステートメントで処理することが多いですが・・。
方法は、FSOでもよいですが・・・。

この手の処理手順は。結構定番で決まっていて・・・。

・元(編集前)のテキストファイル(仮にtest.txt)をオープンする。

・編集後のデータを一時保存するファイルを新規作成する(仮にtest.tmp)。

<元ファイルから一行読み込む 行の終わりまでループ>
    ・読み込んだデータを加工・編集
    ・test.tmpに加工・編集データを書き込む

・test.txtとtest.tmpファイルのクローズ。

・test.txtファイルの削除

・test.tmpファイルをtest.txtにファイル名を変更する

という手順で処理します。

こうすれば、何かの不具合でプログラムが途中終了しても
元ファイルの中身が保持されますよね?

手順がわかれば、FSOで処理可能だと思いますよ!!

【52182】Re:OpenAsTextStreamで、テキストファイ...
お礼  moto  - 07/10/26(金) 22:42 -

引用なし
パスワード
   ▼ichinose さん:

こんばんは。

返信が夜分遅くになってしまい申し訳ありません。
職場の環境が外部のネットに繋がらない為、自宅のPCで
確認しています。

やはり、こういった処理の場合は定番の処理があるのですね。
ファイル操作に関しては、AccessのVBAでもあまり経験がなかったので、
困っていたところです。

お返事頂いた内容で、すごくイメージがつきました。
私がイメージしていた内容だと、直接元のファイルを更新しようと
していたので、確かに何か不具合があったときに原本が元に戻らない
可能性がありますね。まだ最初の段階で方向性を示して頂いて、
良かったです。

お返事頂いた処理手順で、もう一度最初からやり直してみようと思います。
Open、Lineinput、Print等のステートメントも調べてみようと思います。

明日は別件で作業ができないので、日曜日に作業して試してみるつもりです。
また、結果も改めて報告させて頂きます。
不明な点があった場合は、こちらに質問させて頂きますので、
その時は、さしつかえなければ、またご指導の程宜しくお願い致します。

本当に有難うございました。
感謝です。

【52233】Re:OpenAsTextStreamで、テキストファイ...
質問  moto  - 07/11/2(金) 0:50 -

引用なし
パスワード
   こんばんは。

標題の件につきまして、中々思い通りにできくて困っています。
ichinoseさんのアドバイスをうけて、ネット等で色々調べて試しているのですが、
自分の勉強不足が禍して上手くいきません。
今、下記のコードで試しているのですが、マクロを実行しても何も反応がありません。
また、コードの内容でわからない部分があるので、再度ご教授頂ければと思い投稿させて
頂きます。どうか宜しくお願い致します。

-------------------------------------------------------------------
Sub test3()

Dim fso, file
Dim tempFile, outFile, readFile
Dim strLine, Flag, fileName, key1, key2, addStr

fileName = "C:\作業フォルダ\マクロ\sample.sql"
key1 = "CREATE TABLE"     'キーのはじめ
key2 = "" "("""        '挿入場所キー
addStr = "P"         '挿入データ

Set fso = CreateObject("Scripting. FileSystemObject")        
tempFile = fso.GetTempName
Set outFile = fso.OpenTextFile(tempFile, 2, True)  '作業ファイルの作成
Set readFile = fso.OpenTextFile(fileName, 1)
Flag = False

Do Until readFile.AtEndOfStream
strLine = readFile.ReadLine     '1行読み出し

    If key1 = strLine Then   'key1を見つけたら
        Flag = True
    End if

    If Flag And key2 = strLine Then  'key2を見つけたら
        outFile.WriteLine (addStr)
    End if

outFile.WriteLine (strLine)
Loop

readFile. Close
outFile.Close

Set file = fso.GetFile(fileName)
file.Name = fileName & ".bak"   '元のファイルをバックアップする

Set file = fso.GetFile(tempFile)
file.Name = fileName        '作業ファイルの名前を変更する

End Sub
-------------------------------------------------------------------

上記は、ネットで調べたコードを参照しているのですが、
"キーのはじめ"と"挿入場所キー"の部分と変数のFlagの意味がが良く
わかりません。

因みに編集したいテキストのデータは下記のような内容になります。

(テキストの内容)-------------------------------------------------

ああああああああああああああああ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA




CREATE TABLE "○○○○" (   <--- ○の後に「P」を追加したい




いいいいいいいいいいいいいいいいい
いいいいいいいいいいいいいいいいい



-------------------------------------------------------------------

ご指導の程、宜しくお願い致します。

【52235】Re:OpenAsTextStreamで、テキストファイ...
発言  ichinose  - 07/11/2(金) 8:36 -

引用なし
パスワード
   おはようございます。

出かけてしまうのでヒントになるコードだけ・・・。

新規ブックの標準モジュールに
'==============================================
Sub main()
  Dim s As String
  s = "ああああああああああああああああ"
  MsgBox myreplace(s)
  s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  MsgBox myreplace(s)
  s = "CREATE TABLE ""○○○○"" ("
  MsgBox myreplace(s)
  s = "いいいいいいいいいいいいいいいいい"
  MsgBox myreplace(s)
End Sub
'=================================================================
Function myreplace(mystr As Variant) As Variant
  Dim matches As Object
  Dim mm As Object
  myreplace = mystr
  With CreateObject("VBScript.RegExp")
    .Pattern = "^CREATE TABLE "".+"""
    .IgnoreCase = True
    .Global = True
    Set matches = .Execute(mystr)
    For Each mm In matches
      .Pattern = mm.Value
      myreplace = .Replace(mystr, Mid(mm.Value, 1, Len(mm.Value) - 1) & "P" & """")
      Next
    End With
End Function


上記のmainを実行してみてください。
結果から、参考にしてください

【52275】Re:OpenAsTextStreamで、テキストファイ...
質問  moto  - 07/11/4(日) 21:22 -

引用なし
パスワード
   ▼ichinose さん:
こんばんは。
朝早くからアドバイスを頂きまして有難うございます。

さっそく、アドバイスを頂いた内容を参考にして、
ヘルプ等で調べているのですが、私にはまだまだ内容が難しく
理解することができません。また、お教え頂いた内容をどのように
下記のコードに反映させればいいのか・・・。そのあたりのことも
悩んでいる状況です。

本当に情けないのですが、もう少しアドバイスを頂けないでしょうか。
宜しくお願い致します。

-------------------------------------------------------------------------

Sub P_huka()

Dim fso, file
Dim tempFile, outFile, readFile    
'一時ファイルの名前、作業ファイル、元のファイル
Dim strLine, Flag, fileName, key1, key2, addStr
'読み込んだデータ、カーソルの位置、ファイル名、キーのはじめ、挿入場所キー、挿入データ

fileName = "sample.sql"     '元の名前
key1 = "CREATE TABLE"      'キーのはじめ
key2 = Chr(34) & " ("      '挿入場所キー
addStr = "P"          '挿入データ

Set fso = CreateObject("Scripting.FileSystemObject")
tempFile = fso.GetTempName

Set outFile = fso.CreateTextFile("C:\date\tempFile") '作業ファイルの作成
Set readFile = fso.OpenTextFile("C:\date\sample.sql", 1)
Flag = False

Do Until readFile.AtEndOfStream  
'カーソルがファイルの末尾にあるときは、真(True)を返す
'それ以外のときは、偽(False)を返す。値の取得のみ可

strLine = readFile.ReadLine     '1行読み出し

  If key1 = strLine Then     'key1があったら
    Flag = True
  End If

  If Flag And key2 = strLine Then  'key2があったら
    outFile.WriteLine (addStr)
  End If

outFile.WriteLine (strLine)

Debug.Print strLine
Loop

readFile.Close
outFile.Close

'fso DeleteFile ("C:\date\sample.sql")

Set file = fso.GetFile("C:\date\sample.sql")
file.Name = fileName & ".bak"   '元のファイル名に.bakをつけてバックアップ

Set file = fso.GetFile("C:\date\tempFile")
file.Name = fileName        '作業ファイルの名前を変更

End Sub

-------------------------------------------------------------------------

【52278】Re:OpenAsTextStreamで、テキストファイ...
発言  neptune  - 07/11/4(日) 23:04 -

引用なし
パスワード
   ▼moto さん:
こんにちは。横入り失礼。

このスレ全部を読んでいるわけではないのですが、

気になる点を書きます。
ichinose さんは正規表現を使っているのですが、正規表現を使わないのなら、
>  If key1 = strLine Then     'key1があったら

if instr(1,strLine,key1) then  'key1があったら
若しくはlike関数を使用すべき。
但し、key1 = strLine になるなら話は別ですが。
>    Flag = True
>  End If
>
>  If Flag And key2 = strLine Then  'key2があったら
↑も同じ
>    outFile.WriteLine (addStr)
>  End If

【52280】Re:OpenAsTextStreamで、テキストファイ...
質問  moto  - 07/11/5(月) 0:07 -

引用なし
パスワード
   ▼neptune さん:

こんばんは。
返信有難うございます。

正規表現というのは、ある決まった形にそった文字列を検索する場合に
利用するメタキャラクタを使った記述方法ということですよね。

自分自身、今回検索する文字列が正規表現を使用するのか使用しないのか
いまいち分かっていないのですが、下記のような文字列を検索して、文字を追加したいと
考えています。

(テキストの内容)-------------------------------------------------

ああああああああああああああああ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA



CREATE TABLE "○○○○" (   <--- ○○○○の後に「P」を追加したい。
                     ○の部分は数は定数(4つ)ではなく、不規則な文字列が入ります。



いいいいいいいいいいいいいいいいい
いいいいいいいいいいいいいいいいい


-------------------------------------------------------------------

下記のように、変更したところ、
-------------------------------------------------------------------
strLine = readFile.ReadLine     '1行読み出し

  If InStr(1, strLine, key1) Then    'key1があったら
    Flag = True
  End If

  If Flag And InStr(1, strLine, key2) Then 'key2があったら
    outFile.WriteLine (addStr)
  End If

outFile.WriteLine (strLine)
-------------------------------------------------------------------
 ↓
(テキストの内容)-------------------------------------------------

ああああああああああああああああ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA


P             <-この位置に「P」が付いてしまいました。
CREATE TABLE "○○○○" (   



いいいいいいいいいいいいいいいいい
いいいいいいいいいいいいいいいいい


-------------------------------------------------------------------

元のコードはネットで調べたコードを参照しているのですが、
どうもkey1、key2、Flagの意味が良く理解できていません。

もし、差支えなければお教え頂けませんでしょうか。
宜しくお願い致します。

【52283】Re:OpenAsTextStreamで、テキストファイ...
発言  りん E-MAIL  - 07/11/5(月) 1:15 -

引用なし
パスワード
   moto さん、こんばんわ。

>CREATE TABLE "○○○○" (   <--- ○○○○の後に「P」を追加したい。
>                     ○の部分は数は定数(4つ)ではなく、不規則な文字列が入ります。

>下記のように、変更したところ、
>-------------------------------------------------------------------
>strLine = readFile.ReadLine     '1行読み出し
>
>  If InStr(1, strLine, key1) Then    'key1があったら
>    Flag = True
>  End If
>
 ここで追加文字列を先に書いて、
>  If Flag And InStr(1, strLine, key2) Then 'key2があったら
>    outFile.WriteLine (addStr)
>  End If

↓読み込んだ文字列を書いているので、
>outFile.WriteLine (strLine)

こうなるんだと思いますけど。
>P             <-この位置に「P」が付いてしまいました。
>CREATE TABLE "○○○○" (   

なので、
>  If Flag And InStr(1, strLine, key2) Then 'key2があったら
    outFile.WriteLine (strLine & addStr)
>  Else
     outFile.WriteLine (strLine)
>  End If
これでどうでしょうか。

>どうもkey1、key2、Flagの意味が良く理解できていません。
 それぞれ、変数の名前です。
 (人によって付け方の法則がちがうけど、そのままの意味なのでわかりやすい方だと思いますが)
存在意味というなら、
 key1、key2は、読み込んだ文字列に含まれているかどうかチェックする文字(列)
 Flagは読み込んだ文字列にkey1が入っていたかどうかのチェックの結果です

【52290】Re:OpenAsTextStreamで、テキストファイ...
発言  ichinose  - 07/11/5(月) 19:42 -

引用なし
パスワード
   皆さん、こんばんは。

沢山アドバイス投稿があったでお任せしようかなあ
と思いましたが、正規表現の箇所を少し汎用的にしたので
投稿します。

新規ブックの標準モジュールに

'============================================================================
Sub main()
  Const infile = "infile.txt"
  Const otfile = "infile.tmp"
  Dim s As String
  Dim intxt As Object
  Dim outtxt As Object
  Dim fso As Object
  Set fso = CreateObject("scripting.filesystemobject")
'**************************************************************************
  
  Call mk_sample_txt(ThisWorkbook.Path & "\" & infile, fso)
  MsgBox infile & "をサンプルファイルとして、作成しました"
  Set intxt = fso.OpenTextFile(ThisWorkbook.Path & "\" & infile)
  MsgBox "ファイルの中身は" & vbCrLf & vbCrLf & intxt.ReadAll & _
      vbCrLf & vbCrLf & "です"
  intxt.Close
  
'****************************************************************************
  MsgBox infile & "の編集を開始します"
  
  Set intxt = fso.OpenTextFile(ThisWorkbook.Path & "\" & infile)
  Set outtxt = fso.CreateTextFile(ThisWorkbook.Path & "\" & otfile, True)
  Do Until intxt.AtEndOfLine = True
    outtxt.WriteLine myreplace(intxt.ReadLine, "^CREATE TABLE ""[^""]+", "P", 1)
    Loop
  intxt.Close
  outtxt.Close
  fso.DeleteFile ThisWorkbook.Path & "\" & infile
  fso.GetFile(ThisWorkbook.Path & "\" & otfile).Name = infile
'**************************************************************************
  
  MsgBox "新しい" & infile & "ファイルを作成しました"
  Set intxt = fso.OpenTextFile(ThisWorkbook.Path & "\" & infile)
  MsgBox "ファイルの中身は" & vbCrLf & vbCrLf & intxt.ReadAll & _
      vbCrLf & vbCrLf & "です" & vbCrLf & _
      "○○○○の後に「P」を追加されていますね!!"

  intxt.Close
  Set intxt = Nothing
  Set outtxt = Nothing
  Set fso = Nothing
End Sub
'=================================================================
Function myreplace(mystr As Variant, pat As Variant, rstr As Variant, Optional rtype As Long = 0) As Variant
'  機能 : 文字列mstrから、patで指定された文字列を見つけ出し、rtypeの指示により、
'      文字列rstrで置換したり、追加した文字列を返す
'  input : mstr  探索対象文字列、pat メタ文字列、 rstr 置換または、追加文字列
'      rtype 0--patで取得した文字列をrstrで置換する
'         1--patで取得した文字列にrstrを追加する
'  output:myreplace-mstrの編集後の文字列
  Dim matches As Object
  Dim mm As Object
  myreplace = mystr
  With CreateObject("VBScript.RegExp")
    .Pattern = pat
    .IgnoreCase = True
    .Global = True
    Set matches = .Execute(mystr)
    For Each mm In matches
      .Pattern = mm.Value
      If rtype = 0 Then
       myreplace = .Replace(mystr, rstr)
      Else
       myreplace = .Replace(mystr, mm.Value & rstr)
       End If
      Next
    End With
End Function
'============================================================================
Sub mk_sample_txt(ByVal flnm As Variant, ByVal fso As Object)
  Dim txtstrm As Object
  Set txtstrm = fso.CreateTextFile(flnm, True)
  txtstrm.WriteLine String(16, "あ")
  txtstrm.WriteLine String(29, "A")
  txtstrm.WriteLine "CREATE TABLE ""○○○○"" ("
  txtstrm.WriteLine "CREATE TABLE ""BBBBBB"" ("
  txtstrm.WriteLine String(17, "い")
  txtstrm.Close
  Set txtstrm = Nothing
End Sub


として、一度保存した後に

mainを実行してみてください。

サンプルテキストファイルとして 上記のマクロを含むブックと同じフォルダに

infile.txtとして、

ああああああああああああああああ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
CREATE TABLE "○○○○" (
CREATE TABLE "BBBBBB" (
いいいいいいいいいいいいいいいいい

というデータを作成します。

このデータを

ああああああああああああああああ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
CREATE TABLE "○○○○P" (
CREATE TABLE "BBBBBBP" (
いいいいいいいいいいいいいいいいい

に変更しています。

前にもどこかで記述しましたが、
文字列の編集は楽しみながらやりましょう!!
色んなやりかたがありますから・・・。


試してみてください。

【52301】Re:OpenAsTextStreamで、テキストファイ...
お礼  moto  - 07/11/7(水) 0:27 -

引用なし
パスワード
   ▼りん さん、ichinose さん:

こんばんは。
返信が遅れてしまい申し訳ありません。

まだ、アドバイスして頂いた内容を試していないのですが、
色々親切にお教え頂き感謝しております。

明日、なんとか時間が作れそうなので試してみようと思って
います。また、結果や不明な点は改めて報告させて頂きます。

まずは、取り急ぎ御礼申し上げます。

【52314】Re:OpenAsTextStreamで、テキストファイ...
お礼  moto  - 07/11/8(木) 0:20 -

引用なし
パスワード
   みなさま。
こんばんは。

今日、みなさんにアドバイス頂いた内容を参照して
Open、Line input、Print、replace、FSO等を使って思い通りの結果を
出すことができました。有難うございます。

最初の内は色々迷って、大分遠回りして(難しく考えて)しまったのですが、
最終的にはコードもすっきり纏まって上手くいきました。

でも、おかげさまで色々勉強になりました。
まだ、ファイルを一つだけ指定した場合の処理しか出来上がって
いないのですが、最終的には複数のファイルを指定して一括で処理
できるようなツールを考えています。

本当に有難うございました。
また、不明な点がでてきたら、改めて質問させて頂きます。
その際は宜しくお願い致します。

5164 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free