|
こんな方法も有ります
始めて作ったので上手く行くかな?
置換するファイルを別名でCopyして、そのファイルを処理しています
置換する、文字列、位置等はワークシートから読み込んでいます
読みこむシートの構成は、
Sheet1にに設定しています
Sheet1のA2に1レコードの総バイト数(改行コード分も含む)
Sheet1のA烈のA4かA5、A6と言う様に置換するレコードの位置を
Sheet1のB烈のB4かB5、B6と言う様に置換するバイト数を
Sheet1のC烈のC4かC5、C6と言う様に置換する文字列を
書き込みます
A B C
1
2 160
3
4 1 12 トウキョウト
5 20 12 東京都
6
尚、このコードは1レコードづつ読み込んで処理はしていません
直接、ファイルの指定位置に指定バイト数を書き込んでいます
以下のコードを標準モジュールに記述
Option Explicit
Public Sub SDFReplace()
Dim i As Long
Dim j As Long
Dim vntInFile As Variant
Dim strOutFile As String
Dim dfn As Integer
Dim lngRecLen As Long
Dim vntRepl As Variant
Dim lngReplMax As Long
Dim bytBuff() As Byte
'置換元のファイルを選択
vntInFile = Application.GetOpenFilename("Textファイル (*.txt), *.txt")
If vntInFile = False Then
Exit Sub
End If
'もし置換元のファイルにデータが無い場合
If FileLen(CStr(vntInFile)) = 0 Then
Exit Sub
End If
'置換元ファイル名から置換先ファイル名を作成
strOutFile = Left(vntInFile, InStr(1, vntInFile, _
".", vbBinaryCompare) - 1)
strOutFile = strOutFile & "New" & Mid(vntInFile, _
InStr(1, vntInFile, ".", vbBinaryCompare))
'もし、置換先ファイルが有る場合それを削除
If Dir(strOutFile) <> "" Then
Kill strOutFile
End If
'置換元を置換先名にしてコピー
FileCopy vntInFile, strOutFile
'Sheet1から総バイト数、置換位置、長さ、文字列を取得
With Worksheets("Sheet1")
'1レコードの総バイト数(改行コードも含む)を取得
lngRecLen = Val(.Cells(2, 1).Value)
'置換位置、長さ、文字列を取得
vntRepl = Range(.Cells(4, 1), _
.Cells(65536, 3).End(xlUp)).Value
End With
'1レコードの置換数を取得
lngReplMax = UBound(vntRepl, 1)
'置換文字列をユニコードから変換してフィール長に調整
For i = 1 To lngReplMax
vntRepl(i, 3) = FieldString(vntRepl(i, 2), vntRepl(i, 3))
Next i
'置換先ファイルをBinaryモードでOpen
dfn = FreeFile
Open strOutFile For Binary As dfn
'第一レコードから最終レコードまで繰り返し
For i = 1 To LOF(dfn) \ lngRecLen
'置換数まで繰り返し
For j = 1 To lngReplMax
'置換文字列をByte配列に格納
bytBuff = vntRepl(j, 3)
'置換位置に出力
Put #dfn, vntRepl(j, 1) + lngRecLen * (i - 1), bytBuff
Next j
Next i
'ファイルを閉じる
Close dfn
End Sub
Public Function FieldString(ByVal lngLength As Long, _
ByVal strData As String, _
Optional strAlign As String = "L") As String
' Dataをフィールド長に調整
'lngLengthはフィールドの長さを半角何文字分(バイト単位)で
'strDataはデータを文字列の型で
'strAlignは左詰なら"L"で(デホルトは"L")、
'右詰なら"R"で(実際は、"L","l"以外なら可)
Dim strSpace As String
Dim i As Long
Dim intCode As Integer
'文字列を Unicode からシステムの既定のコード ページに置換します
strData = StrConv(strData, vbFromUnicode)
'フィールド長よりDataが長い場合、2バイト文字の処理を行います
If LenB(strData) > lngLength Then
strData = LeftB(strData, lngLength)
intCode = Asc(Right$(StrConv(strData, vbUnicode), 1))
If (0 <= intCode And intCode <= 7) _
Or (11 <= intCode And intCode <= 12) _
Or (14 <= intCode And intCode <= 31) _
Or (127 <= intCode And intCode <= 159) _
Or (224 <= intCode And intCode <= 255) Then
strData = LeftB(strData, lngLength - 1)
End If
End If
'長さ調整用のスペースを作成します
If lngLength > LenB(strData) Then
strSpace = StrConv(Space$(lngLength - LenB(strData)), _
vbFromUnicode)
'Dataをフィールド長に調整します
If strAlign = "L" Or strAlign = "l" Then
strData = strData & strSpace
Else
strData = strSpace & strData
End If
End If
FieldString = strData
End Function
|
|