【選手権お題その2】この漫画の2コマ目を考えてください

マクロは全く分かりませんが、構文が分かれば使える程度です。
下記例のような文字列を一定条件をもとに並び替えるマクロをご教授ください。
例.XAA*AB-(**A,*A,B*),XAA*AA-(**B,ACB,AB)
正しい並び順→XAA*AA-(**B,AB,ACB),XAA*AB-(*A,**A,B*)

条件:①*優先
   ②2文字優先
   ③アルファベット若い順

宜しくお願い致します。

A 回答 (3件)

Sub SortStrings()


Dim inputStr As String
Dim groups() As String
Dim sortedGroups() As String
Dim i As Integer

' 入力文字列
inputStr = "XAA*AB-(**A,*A,B*),XAA*AA-(**B,ACB,AB)"

' グループごとに分割
groups = Split(inputStr, "),")
ReDim sortedGroups(UBound(groups))

For i = 0 To UBound(groups)
' グループ内の文字列を分割してソート
sortedGroups(i) = SortGroup(groups(i))
Next i

' ソートされたグループを連結して出力
Dim result As String
result = Join(sortedGroups, "),") & ")"

' 結果をメッセージボックスで表示
MsgBox result
End Sub

Function SortGroup(groupStr As String) As String
Dim prefix As String
Dim items() As String
Dim sortedItems() As String

' プレフィックスとアイテムに分割
Dim splitPos As Integer
splitPos = InStr(groupStr, "-(")
prefix = Left(groupStr, splitPos + 1)
items = Split(Mid(groupStr, splitPos + 2, Len(groupStr) - splitPos - 2), ",")

' アイテムをソート
sortedItems = SortItems(items)

' ソートされたアイテムを連結
SortGroup = prefix & Join(sortedItems, ",")
End Function

Function SortItems(items() As String) As String()
Dim i As Integer, j As Integer
Dim temp As String

' バブルソートでアイテムをソート
For i = LBound(items) To UBound(items) - 1
For j = i + 1 To UBound(items)
If CompareItems(items(i), items(j)) > 0 Then
temp = items(i)
items(i) = items(j)
items(j) = temp
End If
Next j
Next i

SortItems = items
End Function

Function CompareItems(item1 As String, item2 As String) As Integer
' 比較ルール:
' 1. '*'を優先
' 2. 2文字を優先
' 3. アルファベット順
Dim len1 As Integer, len2 As Integer
len1 = Len(item1)
len2 = Len(item2)

If InStr(item1, "*") > 0 And InStr(item2, "*") = 0 Then
CompareItems = -1
ElseIf InStr(item1, "*") = 0 And InStr(item2, "*") > 0 Then
CompareItems = 1
ElseIf len1 = 2 And len2 <> 2 Then
CompareItems = -1
ElseIf len1 <> 2 And len2 = 2 Then
CompareItems = 1
Else
CompareItems = StrComp(item1, item2, vbTextCompare)
End If
End Function
    • good
    • 2
この回答へのお礼

構文まで作っていただき有難うざいました。
素人なので分からないので質問させてください。
例.XAA*AB-(**A,*A,B*),XAA*AA-(**B,ACB,AB)
上記の並び替える前の文字列はセルのどこに配置すればよいのでしょうか?
また、条件をもとに並び替えられた文字列はどこのセルに表示されるのでしょうか?
宜しくお願い致します。

お礼日時:2024/06/30 11:22

急いでいます!!


とのアイコンがありますが・・・・。。

まず、急がずに立ち止まって下さい。
一度、落ち着いて考えをまとめて下さい。

他の方も書かれているように、どうしたいのかが全く伝わってきません。

他人に質問する前に、何をしたくて、どうなるのが正解なのか。
あなたのやりたいことが既にまとまっているのであれば、それをどう表現すれば正しく相手に伝わるのかを、よく整理して下さい。

自分で何かを作る時でも、誰かに作ってもらうように依頼する時でも同じですが、やるべき事を正しく定義することが第一です。

なんとなくこんな感じにしたい。という段階でいきなり作り始めようとするから、思い通りにならなくてどうしたらいいか分からなくなるのです。

他人に聞く前に、まず自分の考えを整理しましょう。
    • good
    • 2
この回答へのお礼

すいません。
言葉足りずで申し訳ないです。
ご指摘ありがとうございました。

お礼日時:2024/06/30 11:16

こんにちは



ご説明を読んでもルールがさっぱりわかりません。

勝手に想像すると・・
以下の2タイプの文字列が混在する時に
(*はワイルドカード1文字)
 タイプ1:XAA*AB-(**A,*A,B*)
 タイプ2:XAA*AA-(**B,ACB,AB)
まず、タイプ1が昇順の小さいものと見做される。
(既定のタイプ以外の文字列があった場合の扱いが不明ですけれど・・)

次に、ワイルドカード(=*)の文字部分を比較し、昇順に並べ替えるということなのでしょうか?
>②2文字優先
の意味がわかりませんが、連続している2文字(=*2個)の部分が評価の優先順位が高いものとするということなのかな?
であるなら、その文字を先に持ってくるように組み替えれば良いでしょう。

上記が雰囲気として合っているなら、並べ替えのキー1にタイプの種別を、キー2として比較文字列を参照するようにしておけばよさそうに思います。
(異なる場合でも、ほぼ同様にすれば可能と思います)


>構文が分かれば使える程度です。
タイプを分類するには、正規表現のTestを利用するかLike演算子でも可能でしょう。
正規表現
http://officetanaka.net/excel/vba/tips/tips38.htm
Like演算子
https://learn.microsoft.com/ja-jp/office/vba/lan …

キー2に使う文字列を抜き出すなら、上記同様に正規表現で行うか、あるいはMIDなどの文字列関数で、必要部分を抜き出して質問者様が思う評価の優先順位順に組み合わせれば良いです。
https://learn.microsoft.com/ja-jp/office/vba/lan …

並べ替えの処理は自前で行っても良いですが、エクセルのシート機能に「並べ替え」があるのでそちらを利用する方が簡単だと思います。
https://learn.microsoft.com/ja-jp/office/vba/api …
    • good
    • 2
この回答へのお礼

すいません。
言葉足りずで申し訳ないです。
ご指導の方策を試してみます。
有難うございました。

お礼日時:2024/06/30 11:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A