EXCEL-VBAで
Cells(1, 1) = Round(Cells(3, 3), 0)
として、
C3 に28.5 を入力し、上のマクロを実行すると、
A1には、28と表示されてしまいます。
ワークシート関数の =round(c3,0) を他の適当なセルに入力すると、
その返り値は、29 とちゃんとなります。

c3が 28.5001 とかだと両者ちゃんと 29 となります。

これは、VBA関数のバグなりスペックなのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

これは、バグではなく、仕様です。


Roundは四捨五入ではなくて、丸めを行うもので、Excelでは、算術型の丸めを、VBでは、銀行型の丸めを行うようになっています。

銀行型の丸めは、0.5は偶数になるようになっています。


元の値 |0.4|0.5|0.6|1.4|1.5|1.6
---------------------------------
算術型 | 0| 1| 1| 1| 2| 2
---------------------------------
銀行型 | 0| 0| 1| 1| 2| 2

ですから、結果は上記のようになります。

四捨五入では、0.1~0.4の四つが切り捨て、
0.5~0.9の5つが切り上げになりますから、
値が大きくなる傾向がありますが、銀行型では
切り上げと切り捨ての交互になるため誤差が
四捨五入より、小さくなることが期待できる
ようになっているのです。

ExcelのVBAでエクセルのシートのRoundと
同じ計算がしたい場合は、

Cells(1,1).Value = Application.Round(Cells(3,3).Value,0)

のように、Roundの前に、Application.を付けて
シートの関数を使うようにするのが簡単だと思います。

参考URL:http://www.microsoft.com/JAPAN/support/kb/articl …
    • good
    • 0
この回答へのお礼

ありがとうございます。「丸め」と「四捨五入」、一般人にはどうも同じに思えてしまいます。別の関数にするとかしてほしいですよねぇ。

お礼日時:2001/01/04 23:44

18.5以外でも、数値の整数部分が偶数であれば、同様の現象が起こるみたいですね。



ヘルプには
-+-+-+-+
機能

指定された小数点位置で丸めた数値を返します。
-+-+-+-+
とあり、四捨五入とは一言も書いていないため、厳密に言えば間違いではないですが、一般常識的観点からすれば、どう見てもバグですよね(笑)。
ちなみに、ワークシート関数のRoundのヘルプには、四捨五入すると書いてありました。

で、解決策としては、四捨五入する版のRound 関数を自作してみてはいかがでしょうか。
方法とかわからなければ、補足していただければ私が作ってもいいです。
    • good
    • 0
この回答へのお礼

ありがとうございます。他の方にいただいたように、「丸め」と「四捨五入」は違うらしいですね。

お礼日時:2001/01/04 23:34

 スペックだそうです。

MicrosoftのKnowledgeBassでもありました。丸めの方法で誤差を無くす為に結果が常に偶数になるようにしているみたいです。ISOかなんかでも認定されている方法らしいです。Excelだけに限らずAccessなどのVBAでも同じです。

 ワークシート上でも同様になるのならしょうがないかなとも思うんですが、なんか納得いかないですよね。
    • good
    • 0
この回答へのお礼

ありがとうございます。そうですよねぇ、なんかまぎらわしいですよねぇ。

お礼日時:2001/01/04 23:31

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3コピー元ワークシート3

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = Workbooks.Add

'ここからが実際のコピー処理です。
'単純に3回コピーメソッドを呼び出して3回コピーしています。
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)

End Sub

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = W...続きを読む

Q=IF(CF260<>0,ROUND(M262/CF260,0),0) の意味を教えてください。

お世話になります。
EXCELにおいて、=IF(CF260<>0,ROUND(M262/CF260,0),0) の数式の意味を教えてください。
宜しくお願い致します。

Aベストアンサー

追記

