• ベストアンサー

エクセル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上で可能でしょうか? 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hogehage
  • ベストアンサー率50% (54/107)
回答No.2

こんなんでどうでしょうか? 'セル値記憶用 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

keiri2002
質問者

お礼

度々の回答ありがとうございます。 早速試しましたが、G列の『東京』と『愛知』以外がうまく入りません。自分で調整できれば良いんですけど、解読するのに時間がかかりそうです。 出来るかどうかも不明。。。 今一度お助けを。

keiri2002
質問者

補足

分かりました。 >col_A(ii) = col_A(kk)  col_B(ii) = col_B(kk)  col_C(ii) = col_B(kk)←col_C(kk) ですね。 解決しました。 ありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

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 東京

keiri2002
質問者

お礼

imogasiさん、いつも有難うございます。 >VLOOKUP関数を設定する。 という考えはあったのですが、今回はエクセルシートを使わずにVBAだけでやりたかったのです。 あと、ソートの事で、もう一つ質問しますから、そちらの方も宜しくお願いします。

  • hajihaji
  • ベストアンサー率20% (20/100)
回答No.1

VBAに関してはここの方がよいかも

参考URL:
http://www.moug.net/
keiri2002
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

関連するQ&A