Excel VBA質問箱 IV

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

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


6275 / 13644 ツリー ←次へ | 前へ→

【46135】ソートしながら読み込むには? 華麗パン 07/1/23(火) 21:15 質問[未読]
【46136】Re:ソートしながら読み込むには? Kein 07/1/23(火) 22:36 回答[未読]
【46181】Re:ソートしながら読み込むには? 華麗パン 07/1/25(木) 20:21 お礼[未読]
【46191】Re:ソートしながら読み込むには? Kein 07/1/25(木) 23:10 回答[未読]
【46218】Re:ソートしながら読み込むには? Kein 07/1/26(金) 20:15 回答[未読]
【46220】Re:ソートしながら読み込むには? 華麗パン 07/1/27(土) 0:22 お礼[未読]

【46135】ソートしながら読み込むには?
質問  華麗パン  - 07/1/23(火) 21:15 -

引用なし
パスワード
   過去ログ(42581)に類似したテキストデータ(可変長)を読み込みたいのですが
可能でしょうか?
[ID] 1111
{
ABC 11.12
ADD 12.32
ABD 11.11
FBC 55.66
ZBC 55.52
}
並び替えだけしますと・・・
{
FBC 55.66
ZBC 55.52
ADD 12.32
ABC 11.12
ABD 11.11
}

過去の例との相違点は文字 スペース 少数点2桁の数字(単位%)で{で始まり
}で終わるかたまりを大きいもの順に読み込みたいのです。
255個を超えることはまずなく、横に転記していきたいのです。

読み込み後のシート
 A  B  C  D  E  F
1111 FBC ZBC ADD ABC ABD
2222 SDF GFT
3333 QWE          (←上例にはありませんがこのような感じです)

こんなイメージなのですが、・・・
また、9.45以下のものは読み込みたくないです。
よろしくお願いします。

Sub Test_MyDataSort()

