[[20160421095400]] 『指定した列(または行)を四捨五入』(あいこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『指定した列(または行)を四捨五入』(あいこ)

お世話になっております。

色々試したのですがどうしてもうまくいかず、質問させていただきました。
A列〜JM列の545行目まで、数字または数式が入っているファイルがあります。
入っているのは数字及び割合です。(パーセント)
この数字の入っている列のみ、四捨五入したいのですが可能ですか?

イメージとしては、四捨五入したい範囲を選択→マクロを実行すると四捨五入
列(または行)によっては四捨五入したくない部分もあるため
できれば式の中ではなく、手動で範囲していしたものを四捨五入できるような式に
したいのですが・・・><

ちなみに整数にしたいです。(小数点はなし)

よろしくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 出てくるダイアログで処理対象領域を選択してください。
 複数領域を Crtlキーを押して選択してもOKです。
 数式以外の数値が入っているセルを対象に処理します。

 Sub Test()
    Dim r As Range
    Dim c As Range

    On Error Resume Next
    Set r = Application.InputBox("処理対象の領域を選択してください。(複数領域OK)", Type:=8)
    On Error GoTo 0

    If r Is Nothing Then Exit Sub

    For Each c In r.Cells
        If Not c.HasFormula And Not IsEmpty(c) And IsNumeric(c) Then
            c.Value = WorksheetFunction.Round(c.Value, 0)
        End If
    Next

 End Sub

(β) 2016/04/21(木) 10:15


 ↑ % もあったんですか!

 たとえば 1.6% と表示されていた場合(実際の値は 0.016 ですけど)、どのようにしたいのでしょうか?
 アップしたコードでは 0% になってしまいます。

 なんとなく 2% にしたいように思えます。
 でも、もし、【数値】で 0.0016 であれば 要件としては 0 に変換ですよね。

 普通の数値か、%としての数値か、切り分けることが必要ですが、%のセルには 書式で その旨、設定されていますか?
 もし、そうであれば切り分けできます。

 また、【数式結果】の数値については対象外にしていますが、それでよかったですか?
 数式セルに対しても処理対象ということであれば、それも可能ですが、その場合、数式は消えて値になります。

(β) 2016/04/21(木) 10:21


βさま

ご丁寧にありがとうございます。
頂いた式を入力して、作業してみましたが範囲指定が広すぎるのか
処理にものすごく時間がかかってしまうようです。。><
もう少し範囲指定を狭めてリトライしてみます。

%の部分は範囲指定から外せば問題ありませんので、大丈夫です。
また数式結果部分も数値部分を足しているだけですので、数値部分が直れば
必然的に小数点は出てこないと思いますので、大丈夫です。
(あいこ) 2016/04/21(木) 10:44


セルの書式設定で小数点以下を見せなくするだけの気がしますが、なにか事情があるのでしょうね。

セルを範囲選択後、右クリックすると整数化するようにしてみた案です。なお、数式だった場合は変換しないようにしました。
書式設定でパーセント指定している場合は、100倍することで対応してみていますが、不要であれば%判定部分を削ってください。。

 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Dim R As Range

    For Each R In Target
        If R.Value <> "" Then
            If IsNumeric(R.Formula) = True Then
                If Right(R.NumberFormat, 1) = "%" Then
                    R.Value = Int(R.Value * 100 + 0.5) / 100
                Else
                    R.Value = Int(R.Value + 0.5)
                End If
            End If
        End If
    Next R
    Cancel = True
 End Sub
(???) 2016/04/21(木) 10:53

 >>処理にものすごく時間がかかってしまうようです

 そうですねぇ。セル毎に書きこんでいますので。
 さらにセル変更のつど、計算が実行されますので、それも足を引っ張っていますね。
 選択領域から、さらに対象領域を絞り込んで処理してみました。
 これでも遅いようなら、配列をからめるコードにかえます。

 Sub Test2()
    Dim r As Range
    Dim a As Range
    Dim c As Range

    On Error Resume Next
    Set r = Application.InputBox("処理対象の領域を選択してください。(複数領域OK)", Type:=8)
    On Error GoTo 0

    If r Is Nothing Then Exit Sub

    On Error Resume Next
    Set a = r.SpecialCells(xlCellTypeConstants, xlNumbers)
    On Error GoTo 0

    If a Is Nothing Then
        MsgBox "数値セルがありません"
        Exit Sub
    End If

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    For Each c In a.Cells
        c.Value = WorksheetFunction.Round(c.Value, 0)
    Next

    Application.Calculation = xlCalculationAutomatic

 End Sub

(β) 2016/04/21(木) 11:31


???様
ご教示ありがとうございます。
ただ私にはレベルが高く、右クリックをするとセルに式の内容が
返ってきてしまいました。。

β様
再度ご教示いただきありがとうございます!
処理時間、とても早くなりました。
また数値がなかった時のメッセージも助かります。
これで業務時間も相当短縮できます。本当にありがとうございました!
(あいこ) 2016/04/21(木) 12:53


β様

度々申し訳ありません。
先程の”%”のところについてなのですが。。
同じ列の中に数値と%が混ざっていることがわかりました。
%は表示で%にしています。

例:エクセルに入っている数値 16.60% →表示上(16.6%)※値化されています

こういった選択範囲の数値に入っていても、無視する(処理対象外)にすることは
可能なのでしょうか?

初心者なので質問ばかりで申し訳ありません。。
(あいこ) 2016/04/21(木) 13:17


 c.Value = WorksheetFunction.Round(c.Value, 0)

 これを

 If Right(c.Text, 1) <> "%" Then c.Value = WorksheetFunction.Round(c.Value, 0)

 に、かえてみてください。

(β) 2016/04/21(木) 13:50


 >%は表示で%にしています。

これはどういう意味でしょうか? セルの書式設定で文字指定している?
それと、%は全角でしょうか、半角でしょうか? デフォルトの書式設定でパーセント表示にすると、半角のはずですが。

%のあるセルをクリックした状態で、数式バーにはどのように表示されていますか? 全角半角正確に書いて、「16.6%」なのでしょうか?
セルの書式設定をどうしているのか教えてください。 パーセンテージ? ユーザー定義?

ちなみに、私のマクロが動作する状態では右クリックでセルの書式設定を見られないので、「開発」−「デザインモード」を切り替えてください。 デザインモードにすると、マクロが動かなくなります。
(「開発」メニューが表示されていない場合、「リボンのユーザー設定」からタブ追加しておいてください)
(???) 2016/04/21(木) 14:31


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.