- 締切済み
エクセル 並び替え
支払調書一覧表をエクセルで作成しております。 エクセルを行をあいうえお順に並び替えたいです。 Cの行に支払先の名前を一覧表に入れてます。 たとえば C5、C6のセルに山崎(c5、c6セルを統合してます、) D5=報酬額,、D6=源泉税 E5=山崎の報酬 E6=山崎の報酬の10%源泉税 E4、F4,G4,、、、の列は1月から12月まで入力 C7,C8=中島 D7=報酬額 D8=源泉税 E7=中島報酬、E8=中島の源泉税 C9,C10=武田 F9=報酬額 F10=源泉税 。。といった感じで 10名ほど あいうえお順不同で報酬、源泉税入力してます。 このC列の名前をあいうえお順にしたいのですが 、報酬額、源泉税を変えないでです。 どうしたらあういうえお準に支払報酬表を作成できるか お知恵とお力をいただけないでしょうか。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- mitarashi
- ベストアンサー率59% (574/965)
最近はまっているdictionaryの応用編で作成してみました。同じ場所での並べ替えではありません。計算式がブロックごと他に複写しても正常に動作する様な作りになっている事が条件です。XL2000用のコードです。コード解説はいたしかねますので、VBA dictionaryで検索してお調べ下さい。 Sub test() Dim targetRange As Range, destRange As Range Dim myDic As Object, myKey As Variant, myKeyS As Variant Dim i As Long Dim keyString As String Dim blockHeight As Long, blockwidth As Long '並べ替えるブロックのサイズ(縦、横セル数) blockHeight = 2 blockwidth = 14 Set targetRange = ActiveSheet.Range("c5").Resize(blockHeight, blockwidth) Set myDic = CreateObject("Scripting.Dictionary") Do Until targetRange.Cells(1, 1).Value = "" keyString = targetRange.Cells(1, 1).Value If Not myDic.exists(keyString) Then myDic.Add keyString, targetRange Else 'ここはキーの重複対策に一応入れてみた。重複が無ければ不要。 Do While myDic.exists(keyString) keyString = keyString & "a" Loop myDic.Add keyString, targetRange End If Set targetRange = targetRange.Offset(blockHeight, 0) Loop myKey = myDic.keys myKeyS = BubbleSortStrings(myKey, 1) 'ブロック先頭セルを結合しているので、先頭セルのみ指定だと、offsetが意図せぬ動作 Set destRange = ActiveSheet.Range("t5").Resize(blockHeight, blockwidth) For i = 0 To myDic.Count - 1 myDic(myKey(i)).Copy destRange.PasteSpecial (xlPasteAll) Set destRange = destRange.Offset(blockHeight, 0) Next Set myDic = Nothing Application.CutCopyMode = False End Sub 'Microsoftのバブルソートを改造 簡単な分遅いかも... 'direction 1:昇順、-1 降順 Private Function BubbleSortStrings(sArray As Variant, direction As Long) As Variant Dim lLoop1 As Long Dim lLoop2 As Long Dim lTemp As String For lLoop1 = UBound(sArray) To LBound(sArray) Step -1 For lLoop2 = LBound(sArray) + 1 To lLoop1 If StrComp(sArray(lLoop2 - 1), sArray(lLoop2)) = direction Then lTemp = sArray(lLoop2 - 1) sArray(lLoop2 - 1) = sArray(lLoop2) sArray(lLoop2) = lTemp End If Next lLoop2 Next lLoop1 BubbleSortStrings = sArray End Function
- nihonjinn
- ベストアンサー率39% (79/200)
関数と並び替えをつかってするなら・・・ まずは結合はまとめて解除しましょう(並び替えするにはどうしても必要) G5に「=PHONETIC(C5)&"1"」 G6に「=PHONETIC(C5)&"2"」 と入れておきます。 次にG5,G6を選択してオートフィルタで下にコピーします。 次に表全体をG列を基準に並び替えします 試してみてください。
- noah7150
- ベストアンサー率46% (116/251)
VBAにするにしてもソートはExcelのソートを使うほうが便利かも 入力用と印刷用を分けてシートにしては如何かな? ソート用は1行、1名 印刷用は3行1名 今のシートを印刷用にして、ソート用を作成 1行目をコピー、その後ろに2行目、3行目と3行を1行に複写してソート 現在の印刷シートは先頭の1人分だけソートシートを参照する まず = を入力してシートを切り替えて対象場所を入力すると =[シート名]!B1 と表示されるのでEnter後はそれを複写後に位置の文字 C1 などを直したほうが早いと思う。
- higekuman
- ベストアンサー率19% (195/979)
先ほどの回答に「結合セルと結合していないセルが混在する表には、Excelの並べ替え機能は使えないみたいですね」と書こうとしていて、忘れていました。 > マクロの自作仕方わかりますか? わかりますが、マクロをまったく知らない人に教えるのは骨が折れるのでやめておきます。
- higekuman
- ベストアンサー率19% (195/979)
1人1行のレイアウトに変更するか、レイアウト変更が嫌なら並び替え用のマクロを自作するしかないですね。
お礼
ありがとうございます。 マクロの自作仕方わかりますか?