Excel VBA質問箱 IV

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

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


68605 / 76734 ←次へ | 前へ→

【12662】Re:データ形式が、CSVやタブ形式など不特...
回答  kein  - 04/4/10(土) 22:27 -

引用なし
パスワード
   いろいろやってみましたが、一応こんな感じのプログラムでナンとか形に
なりました。ちなみにこちらのテスト環境は 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だけを駆使してプログラミングするなら、こんな
程度が限界かも知れません・・。

 

0 hits

【12628】データ形式が、CSVやタブ形式など不特定... さんい 04/4/9(金) 15:10 質問
【12643】Re:データ形式が、CSVやタブ形式など不特定... Jaka 04/4/9(金) 17:11 回答
【12650】Re:データ形式が、CSVやタブ形式など不特... さんい 04/4/9(金) 17:40 質問
【12656】Re:データ形式が、CSVやタブ形式など不特... kein 04/4/9(金) 21:38 発言
【12659】Re:データ形式が、CSVやタブ形式など不特... さんい 04/4/10(土) 13:11 質問
【12662】Re:データ形式が、CSVやタブ形式など不特... kein 04/4/10(土) 22:27 回答
【12663】Re:データ形式が、CSVやタブ形式など不特... kein 04/4/10(土) 22:37 発言
【12676】Re:エラーがでますが、・・・ さんい 04/4/12(月) 10:17 質問
【12686】Re:エラーがでますが、・・・ Kein 04/4/12(月) 15:32 発言
【12690】Re:エラーがでますが、・・・ さんい 04/4/12(月) 15:48 質問
【12691】Re:エラーがでますが、・・・ Kein 04/4/12(月) 15:57 発言
【12692】Re:ありがとうございます。 さんい 04/4/12(月) 16:08 お礼
【12693】Re:ありがとうございます。 Kein 04/4/12(月) 16:49 発言
【12695】Re:ありがとうございます。 さんい 04/4/12(月) 17:50 お礼

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