|
▼くま さん:
>kanabunさん
>昨年はいろいろとご教示いただきましてありがとうございます。
くま さん、お久ですね(^^
>自分なりに変更してみたのですが
>フォルダ内のファイルを順に処理するループ処理に変えてみたのですが、
>vlan値は正常に取ってくるのですが、
>hostnameの値が一番最初に見たファイルの値のままなのです。
問題のか所は
> For i = 0 To UBound(ss) - 1
> If Not ok Then
> If ss(i) Like "hostname*" Then
> hostname = Split(ss(i))(1)
> Debug.Print , "hostname", "vlan ID"
> ok = True
のところにあります。
この変数ok は まだhostnameが見つかっていないときには
"vlan*" の行の解析をしないフラッグ(目印)です。
hostname がみつかったときはじめて ok = True にしています。
それが複数ファイルのとき、一番最初のファイルのhostnameが
読み込まれて ok=True になったあと、
次のファイルに移るときは いったん ok=False に戻しておかないと
2番目からのファイルは ok=True なので そのファイルのhostname を
読む処理をスキップしてしまいます。
で、最初のファイルのhostname がずっと現れているわけです。
ファイル読み込みが終了したら ◆のところに ok=False を追加してください。
ちょっとインデントが深く、読みにくかったので、
順番を入れ替えるついでに編集しました。
Sub Try4_JoinFile()
Const myPath = "D:\(Data)\temp8log" '"C:\マクロ"
Dim io As Integer
Dim myLogFile As String
Dim buf() As Byte
Dim ss() As String, s As String, Series, num As Long
Dim hostname As String, ok As Boolean
Dim i As Long, j As Long
Dim rex As RegExp
Dim mm As Match
Set rex = New RegExp
rex.Pattern = "[\d-]+"
rex.Global = True
ChDrive myPath
ChDir myPath
myLogFile = Dir("*.log", vbNormal)
Do While Len(myLogFile) > 0
'------------ ファイルを読み込む
io = FreeFile()
Open myLogFile For Binary As io
ReDim buf(1 To LOF(io))
Get io, , buf
Close io
ss = Split(StrConv(buf, vbUnicode), vbCrLf)
'------------ 抽出
For i = 0 To UBound(ss) - 1
If Not ok Then
If ss(i) Like "hostname*" Then
hostname = Split(ss(i))(1)
Debug.Print , "hostname", "vlan ID"
ok = True
End If
ElseIf ss(i) Like "vlan*" Then
If Mid$(ss(i), 6, 1) Like "#" Then
For Each mm In rex.Execute(ss(i))
s = mm.Value
If s <> "-" Then
Series = Split(s, "-")
num = Series(0)
For j = num To Val(Series(UBound(Series)))
Debug.Print , hostname, j
Next
End If
Next
End If
End If
Next
ok = False '◆ファイル読みが終了したら ok = False に戻す
'-------------- 次のログファイル
myLogFile = Dir$()
Loop
End Sub
|
|