ROUND(M262/CF260,0)
         ↑ 桁数指定が"0"なので、整数部分の桁数。でした。

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3ワークシート

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめる。
 新規ブックのオープンをtestwriteを呼ぶ前に1度だけ行い、
 testwriteの中ではその新規ブックに対してシートを追加していく。
 そしてtestwriteの処理が全部終わったら、
 新規ブックの全シートを1度に「記録シートYYYY/MM/DD.xls」にコピーする。

それでも駄目でしたら、以下の回答No.1を試してみてください。
http://oshiete.goo.ne.jp/qa/1822561.html

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめ...続きを読む

Q関数の[DBNum3]#,##0"円",-#,##0"円"の意味教えてください!

セルの書式の表示のユーザー定義で[DBNum3]#,##0"円",-#,##0"円"というのがあるんですが
意味がわかりません。
#,##0"円",-#,##0"円"という関数もあるのですが、
どなたか違いを教えてください。

宜しくお願いします。

Aベストアンサー

Googleでキーワード:DBNum3 で日本語選択検索で参考になるサイトが出ます。

QEXCELのVBAでシートコピーをしたとき元のマクロを削除するには?

VBAのマクロでシートのコピーをしたいのですが、元のシートにはVBAのコードが含まれています。コピーするのはデータだけのコピーが必要で、マクロ自体は必要ないのですが、それを削除するコードはどのように書いたらいいのでしょうか?
どうしてもコピーしたファイルを開くと「マクロが含まれています」という確認メッセージが出てしまうのですが、それもなくしたいのです。
シートにフォームのボタンが配置されている場合も同様に、そのボタン自体をなくした状態でコピーを行いたいのですが・・・。プログラムで行うのは不可能なのでしょうか?

Aベストアンサー

No2です。
サンプルコードを書いてみました。
「オリジナル」という名前のシートを別ブックとしてコピペ保存します。

Sub サンプル()
Dim sc As Integer
sc = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー
Workbooks.Add 'ブック追加
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け
Sheets("Sheet1").Name = "コピー"
Application.CutCopyMode = False
Application.SheetsInNewWorkbook = sc
ActiveWorkbook.Close
ThisWorkbook.Activate
End Sub

No2です。
サンプルコードを書いてみました。
「オリジナル」という名前のシートを別ブックとしてコピペ保存します。

Sub サンプル()
Dim sc As Integer
sc = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー
Workbooks.Add 'ブック追加
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け...続きを読む

Q=IF((L75>1.9)*AND(L75<=2),1,0)の*はないといけないのでしょうか?

L75が1.91のとき、L75が1.9以上かつ2以下のとき、真なら1を、偽なら0を出す式を書きました。
=IF((L75>1.9)AND(L75<=2),1,0)
こう入力するとエラーが出て*をつけるよう聞いてきます。
すなわち、エクセルの修正後は
=IF((L75>1.9)*AND(L75<=2),1,0) 結果は1(真)になりました。
というものです。
ところで、*は必要ですか?ないといけないのでしょうか?
そして、*があっても同じ結果となるのでしょうか?
*は掛け算しかわからず、よろしくお願いします。

Aベストアンサー

#02です。#01さんの補足に対する回答です
COUNTIF関数には検索条件をAND( )でつなげて記述することはできません

複合条件で件数を数えたいなら
 =SUMPRODUCT((L76:L85>0.9)*(L76:L85<=1)*1)
のような関数になります。(本当は配列の積を求める関数ですが、個数のカウントにも使えます)

QVBAのワークシートの追加とコピーなんですが。

VBAのワークシートの追加とコピーなんですが。


sheet1の原紙をすべてコピーして、

新しくワークシートを追加してそのシートに貼り付けるプログラムを

教えてください。

Aベストアンサー

With ActiveWorkbook
  aaa = .Sheets("Sheet1").Cells(9, 4).Value 'aaaは社員
  bbb = .Sheets("Sheet1").Cells(9, 5).Value 'bbbは4月
  .Sheets("Sheet1").Copy After:=.Sheets(.Sheets.Count)
