- ベストアンサー
エクセルVBAで
いつもお世話になります。 A B C 1 ああ XXX 東京 2 ああ X 大阪 3 いい XXXX 愛知 4 うう XX 福岡 5 いい X 横浜 6 うう 神戸 7 うう XXX 札幌 これを並び替えたいんですが、セルAの『ああ』なら10、『いい』なら5、『うう』なら3、又セルBの『X』一つにつき5を足した数値の小さい順に並び替えたいのですが、VBA上で可能でしょうか? 宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんなんでどうでしょうか? 'セル値記憶用 Dim col_A(7) As String, col_B(7) As String Dim col_C(7) As String, T_NUM(7) As Single 'ソート用 Dim sv_A As String, sv_B As String Dim sv_C As String, sv_NUM As Single 'セル値を記憶しながら、並び替え値を算出 For ii = 1 To 7 'セル値を記憶 col_A(ii) = Cells(ii, 1).Value col_B(ii) = Cells(ii, 2).Value col_C(ii) = Cells(ii, 3).Value 'A列の文字から数値割り当て Select Case Cells(ii, 1).Value Case "ああ" T_NUM(ii) = 10 Case "いい" T_NUM(ii) = 5 Case "うう" T_NUM(ii) = 3 End Select 'B列の文字分の数値加算 T_NUM(ii) = T_NUM(ii) + 5 * Len(Cells(ii, 2).Value) Next ii 'ソート For ii = 1 To 7 For kk = ii + 1 To 7 If T_NUM(ii) > T_NUM(kk) Then sv_A = col_A(ii) sv_B = col_B(ii) sv_C = col_C(ii) sv_NUM = T_NUM(ii) col_A(ii) = col_A(kk) col_B(ii) = col_B(kk) col_C(ii) = col_B(kk) T_NUM(ii) = T_NUM(kk) col_A(kk) = sv_A col_B(kk) = sv_B col_C(kk) = sv_C T_NUM(kk) = sv_NUM End If Next kk Next ii 'シートに書き出す(E列~H列に) For ii = 1 To 7 Cells(ii, 5).Value = col_A(ii) Cells(ii, 6).Value = col_B(ii) Cells(ii, 7).Value = col_C(ii) Cells(ii, 8).Value = T_NUM(ii) '数値も書き出す Next ii
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
VBAといってもマクロの記録があります。それでやったらどうですか。 (1)A列の隣に列挿入して、ああ』なら10、『いい』なら5、『うう』なら3になるようVLOOKUP関数を設定する。 =VLOOKUP(A1,$F$1:$G$3,2,FALSE) F1:G3には ああ 10 いい 5 うう 3 を作っておく。 (2)(元B)C列の隣に=LEN(B1)*5をいれて下方向に複写する。 結果 ああ 10 xxx 15 ああ 10 xx 10 いい 5 xxxxx 25 うう 3 x 5 そしてB列とD列をキーとして、表以外をソートする。 Sub test01() Range("B1").EntireColumn.Insert Range("D1").EntireColumn.Insert For i = 1 To 4 Cells(i, "B") = WorksheetFunction.VLookup(Cells(i, 1), Range("F1:G4"), 2, False) Cells(i, "D") = Len(Cells(i, "C")) * 5 Next i '----- Range(Cells(1, 1), Cells(i, "E")).Sort Key1:=Range("B1"), Order1:=xlAscending, Key2:=Range("D1") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin End Sub 結果 うう 3 x 5 岡山 ああ 10 いい 5 xxxxx 25 愛知 いい 5 ああ 10 xx 10 大阪 うう 3 ああ 10 xxx 15 東京
お礼
imogasiさん、いつも有難うございます。 >VLOOKUP関数を設定する。 という考えはあったのですが、今回はエクセルシートを使わずにVBAだけでやりたかったのです。 あと、ソートの事で、もう一つ質問しますから、そちらの方も宜しくお願いします。
- hajihaji
- ベストアンサー率20% (20/100)
お礼
度々の回答ありがとうございます。 早速試しましたが、G列の『東京』と『愛知』以外がうまく入りません。自分で調整できれば良いんですけど、解読するのに時間がかかりそうです。 出来るかどうかも不明。。。 今一度お助けを。
補足
分かりました。 >col_A(ii) = col_A(kk) col_B(ii) = col_B(kk) col_C(ii) = col_B(kk)←col_C(kk) ですね。 解決しました。 ありがとうございました。