• ベストアンサー

関数が動くセル、動かないセル

たびたび申し訳ありません。 こちらで教えてもらった式をセルに設定すると それがウマく動くときと動かないときがあります。 A1 1.3(1日と3時間) A2 1.6(1日と6時間) A3 2.9(2日と9時間)になるトコロを3.1(3日と1時間) とさせるのに =INT(A1+A2)+DEC2OCT(INT(MOD(A1+A2,1)*10))/10 あるいは =INT(A1+A2)+INT(MOD(A1+A2,1)/0.8)+MOD(MOD(A1+A2,1),0.8) を設定すればいいようなのですが、セルによって動くときと 動かないときがあって、原因がわからないでいます (参照URL http://okweb.jp/kotaeru.php3?q=1272124)。 申し訳ありませんが、ご教授ください。当方完全な文系です。 本当にご迷惑かけます(涙

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.16

#10です。 DEC2OCT(8)→10 DEC2OCT(0.8*10)→7 になるので、うまくいかないようです。 そこで、次の様に変更してみて下さい =INT(A1)+INT(B1)+DEC2OCT(ROUND((A1+B1-(INT(A1)+INT(B1)))*10,0))/10

okitakio
質問者

お礼

できました!一般人とは思えません(涙 やはり理系は世界を救いますね。今回は本当に本当に ありがとうございました!!

その他の回答 (16)

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.17

matsu_junです。 現在当初の質問の範囲を大きく逸脱してしまっているようです。

okitakio
質問者

お礼

いろいろご説明いただき、ありがとうございました。 がっ!No.16さんの回答でできました。申し訳ありません。 周りに色々聞いても(質問の趣旨が)「意味ない」とか 「わけわからん」とかばっかりで、解決に至らなかったのに ご助力いただいて、こんなに早く解決するなんて、感謝のキモチで 一杯です。

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.15

matsu_junです。大変なこと、お察しいたします。 保存してしまったのですね。まず完全に元に戻しましょう。 1) アドインを外します。ツール(T)-アドイン(I)をクリックして、チェックをつけてしまった部分を外します。 2) ファイルも削除しましょう。画面左下のスタートメニューから検索(C)を選び、保存してしまったファイル名で検索し、見つかったら削除しましょう。 ここまでやってから、もう一度#9、#12、#13を参考に作業を再開しましょう。 まだエラーが出ますか?そうであれば、#9で言うところのどの操作をした状態で、どのようなエラーが発生するのかも書いてください。

okitakio
質問者

お礼

帰宅してPC確認しましたら、お礼欄が編集&削除 されていました(運営者様に対する批判ではないです)。 matsu_jun様には、今回本当にお世話になり、感謝のキモチでいっぱいです。 採用されなかったと、ガッカリしないでくださいね。何かありましたら またよろしくお願いいたします。他の通信手段がなかったので 本欄に、最終的なお礼を記入いたします。

okitakio
質問者

補足

本当に情けないですが、削除ができません。 1.ツール-アドインのチェックは外しました。 2.勤務計算ファイル(仮名:最初の作業ファイル名とします)を 検索したのですが、マイコンピュータを検索しても出ません。 ローカルディスク、ファイルとドキュメントも同様です。 3.最近使ったプログラムからは見つかって、削除しました。 4.エクセルを開くと、右側の作業エリアに、勤務計算と出て、開くことができます。 5.さて、これがもっともやっかいになると思うんですが 実は最初にこの作業をしたときに、今回問題になっている実際のファイルに 適用して、試してみました。結果、そのファイルを開くと リンクして、というか、共存状態というか、勤務計算のパーソナルエクセルが くっついて開いてしまいます。 本当に申し訳ありません。以上の説明でおわかりになりますか? ガンバりますので、何卒よろしくお願いいたします。

  • subri
  • ベストアンサー率28% (16/56)
回答No.14

ツール→オプション→計算方法タブで 計算方法が手動になっていたら自動にしてみてください。

okitakio
質問者

補足

計算方法は自動になっていました。今月に入ってずっと このことで悩んでいたので、あらゆる方面から解決方法を指摘していただいて 本当にありがたく思っています。

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.13

matsu_junです。 一度Excelごと終了しましょう。今作業中のブックは保存しなくていいですよ。 もう一度Excelを立ち上げ直して、同じ操作をしましょう。 また、■を押したらすぐに大きい画面(MicroSoft Visual Basicのことかな?)は出ませんよ。 ■を押しても見た目はそう変わらないはずです。その後、#9で説明した4)へ進みましたか? ちゃんとAltキーを押しながらF8キーを押しましたか? 画面下のタスクバーに、「Microsoft Visual Basic」というバーが表示されていたら、それをクリックしてもでるかもしれません。 ダメだったら何度でもExcelごと終了させて、私が#9で説明したことを繰り返してみましょう。 一度できたことです。2回目だってちゃんとできますよ。 ちなみに前回・前前回といい忘れていましたが、このDADD関数、単品でも使えますよ。試しにセルA1に4.9と入れて、B1セルに「=DADD(A1)」と入力してみましょう。5.1になりますね。

okitakio
質問者

補足