End With
ActiveSheet.Name = aaa & bbb

Q日付 =TEXT(C2,"m月d日(aaa)")が=TEXT([@月日],"m月d日(aaa)")

日付を文字列に変換するため
=TEXT(C2,"m月d日(aaa)
と入力していたものが
今見ると 
=TEXT([@月日],"m月d日(aaa)")
となっていました。
数式バーをクリックすると[@月日]は、
画像のように青くなっています。
なぜこうなるのですか

Aベストアンサー

テーブルの構造化参照になっているだけですね。

Excel2007以降 テーブル書式は基本中の基本の使い方なので必ず
勉強して使えるようになっておくべきだと思います。

QEXCEL2002で、ブック内のワークシートを他のブックに(VBA含む丸ごと)コピーして移す方法

 EXCEL2002で、ブック内のワークシートを他のブックに(VBA含む丸ごと)コピーして移す方法
 普通のやり方では、セルの数字、値だけで、通常は、中身の重要な"関数式"であったり、VBA等のプログラムまで、コピーされることは、ありませんので、そこまで、出来る方法を教えて下さい。

Aベストアンサー

コピー元のBookとコピー先Bookをどちらも開いて
Excel画面上に並べます(左右に並べる方が作業しやすいと思います)

Ctrlキーを押しながら、コピーしたいシートのタブ部分を
クリック長押しすると、+マークと▲マークが出てきます。
マークが出てきたら、新しいBookにドラッグ&ドロップ で
シートコピーが出来ます。

全く同じシートがコピーされ、マクロもコピーされます。

Q[色]+#,##0;[色]-#,##0;[色]0;@ と[<10]#.0;0 同時設定可能ですか?

よろしくお願いします
いつもgooの皆さんには大変お世話になっております
お陰様でエクセルが大分進歩しました
win8.1でエクセルは2013です

タイトルの通り、2つの書式は同時に設定できますか?
可能であればその書き方を教えていただけないでしょうか?
同時に設定したい書式は下記のとおりです

[色]+#,##0;[色]-#,##0;[色]0;@  と [<10]#.0;0 です

Aベストアンサー

こんばんは!

おそらくセルの書式設定のユーザ定義は最大3個までしか設定できなかったともいます。

ユーザー定義の欄に
[赤][<0]-#,##0;[青][<10]0.0;[青]#,##0;@
としてみてください。
① マイナスの場合のフォント色は「赤で3桁のカンマ区切り」
② プラスの場合で10未満の場合は「青で小数点以下一けた表示」
③ プラスで10以上の場合は「青で3桁のカンマ区切り」
その他(文字列)の場合は「自動」(黒)

以上のような表示になると思いますが、
「0」の場合の設定ができません。
「0」の場合の表示桁数は一桁でフォント色は「自動」がお望みなのではないでしょうか?
おそらく手動でのセルの書式設定のユーザー定義ではどれか一つを犠牲にする必要があるのではないかと思います。
(できる方法があればごめんなさいね。)

ただ、お望みの方法ではないかもしれませんが、
上記条件付き書式のセル変更があればマクロで書式を変えてやる方法があります。

マクロでやるとなるとわざわざセルの書式設定を手動でやる意味がないので
敢えて今回はこの程度で・・・m(_ _)m

こんばんは!

おそらくセルの書式設定のユーザ定義は最大3個までしか設定できなかったともいます。

ユーザー定義の欄に
[赤][<0]-#,##0;[青][<10]0.0;[青]#,##0;@
としてみてください。
① マイナスの場合のフォント色は「赤で3桁のカンマ区切り」
② プラスの場合で10未満の場合は「青で小数点以下一けた表示」
③ プラスで10以上の場合は「青で3桁のカンマ区切り」
その他(文字列)の場合は「自動」(黒)

以上のような表示になると思いますが、
「0」の場合の設定ができません。
「0」の場合の表示桁数は一...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報