• 締切済み

昇順に並べ替え

セルA1に50.1、セルB1にB、セルA2に49.9、セルB2にAと入力されています。 A列は、小数点第一位を四捨五入するので両方とも50と表示されています。 A列が同じ(この場合は50)時は、B列は昇順に並べたいです。 VBAで並び替えすると、数字は50.1と49.9なので1行目と2行目が入れ替わりません。 セルに表示されている数字での並び替えはどうしたら良いのでしょうか?

みんなの回答

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.3

>セルに表示されている数字での並び替え そういう機能は無いので、ささっと工夫してやってしまいます。 作成例: sub macro1()  dim r as long  application.screenupdating = false  range("A:A").insert  for r = 1 to range("B65536").end(xlup).row   cells(r, "A") = cells(r, "B").text  next r  range("A:C").sort key1:=range("A1"), order1:=xlascending, _   key2:=range("C1"), order2:=xlascending, header:=xlno  range("A:A").delete shift:=xlshifttoleft  application.screenupdating = true end sub #補足 実際には出来ないワケじゃなく、「表示桁数で計算する」の機能でご相談通りに出来る場合もあります。ただし今回のご相談の書き振りでは、「50.1」や「49.9」などの「入力値」を損壊するので使えません。 それを踏まえた上で、例えば次のように細工する事はできます。 sub macro2()  on error resume next  range("E1").formula = "=1"  range("E1").copy  with range("A1:A" & range("A65536").end(xlup).row)   .pastespecial paste:=xlpasteformulas, operation:=xlpastespecialoperationmultiply   activeworkbook.precisionasdisplayed = true   range("A:B").sort key1:=range("A1"), order1:=xlascending, _    key2:=range("B1"), order2:=xlascending, header:=xlno   activeworkbook.precisionasdisplayed = false   range("E1").clearcontents  ’理屈が理解できたら次の一行を生かす  ’.value = .value  end with end sub

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.2

VBAは知らないのですが、小数点第一位を四捨五入するという演算はないのですか? それがあればこんなとこで聞いてないですよね?

miya2004
質問者

お礼

Round関数は、エクセルとVBAは挙動が違うようです。 エクセルは四捨五入だけど、 VBAは丸め込みになるようです。

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

昇順でA1が50.1、A2が49.9なら入れ替わらないとおかしいですね。(表示ではなく) VBAのプログラム、間違っていませんか?

miya2004
質問者

お礼

間違っていました。 セルA1が49.9でセルB1がB、 セルA2が50.1でセルB2がAです。 数字は昇順に並んでいますが、四捨五入して50なので、 B列が若い順に並べたいです。