|
いろいろやってみましたが、一応こんな感じのプログラムでナンとか形に
なりました。ちなみにこちらのテスト環境は Win98 + Excel2000 です。
Sub MyTxtView_GetData()
Dim MyF As String, SFn As String, MySt As String
Dim FSO As Object
Dim Lin As Variant, NAry As Variant, C As Variant
Dim x As Long, y As Long, Ofp As Long, i As Long
Dim NAry2() As Long
Dim Ck As Boolean, Ck2 As Boolean
Const FSt As String = _
"テキストファイル(*.txt;*.csv),*.txt;*.txt"
Const ComSt As String = "COMMAND.COM /K EDIT /R "
ChDir "C:\My Documents"
MyF = Application.GetOpenFilename(FSt)
If VarType(MyF) = 11 Then Exit Sub
Set FSO = CreateObject("Scripting.FileSystemObject")
SFn = FSO.GetFile(MyF).ShortPath
CreateObject("WScript.Shell").Run ComSt & SFn, 1, True
Do
Ck = False: Ck2 = False
Lin = Application.InputBox("シートに入力する行番号を" & _
vbLf & "カンマ又はスペース区切りで入力", Type:=3)
x = InStr(1, Lin, ","): y = InStr(1, Lin, ChR(32))
If x > 0 Then
NAry = Split(Lin, ",")
For Each C In NAry
If Not IsNumeric(C) Then
Ck = True: Exit For
End If
Next
ElseIf y > 0 Then
NAry = Split(Lin, ChR(32))
If UBound(NAry) <> 1 Then
Ck = True
End If
If Not IsNumeric(NAry(0)) Or _
Not IsNumeric(NAry(1)) Then
Ck = True
End If
Ck2 = True
Else
Ck = True
End If
Loop While Ck = True
If Ck2 = True Then
For i = NAry(0) To NAry(1)
ReDim Preserve NAry2(i): NAry2(i) = i
Next i
Else
For i = LBound(NAry) To UBound(NAry)
ReDim Preserve NAry2(i): NAry2(i) = NAry(i)
Next i
End If
Erase NAry
With FSO.OpenTextFile(MyF)
Do Until .AtEndOfStream
If IsError(Application.Match(.Line, NAry2, 0)) Then
.SkipLine
Else
MySt = .ReadLine
ActiveCell.Offset(Ofp).Value = MySt
Ofp = Ofp + 1
End If
Loop
.Close
End With
Set FSO = Nothing: Erase NAry2
Range(ActiveCell, ActiveCell.End(xlDown)) _
.TextToColumns DataType:=xlDelimited, Tab:=True, Comma:=True, _
Space:=True, ConsecutiveDelimiter:=True
ChDir Application.DefaultFilePath
End Sub
*準備
1
>ChDir "C:\My Documents"
を、そちらでテキストファイルを保存しているパスに変更する。
2
>Const ComSt As String = "COMMAND.COM /K EDIT /R "
を、Win2000,WinXP を使っている場合
Const ComSt As String = "CMD.EXE /K EDIT /R "
に変更する。
3
空白シートを開き、データの入力を開始するセルを1つ選択する。
(このセルから入力したデータを、カンマ・スペース・タブのいずれの場合も
区切り文字として、右隣りの各列へ分割・展開します。従って右隣りに充分な
空白列を確保しておいて下さい。)
*使い方
準備が済んでマクロを実行すると、初めに目的のテキストを指定するダイアログ
が出ます。これでファイルを選択して OK を押すと、DOS窓が開いてテキストの
内容が表示されます。[↑],[↓]の方向キーを押していくと、DOS画面の右下に
カーソル位置の行番号が表示されます。([←],[→]のキーは列の表示になりますが、
これは関係ないので触らないで下さい)
取りこみたい行番号をメモしておきます。このとき飛び飛びの行ならカンマ区切り、
連続した行番号だけならスペース区切りにすることを、念頭において下さい。
DOS画面右上端の×ボタンで、窓を閉じます。ここで警告メッセージが出ますが
構わず OK して閉じて下さい。次に、行番号を入力する InputBox が出ます。
ここで先にメモした番号を、飛び飛びなら "3,7,10,11,14 ・・"というように
カンマ区切りで、連続した行番号は "3 14" とスペース区切りで始めと終わりの
数値を入力します。OK を押すと正しく入力されている場合のみ、アクティブセル
以下にデータが入力されていき、最後にテキストの区切り文字に従って各セルに
分割されます。InputBox の入力値が正しく取得されるまで、繰り返しボックスが
出てきます。
ま、そんなところですが、VBAだけを駆使してプログラミングするなら、こんな
程度が限界かも知れません・・。
|
|