本当に情けないことですが、今度は以下のようなエラーが出ました。 1回目に操作したとき、保存したのがいけなかったと思うのですが... お手数かけますが、最後までガンバりますので、ご助力お願いいたします。 識別子が別の識別子と競合しているか、または修飾が必要です。エラーの原因と対処方法を次に示します。 同じ適用範囲にある複数のオブジェクトに、同じ名前の要素がある可能性があります。 要素名にオブジェクト名とピリオドを付加して修飾します。次に例を示します。 object.property モジュール レベル識別子とプロジェクト レベル識別子 (モジュール名と参照先プロジェクト名) はプロシージャ内で再使用できますが、プログラミングが複雑になり、デバッグも難しくなります。両方の項目を同じプロシージャで参照する場合、適用範囲が広い方の項目は修飾しなければなりません。たとえば、MyModule のモジュール レベルで MyID を宣言している場合、プロシージャ レベルの変数をそのモジュール内に同じ名前で宣言しているときは、モジュール レベルの変数を適切に修飾しなければなりません。

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.12

ごめんなさいね。#9のmatsu_junです。 以下のようにして下さい。1行だけ変更しました。 Private Function DADD(DL As Range) As Double Dim INTNUM As Long Dim PNTNUM As Double For Each CL In DL INTNUM = INTNUM + Application.WorksheetFunction.RoundDown(CL, 0) PNTNUM = PNTNUM + CDbl(CL) - Application.WorksheetFunction.RoundDown(CL, 0) Next CL INTNUM = INTNUM + Application.WorksheetFunction.RoundDown(PNTNUM / 0.8, 0) PNTNUM = ((PNTNUM * 10) Mod 8) / 10 DADD = INTNUM + PNTNUM End Function

okitakio
質問者

補足

ごめんなさいなんてそんな、こっちこそです。ついでに甘えてしまい 申し訳ないですが、この式?を、どこにどうやって貼ればいいのか 教えていただけますか。最初の方法でもう1度トライすると ■をクリックしても、大きい画面が開きません。無知でスミマセン。 皆様にお手伝いただきながらも、ちょっと燃えつき始めています... でも最後までガンバります!

  • macchan1
  • ベストアンサー率38% (52/136)
回答No.11

単純にもとの数式が間違えているだけのように思います。 時間の整数部分は個別に足し算しないとダメですね。 少数点以下の数値も個別に足して、1日になるか調べ、小数点以下の部分は足し算して0.8で割った余りが時間になるので以下のような式で求めます。 =INT(A1)+INT(A2)+INT((MOD(A1,1)+MOD(A2,1))/0.8)+(MOD(MOD(A1,1)+MOD(A2,1),0.8))

okitakio
質問者

補足

そうですね、個別に考えればいいんですよね。ただ今回は できれば1つの式、というか、1つの関数で解決できたらと 欲張っております。とにかく時間はかかっても、最後までガンバって 皆さんのご親切に応えたいと思っています。ありがとうございます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.10

#6です。 アドインで分析ツールを入れておられないのですね。 質問文でDEC2OCTを使っておられたので、入れられたものだと思っていました。 DEC2OCTを使えるようにするには、 [ツール] メニューの [アドイン] をクリックします。 [アドイン] の一覧の [分析ツール] ボックスを選択し、[OK] をクリックします。

okitakio
質問者

補足

たびたびお答えありがとうございます。しっしかし! 前回懸案部分は計算されたんですが、他のセルがやはり ウマく計算されません。 今回の懸案部分の具体例:   A  B  C 4 5.3 0.7 6.2 ←前回懸案部分はオッケー 5 6.5 0.3 6.7 ←本来は7.0 6 1.4 0.0 1.3 ←本来は1.4 ご回答のとおり、分析ツールはOKにしてみました。 それにしても、こんな複雑なことになるとは意外でした。 お答えいただいても、ちゃんと設定できる腕があるのか 我ながら不安になります。

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.9

