Excel VBA質問箱 IV

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

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


5696 / 13645 ツリー ←次へ | 前へ→

【49370】shell関数で">"を使いたい。 よちよち 07/6/2(土) 16:20 質問[未読]
【49371】Re:shell関数で">"を使いたい... ウッシ 07/6/2(土) 17:01 発言[未読]
【49375】Re:shell関数で">"を使いたい... ウッシ 07/6/2(土) 21:21 発言[未読]
【49376】Re:shell関数で">"を使いたい... よちよち 07/6/3(日) 7:56 質問[未読]
【49378】Re:shell関数で">"を使いたい... ウッシ 07/6/3(日) 9:02 発言[未読]
【49379】Re:shell関数で">"を使いたい... ichinose 07/6/3(日) 9:51 発言[未読]
【49381】Re:shell関数で">"を使いたい... ichinose 07/6/3(日) 10:05 発言[未読]
【49382】Re:shell関数で">"を使いたい... ichinose 07/6/3(日) 10:50 発言[未読]
【49386】Re:shell関数で">"を使いたい... よちよち 07/6/3(日) 15:06 お礼[未読]
【49380】Re:shell関数で">"を使いたい... yuu1 07/6/3(日) 10:05 回答[未読]
【49417】Re:shell関数で">"を使いたい... よちよち 07/6/4(月) 19:56 お礼[未読]

【49370】shell関数で">"を使いたい。
質問  よちよち  - 07/6/2(土) 16:20 -

引用なし
パスワード
   お世話になります。
あるファイルに、16進の固定のパターンがあるかを確認するために
16進ダンプ用プログラムで、fileBを作成し検索しようとしています。
DUMP.exeは、標準画面にしか出力しませんので、
rtn=shell("DUMP.exe fileA.cad > fileB.txt")を実行しましたが
"> fileB.txt"が無視され、fileBが作成されません。
shell関数では">"は無視されるのでしょうか?
色々調べましたが、特に説明が見つかりません。
どなたかご存知でしたら教えて下さい。

または、VBA自体でファイルを直接16進で検索する方法はありませんか?
宜しくお願いします。

【49371】Re:shell関数で">"を使いた...
発言  ウッシ  - 07/6/2(土) 17:01 -

引用なし
パスワード
   こんにちは

もっといい方法が有るかと思いますが、

