途中にハイフンが入る文字列の並べ替えをマクロを使用して教えてください。
A2からA列に入力されている最下位セルまでを見つけて(今回はA10まで)
A2・・・2
A3・・・5-8
A4・・・1
A5・・・3-4
A6・・・1-2
A7・・・10-11
A8・・・12-13
A9・・・10
A10・・9
上記の並びを下記のようにしたいのですが出来ますでしょうか?
A2・・・1
A3・・・1-2
A4・・・2
A5・・・3-4
A6・・・5-8
A7・・・9
A8・・・10
A9・・・10-11
A10・・12-13
B列以降にはデータが入っています。
宜しくお願い致します。
No.5
- 回答日時:
No.4です。
たびたびごめんなさい。
前回のコードで1行間違っていました。
>.Formula = "=IF(ISNUMBER(FIND(""-"",B2)),LEFT(B2,FIND(""-"",B2)-1)*1,B2*1)"
の行を
>.Formula = "=IF(ISNUMBER(FIND(""-"",B2)),LEFT(B2,FIND(""-"",B2)-1)*1000+MID(B2,FIND(""-"",B2)+1,3),B2*1000)"
に変更してください。
※ ハイフン以降は最大3桁までとしています。
※ 関数でやる方法を単純にコードにしただけです。m(_ _)m
No.4ベストアンサー
- 回答日時:
こんばんは!
普通の並び替えで良いのであれば一例です。
Sub 並び替え()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
Range("A:A").Insert
With Range(Cells(2, "A"), Cells(lastRow, "A"))
.Formula = "=IF(ISNUMBER(FIND(""-"",B2)),LEFT(B2,FIND(""-"",B2)-1)*1,B2*1)"
.Value = .Value
End With
Range("A1").CurrentRegion.Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlYes
Range("A:A").Delete
Application.ScreenUpdating = True
End Sub
質問文をよくよく読んでみると、A列のみ並び替えをしたい!という意味にも読み取れますので
他の列はそのままの状態にしたい場合は
↓のコードにしてみてください。
Sub A列のみ並び替え()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
Range("A:A").Insert
Range("C:C").Insert
With Range(Cells(2, "A"), Cells(lastRow, "A"))
.Formula = "=IF(ISNUMBER(FIND(""-"",B2)),LEFT(B2,FIND(""-"",B2)-1)*1,B2*1)"
.Value = .Value
End With
Range("A1").CurrentRegion.Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlYes
Range("C:C").Delete
Range("A:A").Delete
Application.ScreenUpdating = True
End Sub
こんな感じではどうでしょうか?m(_ _)m
普通の並び替えでいいんです。
ただし、ハイフンがネックだったので
ハイフンを.(小数点)に置換してみたりしたのですが、
どうも思うような結果が得られず、苦戦してました。
No.5の補足回答に修正したところ
思うような結果が得られ、且つシンプルなため
ベストアンサーに選ばさせていただきました。
ありがとうございました。
No.3
- 回答日時:
こんばんは。
なぜ、以下のようなコードになるかというと、上書きが前提となるわけで、他の書き方はあるにしても、元のデータを壊さないようにするには、配列を使わざるを得ません。それと、元のデータは、0サフィックスになっていますから、余計にややこしいです。これが、一定の桁の決まりのある数字ならよいのですが、そいういう前提が書かれていません。一応、バブルソート・アルゴリズムを利用しました。
なんとなく、達成感がありませんから、実際のデータでは、*の部分に間違いがあるかもしれません。
'//
Sub SpecialSort()
Dim Rng As Range
Dim i As Long
Dim j As Long
Dim c As Variant
Dim Nums As Variant
Dim Ar0() As Variant
Dim Ar1() As Variant
Dim Ar2() As Variant
Const CL As String = "A" '書き出し列
'範囲
Set Rng = Range("A2", Cells(Rows.Count, 1).End(xlUp))
Ar0 = Application.Transpose(Rng.Value)
ReDim Ar1(Rng.Rows.Count - 1, 1)
For Each c In Rng
Nums = Split(c.Text, "-")
If UBound(Nums) = 0 Then
Ar1(i, 0) = Format(Nums(0), "00") & "00" '*
Else
Ar1(i, 0) = Format(Nums(0), "00") & Format(Nums(1), "00") '*
End If
Ar1(i, 1) = i + 1
i = i + 1
Next c
Ar2 = BabbleSort(Ar1())
j = 2 '書き出し初期値行
For i = 0 To UBound(Ar2(), 1)
Cells(j, CL).Value = "'" & Ar0(Ar2(i, 1))
j = j + 1
Next i
End Sub
Function BabbleSort(Ar() As Variant)
'パラメータは、2次元配列
Dim u As Long
Dim i As Long
Dim j As Long
Dim t1 As Variant
Dim t2 As Variant
u = UBound(Ar(), 1)
i = LBound(Ar(), 1)
Do While i < u
j = u
Do While j > i
If Ar(j, 0) < Ar(i, 0) Then '昇順
t1 = Ar(j, 0)
t2 = Ar(j, 1)
Ar(j, 0) = Ar(i, 0)
Ar(j, 1) = Ar(i, 1)
Ar(i, 0) = t1
Ar(i, 1) = t2
End If
j = j - 1
Loop
i = i + 1
Loop
BabbleSort = Ar()
End Function
'//
いつもありがとうございます。
実際のデータで動かしてみましたところ
確かに思うような結果が得られました。
サフィックス・・・とか
バブルソート・・・など、VBA無知な私には
コードよりも言葉の勉強になります。(苦笑)
作業列に関数を使った教えのサイトはいくつかあるものの
今回マクロのみでご教示いただいたことは
今後、同じような悩みを抱く人達に とても役に立つコードかと思われます。
ベストアンサー10pt制度があれば・・・
No.2
- 回答日時:
ご質問の意味が、VBAを使って、通常の並べ替え操作のようにリスト全体を並べ替えたいということなら、かなり大がかりなプログラムを組む必要がありそうです。
このようなケースでは、すでに回答があるように関数で補助列に並べ替えに対応できる形にデータ処理をするのが実用的な方法です。
この場合、補助列に以下のような数字に変更した数式を入力するのががわかりよいかもしれません。
=SUBSTITUTE($A$2:INDEX(A:A,COUNTA(A:A)),"-",".")*1
ご希望の操作が、リストの並べ替えではなく、別シートなどに昇順に並べ替えたデータを表示したということなら以下のような関数でご希望の順のリストを作成することができます。
=IFERROR(SUBSTITUTE(SMALL(INDEX(SUBSTITUTE($A$2:INDEX(A:A,COUNTA(A:A)),"-",".")*1,),ROW(1:1)),".","-"),"")
やはり作業列を設けないと容易にはいかないのが分かりました。
幾つかのサイトを見ても ハイフンが入る文字列のマクロ(VBA)での並べ替えが
ヒットしなかったのですが、諦めきれずにダメ元で投稿しました。
しかしながら、的確な関数と、また別の視点からの提案は今後の参考とさせていただきます。
ありがとうございました。
No.1
- 回答日時:
直接は無理ですね。
A2・・・02
A3・・・05-8
A4・・・01
A5・・・03-4
A6・・・01-2
A7・・・10-11
A8・・・12-13
A9・・・10
A10・・09
なら可能ですけど。。。
並べ替え用の列を作っていいならB2に
=IF(COUNTIF(A2,"*-*"),TEXT(LEFT(A2,FIND("-",A2)-1),"00!-")&TEXT(RIGHT(A2,LEN(A2)-FIND("-",A2)),"00"),TEXT(A2*1,"00"))
を入力して下方にコピーで
B2・・・02
B3・・・05-08
B4・・・01
B5・・・03-04
B6・・・01-02
B7・・・10-11
B8・・・12-13
B9・・・10
B10・・09
となりB列をキーに並びかえればお望みの様になります。
ありがとうございます。
作業列を設けて桁数を揃える。ということですね。
ただし桁数を揃えたあとの 0始まりは希望するものと違うので
これはこれで参考とさせていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのA1~A5の任意のセルを選んだら1、A6~A10のセルなら2と返す設定にしたいと思ってます 6 2023/03/20 18:46
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Excel(エクセル) Excelのマクロで、特定のセルから順番に値を取得したい 5 2022/12/06 15:34
- その他(Microsoft Office) エクセルで串刺ししたシートの並べ替えをしたいです 4 2023/02/14 11:59
- Excel(エクセル) [オートフィルター]機能について 3 2023/02/04 14:32
- Visual Basic(VBA) セルに抜けた番号の代わりに空白を挿入する 4 2023/04/10 20:29
- Excel(エクセル) スプレッドシートのマクロで値の入力があるセルの範囲を指定する方法を教えて下さい 2 2022/04/05 17:29
- Excel(エクセル) [スライサー]に関して、 1 2022/05/24 21:07
- Excel(エクセル) EXCEL関数(数式)を教えてください 11 2023/05/09 13:19
- Excel(エクセル) Excelで縦1列に並んだ大量の数字から、一定間隔で平均値を出したい。 2 2023/02/20 09:17
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのデーターが2か月前の...
-
エクセルVBA、別ブックへ転記す...
-
【マクロ】顧客番号にて一致さ...
-
エクセル共有したが、アクセス...
-
エクセル②
-
(マクロ)データをAブックからB...
-
Excelでセルの値が同じか...
-
エクセルを使っていて2024/5/15...
-
指定文字の間に
-
Microsoft 365の Excel を使用...
-
エクセルの計算
-
エクセルでの作業計算方法について
-
Excelで全角を半角にしたいので...
-
エクセル関数に詳しい方教えて...
-
Googleスプレッドシートでファ...
-
エクセル 文字を増やしたい。
-
はがきについて。
-
エクセルの暗号化なしのバーの...
-
【マクロ】必要な項目(列)の...
-
Excel
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報