LR = ここがわかりません
  ReDim Ary(1 To LR)
  For i = 1 To LR
    Ary(i) = Cダブル(Line Input #1, Buf,右の数字部分)
  Next i
  temp = Array_Sort(Ary())
  For j = 1 To LR
    With Cells(IDごとのカウンタ+1, j)
     St = Left$(左の文字部分)
     .Value = St
    End With
  Next j
End Sub

Private Function Array_Sort(ByVal NotSortedArry As Variant) As Variant
  Dim i As Long, j As Long
  Dim vElm As Variant

  For i = LBound(NotSortedArry) To UBound(NotSortedArry)
    For j = i + 1 To UBound(NotSortedArry)
     If NotSortedArry(i) < NotSortedArry(j) Then
       vElm = NotSortedArry(j)
       NotSortedArry(j) = NotSortedArry(i)
       NotSortedArry(i) = vElm
     End If
    Next
  Next
  Array_Sort = NotSortedArry
End Function

【46136】Re:ソートしながら読み込むには?
回答  Kein  - 07/1/23(火) 22:36 -

引用なし
パスワード
   エクセルの並べ替え機能を使ってみました。
例示されているようなデータで間違いなければ、うまくいくはずですが。

Sub MyTxt_Sort()
  Dim MyF As String, buf As String
  Dim i As Long
  Dim Ary As Variant
 
  With Application
   MyF = .GetOpenFilename("テキストファイル(*.txt),*.txt")
   If MyF = "False" Then Exit Sub
   .ScreenUpdating = False
  End With
  Cells.ClearContents: On Error GoTo Eline
  Open MyF For Input Access Read As #1
  Do Until EOF(1)
   Line Input #1, buf
   Select Case True
     Case Left$(buf, 1) = "["
      i = i + 1: Ary = Split(buf, Chr(32))
      Cells(i, 1).Value = Ary(1)
      Erase Ary
     Case Left$(buf, 1) Like "[A-Z]"
      Ary = Split(buf, Chr(32))
      If CSng(Ary(1)) > 9.45 Then
        Ary = WorksheetFunction.Transpose(Ary)
        Cells(i, 256).End(xlToLeft).Offset(, 1) _
        .Resize(2).Value = Ary
      End If
      Erase Ary
     Case Left$(buf, 1) = "}"
      Range(Cells(i, 2), Cells(i + 1, 256).End(xlToLeft)) _
      .Sort Key1:=Rows(i + 1), Order1:=xlDescending, _
      Header:=xlNo, Orientation:=xlSortRows
      Rows(i + 1).ClearContents
     Case Else: Debug.Print Asc(Left$(buf, 1))
   End Select
  Loop
Eline:
  Close #1
  If Err.Number = 0 Then
   MsgBox Dir(MyF) & " の読み込みを終了しました", 64
  Else
   MsgBox "エラー発生", 48
  End If
  Application.ScreenUpdating = True
End Sub

【46181】Re:ソートしながら読み込むには?
お礼  華麗パン  - 07/1/25(木) 20:21 -

引用なし
パスワード
   ▼Kein さん:
>エクセルの並べ替え機能を使ってみました。
>例示されているようなデータで間違いなければ、うまくいくはずですが。
>

短い説明しかできませんでしたが、私の望む通りで、しかも早く処理できる
コードで、うまい人が作るとこうも違うのかと勉強になりました。
ありがとうございます。

1日なやんだのですが、はじめに言わなかったためにお手間なのですが
実は1行目が改行?かスペースがあるらしく、エラーになります。
また、その後に
{
受付日(スペース)08/01/31
}
が入ります。
これを除いたテキストファイルだと完璧なのですが、・・・。
select caseの並びがミソだとは思うのですが、アドバイス願えませんでしょう
か?

【46191】Re:ソートしながら読み込むには?
回答  Kein  - 07/1/25(木) 23:10 -

引用なし
パスワード
   必ず先頭の4行が不要、ということならループで読み飛ばせばよいのです。

Sub MyTxt_Sort2()
  Dim MyF As String, buf As String, CkS As String
  Dim i As Long, j As Long
  Dim Ary As Variant
 
  With Application
   MyF = .GetOpenFilename("テキストファイル(*.txt),*.txt")
   If MyF = "False" Then Exit Sub
   .ScreenUpdating = False
  End With
  Cells.ClearContents: On Error GoTo Eline
  Open MyF For Input Access Read As #1
  For j = 1 to 4
    Line Input #1, buf
  Next j
  Do Until EOF(1)
   Line Input #1, buf
   CkS = Left$(buf, 1)
   Select Case True
     Case CkS = "["
      i = i + 1: Ary = Split(buf, Chr(32))
      Cells(i, 1).Value = Ary(1)
      Erase Ary
     Case CkS Like "[A-Z]"
      Ary = Split(buf, Chr(32))
      If CSng(Ary(1)) > 9.45 Then
        Ary = WorksheetFunction.Transpose(Ary)
        Cells(i, 256).End(xlToLeft).Offset(, 1) _
        .Resize(2).Value = Ary
      End If
      Erase Ary
     Case CkS = "}"
      Range(Cells(i, 2), Cells(i + 1, 256).End(xlToLeft)) _
      .Sort Key1:=Rows(i + 1), Order1:=xlDescending, _
      Header:=xlNo, Orientation:=xlSortRows
      Rows(i + 1).ClearContents
     Case Else: Debug.Print CkS
   End Select
  Loop
Eline:
  Close #1
  If Err.Number = 0 Then
   MsgBox Dir(MyF) & " の読み込みを終了しました", 64
  Else
   MsgBox "エラー発生", 48
  End If
  Application.ScreenUpdating = True
End Sub

【46218】Re:ソートしながら読み込むには?
回答  Kein  - 07/1/26(金) 20:15 -

引用なし
パスワード
   もう一つ全く別の方法でも出来そうなので、テストしてみて下さい。
空白シートにクエリーテーブルを定義して、5行目から読み込みます。

Sub Txt_Query()
  Dim MyR As Range, MyR2 As Range
  Dim i As Long, FR As Long
  Const MyF As String = _
  "C:\Documents and Settings\User\My Documents\testA.txt"
  '↑実際に読み込むテキストファイルのフルパスに変更
 
  Application.ScreenUpdating = False
  Cells.ClearContents
  With ActiveSheet.QueryTables.Add(Connection:= _
   "TEXT;" & MyF, Destination:=Range("A1"))
   .Name = "testA" '←これも当該テキストファイルの名前に変更
   .FieldNames = False
   .RefreshStyle = xlInsertDeleteCells
   .AdjustColumnWidth = False
   .TextFilePlatform = xlWindows
   .TextFileStartRow = 5
   .TextFileParseType = xlDelimited
   .TextFileConsecutiveDelimiter = True
   .TextFileSpaceDelimiter = True
   .Refresh BackgroundQuery:=False
   .Delete
  End With
  With Range("A1", Range("A65536").End(xlUp)).Offset(, 255)
   .Formula = _
   "=IF(OR($A1=""{"",$A1=""}""),TRUE,IF($A1=""[ID]"",ROW(),""a""))"
   .Value = .Value
   Set MyR = .SpecialCells(2, 2).Offset(, -255)
   Set MyR2 = .SpecialCells(2, 1).Offset(, -253)
  End With
  For i = 1 To MyR.Areas.Count
   With MyR.Areas(i)
     .Resize(, 2).Sort Key1:=.Range("B1"), Order1:=xlDescending, _
     Header:=xlNo, Orientation:=xlSortColumns
     MyR2.Areas(i).Resize(, .Count).Value = _
     WorksheetFunction.Transpose(.Value)
   End With
  Next i
  Range("A1", Range("A65536").End(xlUp)).Resize(, 256) _
  .Sort Key1:=Columns(256), Order1:=xlAscending, Header:=xlNo, _
  Orientation:=xlSortColumns
  FR = WorksheetFunction.Match("a", Range("IV:IV"), 0)
  Rows(FR & ":" & 65536).ClearContents
  Range("IV:IV").ClearContents
  Range("A:A").Delete xlShiftToLeft
  Application.ScreenUpdating = True
  Set MyR = Nothing: Set MyR2 = Nothing
  With ThisWorkbook
   .Names(.Names.Count).Delete
  End With
End Sub

【46220】Re:ソートしながら読み込むには?
お礼  華麗パン  - 07/1/27(土) 0:22 -

引用なし
パスワード
   ▼Kein さん:
>もう一つ全く別の方法でも出来そうなので、テストしてみて下さい。
>空白シートにクエリーテーブルを定義して、5行目から読み込みます。
>
こんばんわ。
クエリーは未経験で勉強になります。
家ではKingsoftのエクセル使用のため、来週会社で試みてみます。

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