Excel VBA質問箱 IV

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

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


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

【36443】並び替え グラ吉 06/3/31(金) 10:53 質問[未読]
【36445】Re:並び替え ともた 06/3/31(金) 12:36 回答[未読]
【36446】Re:並び替え グラ吉 06/3/31(金) 13:13 質問[未読]
【36448】Re:並び替え Blue 06/3/31(金) 14:21 発言[未読]
【36456】Re:並び替え ichinose 06/3/31(金) 16:08 発言[未読]
【36464】Re:並び替え Blue 06/3/31(金) 17:43 お礼[未読]
【36613】Re:並び替ヲ グラ吉 06/4/5(水) 15:43 お礼[未読]

【36443】並び替え
質問  グラ吉  - 06/3/31(金) 10:53 -

引用なし
パスワード
   VBAの並び替えについて教えてください。

さいころを振って出た目のデータがあります。
SAINOME(12)=1,1,1,1,2,2,2,3,3,5,6,6
このさいの目をそれぞれ(Sai_1:さいの目が1を表してます)
Sai_1=4
Sai_2=3
Sai_3=2
Sai_4=0
Sai_5=1
Sai_6=2
といった様に取得しました。
データを並び替えしてさいの目が出た回数の多い順に並び替えたいです。
表示するときにはさいの目が出た回数ではなく、さいの目で表示させたいです。

1,2,3,6,5,4

といった感じで。

どのようにVBを組めばいいでしょうか?

【36445】Re:並び替え
回答  ともた  - 06/3/31(金) 12:36 -

引用なし
パスワード
   どこで、出目の回数をカウントアップするかはともかくとして
たとえば、

セルA / セルB
Sai_1 / 4
Sai_2 / 3
Sai_3 / 2
Sai_4 / 0
Sai_5 / 1
Sai_6 / 2

セルBを出目の回数とした場合にこれをソートする。


  Columns("A:B").Select
  Selection.Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
    :=xlPinYin, DataOption1:=xlSortNormal
こんな感じでソート出来ますけれど・・・
要件あってますか?

【36446】Re:並び替え
質問  グラ吉  - 06/3/31(金) 13:13 -

引用なし
パスワード
   ともたさんありがとうございます。

ともたさんの方法ではエクセルシートを利用しているようですが、
実はやっているのが
CSVファイルからデータを読み込んで
エクセルシートは利用しないで計算させ、
CSVに出力しているので出来ればシートを利用しない方法がいいです。

ソートした結果を配列で取得したいです

【36448】Re:並び替え
発言  Blue  - 06/3/31(金) 14:21 -

引用なし
パスワード
   ' ユーザ定義型を使ったサンプル(かなり適当)
Option Explicit

Private Type Dice
  Value As Integer  ' 目
  Count As Integer  ' 回数
End Type

Public Sub Test()
  Dim CSVData() As String
  Dim DiceInfo(5) As Dice ' サイコロの情報
  Dim i As Long
  Dim swapped As Boolean
  Dim temp As Dice
  
  ' 初期化
  For i = LBound(DiceInfo) To UBound(DiceInfo)
    DiceInfo(i).Value = i + 1
  Next
  
  ' カンマ区切りに配列に設定
  CSVData = Split("1,1,1,1,2,2,2,3,3,5,6,6", ",")
  
  ' 振り分け
  For i = LBound(CSVData) To UBound(CSVData)
    DiceInfo(CInt(CSVData(i)) - 1).Count = _
             DiceInfo(CInt(CSVData(i)) - 1).Count + 1
  Next
  
  ' 回数による降順並び替え(バブルソート)
  Do
    swapped = False
    For i = LBound(DiceInfo) To UBound(DiceInfo) - 1
      If DiceInfo(i).Count < DiceInfo(i + 1).Count Then
        swapped = True
        ' 入れ替え
        temp = DiceInfo(i)
        DiceInfo(i) = DiceInfo(i + 1)
        DiceInfo(i + 1) = temp
      End If
    Next
  Loop Until swapped
  
  ' イミディエイトウィンドウに表示
  For i = LBound(DiceInfo) To UBound(DiceInfo)
    Debug.Print CStr(i + 1) & "位:"; DiceInfo(i).Value
  Next
End Sub

【36456】Re:並び替え
発言  ichinose  - 06/3/31(金) 16:08 -

引用なし
パスワード
   皆さん、こんにちは。


▼Blue さん:
>' ユーザ定義型を使ったサンプル(かなり適当)
>Option Explicit
>
>Private Type Dice
>  Value As Integer  ' 目
>  Count As Integer  ' 回数
>End Type
>
>Public Sub Test()
>  Dim CSVData() As String
>  Dim DiceInfo(5) As Dice ' サイコロの情報
>  Dim i As Long
>  Dim swapped As Boolean
>  Dim temp As Dice
>  
>  ' 初期化
>  For i = LBound(DiceInfo) To UBound(DiceInfo)
>    DiceInfo(i).Value = i + 1
>  Next
>  
>  ' カンマ区切りに配列に設定
>  CSVData = Split("1,1,1,1,2,2,2,3,3,5,6,6", ",")
>  
>  ' 振り分け
>  For i = LBound(CSVData) To UBound(CSVData)
>    DiceInfo(CInt(CSVData(i)) - 1).Count = _
>             DiceInfo(CInt(CSVData(i)) - 1).Count + 1
>  Next
>  
>  ' 回数による降順並び替え(バブルソート)
>  Do
>    swapped = False
>    For i = LBound(DiceInfo) To UBound(DiceInfo) - 1
>      If DiceInfo(i).Count < DiceInfo(i + 1).Count Then
>        swapped = True
>        ' 入れ替え
>        temp = DiceInfo(i)
>        DiceInfo(i) = DiceInfo(i + 1)
>        DiceInfo(i + 1) = temp
>      End If
>    Next
   Loop While swapped
'ではないですか?

>  
>  ' イミディエイトウィンドウに表示
>  For i = LBound(DiceInfo) To UBound(DiceInfo)
>    Debug.Print CStr(i + 1) & "位:"; DiceInfo(i).Value
>  Next
>End Sub


それはともかく・・・・。

>ともたさんの方法ではエクセルシートを利用しているようですが、
>実はやっているのが
>CSVファイルからデータを読み込んで
>エクセルシートは利用しないで計算させ、
>CSVに出力しているので出来ればシートを利用しない方法がいいです。

「CSVファイルのI/Oだから、シートを利用したくない」の
因果関係がわかりません。
つまり、CVSファイルのを読み込んだり、書き込んだりの処理があっても
シートを利用すれば処理が簡単なら、それのほうが良くないですか?

これ、ワークシート関数のRankを使うと比較的容易に処理できると
思いますが・・・。

>ソートした結果を配列で取得したいです
シートに結果を出した後に、配列に取得することは簡単ですよ!!


ソートのアルゴリズムを学びたいと言うのであれば、
ここの過去ログにも簡単なのから、難しいものまで
ありますけどね!!

【36464】Re:並び替え
お礼  Blue  - 06/3/31(金) 17:43 -

引用なし
パスワード
   >   Loop While swapped
>'ではないですか?
本当ですね。間違ってました。ご指摘ありがとうございました。

【36613】Re:並び替ヲ
お礼  グラ吉  - 06/4/5(水) 15:43 -

引用なし
パスワード
   Blueさん
ichinoseさん

ありがとうございます。
自分なりに理解してみました。時間がかかりましたが・・・

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