もう面倒くさいので、新しい関数「DADD()」をマクロで作っちゃいましょう。 難しく構えないで下さい。ここで言われたとおりのことをしていただければ、 次回からは、SUM関数と全く同様の手順で動くようになりますよ。 マクロを編集するためのツールは、Excelを普通にインストールしたときに自動的に インストールされていますから、問題ありません。 さて、まずは新規ブックを開いてください。そうしたら以下の操作を行います。 1) ツール(T)-マクロ(M)-新しいマクロの記録(R)を開く 2) 「マクロの記録」ウィンドウが表示されたら、何も変更せずにOKをクリック 3) 画面上に二つのボタンが表示されたツールバーが現れたら、左側の「■」をクリックして記録終了 4) Altキーを押しながらF8キーを押して、マクロウィンドウを開く 5) マクロウィンドウから、編集(E)ボタンをクリック 6) 現れた「Microsoft Visual Basic」の右側に Sub Macro1() ' ' ' End Sub と書いてある部分を消去して、下の「ここから」から「ここまで」を貼り付ける。 'ここから------------------------------------------------------- Private Function DADD(DL As Range) As Double   Dim INTNUM As Long   Dim PNTNUM As Double   For Each CL In DL     INTNUM = INTNUM + Application.WorksheetFunction.RoundDown(CL, 0)     PNTNUM = PNTNUM + CDbl(CL) - Application.WorksheetFunction.RoundDown(CL, 0)   Next CL   INTNUM = INTNUM + PNTNUM \ 0.8   PNTNUM = ((PNTNUM * 10) Mod 8) / 10   DADD = INTNUM + PNTNUM End Function 'ここまで------------------------------------------------------- できましたでしょうか?そうしたら実験をしてみましょう。 現在のブックの任意のシート状のセルA1に1.6、A2に0.3、A3に2.5と入力してみてください。 セルA4に =DADD(A1:A3) と入力してみましょう。 A4に「4.6」と表示されましたか? その値は期待通りですか?、例えばこの状態でセルA1の値を書き換えたらA4の値も変わりますか? でも毎度毎度新しいブックを作るたびに上のようなことを書いていては面倒ですね。 というわけで、どのブックでも上の関数が使えるように、登録してしまいましょう。 まずはシートに落書きした、さっきの実験結果を消去してください。 さて行きますよ。もう一歩です。 1) 出来上がったファイルを保存します。 その際、ファイルの種類を「Microsoft Excelアドイン (*.xla)」にします。ファイル名はなんでも結構です(後で分かりやすい名前にしておいた方がいいですが)。保存先が「AddIns」になっていたら変えないでください。 2) Excelの「ツール(T)-アドイン(I)」でアドインダイアログを開き、参照ボタンをクリックします。 3) 先ほど保存したファイルが登場するはずなのでこれを選択します。 はい、これで完成です。好きなブックを開いていただいて同じことを試してみてください。当然SUM関数と同様に、「=DADD(」とまで打ち込んでから、合計したいセルをドラッグしていってもOKですよ。

okitakio
質問者

お礼

補足欄が使えませんので、お礼欄に記入いたします。 ご指定のようにやってみましたが、やはりできません。やりかたが マズイのでしょうか...  A  B  C 1 6.5 0.3 7.0←ここはオッケー 2 4.7 1.0 6.7←本当は5.7 3 5.6 2.4 8.2←ここもオッケー 4 12  0.6 13.6←本当は12.6

okitakio
質問者

補足

皆様ありがとうございます。申し訳ないんですが トライしてみるのは明日になりそうです。結果のちほど 報告いたします。しかしこんな複雑なことになるとは 思いもよりませんでした。 ではでは本日はこれにて。

  • at121
  • ベストアンサー率41% (85/206)
回答No.8

VBA・・ソフトをダウンロード の必要はない。 ツール > マクロ で とりあえず何か記録して・・操作して・・記録終了  ツール > マクロ で VisualBasicエディタ を開いてみる。 データシート C1 に ユーザー関数設定 A1 B1 5.3 0.7 fx  の 関数の分類の ユーザー定義 で  マクロ ファンクション名「変な8H単位足し算」を指定 c1 セル の式 =変な8H単位足し算(A1,B1) 結果 6.2 表示 セルの 書式 標準 ・・ 普通は 残業時間と単価が違うのでこういう計算はしないと思います。 パートやアルバイトなら 単純な時間の累積で良さそうなので 何に使うのか・・ ユーザー関数設定 マクロ VBエディタで 挿入 > 標準モジュール ↓マクロ VBエディタで 標準モジュールに以下コピー↓ Function 変な8H単位足し算(セル1 As Range, セル2 As Range) 数値1 = セル1.Value 数値2 = セル2.Value 整数部 = Int(数値1) + Int(数値2) 時間の繰上げ部 = Int((数値1 + 数値2 - 整数部) / 0.8) 時間の部 = (数値1 + 数値2 - 整数部) - 時間の繰上げ部 * 0.8 変な8H単位足し算 = 整数部 + 時間の繰上げ部 + 時間の部 End Function

okitakio
質問者

補足

何に使うのかについては、当初の質問のとおりで、休暇取得日数と時間の集計です。 この質問を数人にしたとき「意味がない」とか「わけわからん」とか 言われましたが、長年続いてきたやりかたで、私個人には どうすることもできない状態です。こういうやりかたを 採用している会社って、珍しいんでしょうか?

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.7

試してみると、案外ズレますね。 作業列を10列くらい使う計算です。 A1, B1に数値が入っているとして、C列から→向きに式を指定します。 C1:=INT(A1) D1:=INT(B1) E1:=A1-C1 F1:=B1-D1 G1:=E1+F1 H1:=INT(G1/0.8) I1:=C1+D1+H1 J1:=IF(H1=0,G1,G1-0.8) K1:=IF(J1<0,0,J1) L1:=I1+K1 と、ここまででL1に答えが出ます。 C~Kの列を非表示にすると見た目が良いです。

okitakio
質問者

補足

補足が遅くなり、申し訳ありません。neKo_deux さんの おっしゃるとおり、何列か使うといいのかもしれませんが できれば1つの式、というか、1つの関数で解決できたらと 欲張っております。でもみなさん、頭いいですね~一般人なんて ありえません(ワシは一般人以下ということか:ジョークです)。

関連するQ&A