Sub test()
  Dim buf As String
  Dim i  As Long
  Const f As String = "C:\TEST.txt"
  Dim mtc As Object
  
  i = FileLen(f)
  Open f For Binary Access Read As #1
  buf = Input(i, #1)
  Close #1
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "\x2C"    '16進で「,」
    If .test(buf) Then
      Set mtc = .Execute(buf)
      MsgBox mtc.Count  '「,」の個数
      Set mtc = Nothing
    End If
  End With
End Sub

【49375】Re:shell関数で">"を使いた...
発言  ウッシ  - 07/6/2(土) 21:21 -

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

テキストの読み込み方法の違うものです。

Sub test1()
  Dim buf As String
  Const f As String = "C:\TEST.txt"
  Dim mtc As Object
  With CreateObject("Scripting.FileSystemObject")
    buf = .OpenTextFile(f, 1).ReadAll
  End With
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "\x2C"    '16進で「,」
    If .test(buf) Then
      Set mtc = .Execute(buf)
      MsgBox mtc.Count  '「,」の個数
      Set mtc = Nothing
    End If
  End With
End Sub

【49376】Re:shell関数で">"を使いた...
質問  よちよち  - 07/6/3(日) 7:56 -

引用なし
パスワード
   ウッシさん、回答有難う御座います。
せっかく教えて戴きましたが、まだまだ修行中の身ですので
CreateObject("VBScript.RegExp")等、理解できません。
会社の詳しい人に教えて貰いながら挑戦してみます。

ところで、shell関数で">"は使えないのですかね。
(会社の詳しい人も、使ったことは無いとの事で質問しました。)

【49378】Re:shell関数で">"を使いた...
発言  ウッシ  - 07/6/3(日) 9:02 -

引用なし
パスワード
   こんにちは

済みませんm(__)m
fileA.cad > fileB.txt
バイナリファイルをテキストにですね。
16進の固定のパターンでテキスト検索かと思ってました。

レスしたコードではダメです。
他の方のレス待って下さい。

【49379】Re:shell関数で">"を使いた...
発言  ichinose  - 07/6/3(日) 9:51 -

引用なし
パスワード
   ▼よちよち さん:
おはようございます。

>
>ところで、shell関数で">"は使えないのですかね。
>(会社の詳しい人も、使ったことは無いとの事で質問しました。)
Sub samp()
  Shell "command.com /c Dump d:\testtext.bin > d:\testcopy.txt"
End Sub

これでは どうでしょうか?

【49380】Re:shell関数で">"を使いた...
回答  yuu1  - 07/6/3(日) 10:05 -

引用なし
パスワード
   >DUMP.exeは、標準画面にしか出力しませんので、
>rtn=shell("DUMP.exe fileA.cad > fileB.txt")を実行しましたが
>"> fileB.txt"が無視され、fileBが作成されません。

DUMP.exeはdosプログラムのようですからコマンドプロンプトにて実行する必要があると思います。
以下でどうでしょう。
カレントドライブやパスは適切に設定されているものとして。

rtn = Shell("cmd /c DUMP.exe fileA.cad > fileB.txt")

【49381】Re:shell関数で">"を使いた...
発言  ichinose  - 07/6/3(日) 10:05 -

引用なし
パスワード
   ▼ichinose さん:
>▼よちよち さん:
>>ところで、shell関数で">"は使えないのですかね。
>>(会社の詳しい人も、使ったことは無いとの事で質問しました。)

>Sub samp()
>  Shell "command.com /c Dump d:\testtext.bin > d:\testcopy.txt"
>End Sub
dump.exeは、Win95にしか入っていなかったので、試してみましたが、


Shell "b:\xxx\Dump b:\testtext.bin > b:\testcopy.txt"

正常に作動しましたけどねえ!!

【49382】Re:shell関数で">"を使いた...
発言  ichinose  - 07/6/3(日) 10:50 -

引用なし
パスワード
   ダンプリストをVBAで作成すると、

新規ブックの標準モジュールに
'========================================================
Sub disp_fl_dump()
  Columns("a:b").NumberFormatLocal = "@"
  Call dump(1, 1)
End Sub
'===============================================================
Sub dump(rw As Long, col As Long)
  Dim buf As String
  Dim bt() As Byte
  Dim flnm
  Dim d_data
  Dim svrw As Long
  Dim kdx As Long
  Dim filesize As Long
  svrw = rw
  flnm = Application.GetOpenFilename()
  If flnm <> False Then
    If open_fl(flnm, 16, filesize) = 0 Then
'           ↑この16を変更すると、一行の表示バイト数の変更ができます
     jdx = 0
     Do While get_fl(bt(), kdx) = 0
       d_data = ""
       For idx = LBound(bt()) To UBound(bt())
        d_data = d_data & IIf(Len(Format(Hex(bt(idx)), "00")) = 1, "0" & Hex(bt(idx)), Format(Hex(bt(idx)), "00"))
        Next idx
       jdx = jdx + kdx
       Cells(svrw, col).Value = String(8 - Len(Hex(kdx)), "0") & Hex(kdx)
       Cells(svrw, col + 1).Value = d_data
       svrw = svrw + 1
       Loop
     cls_fl
     End If
    End If
End Sub

別の標準モジュールに
'================================================================
Private flno As Long
Private restsz As Long
Private buffer As Long
'================================================================
Function open_fl(flnm, buffzs As Long, flsize As Long) As Long
  On Error Resume Next
  flno = FreeFile()
  Open flnm For Binary As #flno
  open_fl = Err.Number
  If open_fl = 0 Then
    restsz = LOF(flno)
    buffer = buffzs
    flsize = restsz
    End If
  On Error GoTo 0
End Function
'================================================================
Sub cls_fl()
  On Error Resume Next
  Close #flno
  On Error GoTo 0
End Sub
'================================================================
Function get_fl(bt() As Byte, g_idx As Long) As Long
  On Error Resume Next
  Dim readbyte As Long
  If restsz <= 0 Then
    get_fl = 1
  Else
    If restsz >= buffer Then
     readbyte = buffer - 1
    Else
     readbyte = restsz - 1
     End If
    g_idx = Loc(flno)
    ReDim bt(readbyte)
    Get #flno, , bt()
    get_fl = Err.Number
    If get_fl = 0 Then
     restsz = restsz - readbyte - 1
     End If
    End If
  On Error GoTo 0
End Function
'================================================================
Function put_fl(bt() As Byte) As Long '今回は、使いませんが
  On Error Resume Next
  Put #flno, , bt()
  put_fl = Err.Number
  On Error GoTo 0
End Function


これでdisp_fl_dumpを実行してみてください。

指定したファイルのダンプリストがアクティブシートに表示されます。
例は、シート表示ですが、テキストファイルへの書き込みが必要なら、
変更してください。

【49386】Re:shell関数で">"を使いた...
お礼  よちよち  - 07/6/3(日) 15:06 -

引用なし
パスワード
   有難う御座いました。
目的とした処理に何とか組み込めそうです。月曜日に会社で試して見ます。
沢山の方のレスに感謝!!

【49417】Re:shell関数で">"を使いた...
お礼  よちよち  - 07/6/4(月) 19:56 -

引用なし
パスワード
   お礼が遅くなりました。
今日、会社でテストし、思い通りの結果が出ました。
結局、">"はshell関数のサポート範囲ではなく、cmd の制御の中で実行できる
と言う事ですね。 cmdは知らなかったのですが使い方を理解できました。
1つ賢くなったかな。
同じアドバイスを、ichinoseさんからも戴いていました。

有難う御座いました。

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