準・究極の選択

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

A 回答 (3件)

昇順でA1が50.1、A2が49.9なら入れ替わらないとおかしいですね。

(表示ではなく)
VBAのプログラム、間違っていませんか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/11/17 20:26

VBAは知らないのですが、小数点第一位を四捨五入するという演算はないのですか?


それがあればこんなとこで聞いてないですよね?
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/11/18 16:26

>セルに表示されている数字での並び替え



そういう機能は無いので、ささっと工夫してやってしまいます。

作成例:
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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!