• ベストアンサー

基準が変わっていく繰り返し計算

以下の表のように、任意の数に対して結果を示す条件式作成のプログラムを作成したいので教えてください。 条件を満たした次の行からは基準が変わるように(条件を満たした行を基準とする)したいです。 よろしくお願いします。 A      B       条件式 0.89    0.00    '=IF($A2<MAX($A$2:$A2)*0.5,$A2-$A$2,) 0.66    0.00    '=IF($A3<MAX($A$2:$A3)*0.5,$A3-$A$2,) 0.54     0.00    '=IF($A4<MAX($A$2:$A4)*0.5,$A4-$A$2,) 0.85     0.00    '=IF($A5<MAX($A$2:$A5)*0.5,$A5-$A$2,) 0.66     0.00    '=IF($A6<MAX($A$2:$A6)*0.5,$A6-$A$2,) 0.53     0.00    '=IF($A7<MAX($A$2:$A7)*0.5,$A7-$A$2,) 0.95     0.00    '=IF($A8<MAX($A$2:$A8)*0.5,$A8-$A$2,) 0.32     -0.57    '=IF($A9<MAX($A$2:$A9)*0.5,$A9-$A$2,) 0.03     -0.29    '=IF($A10<MAX($A$9:$A10)*0.5,$A10-$A$9,) 0.51     0.00    '=IF($A11<MAX($A$10:$A11)*0.5,$A11-$A$10,) 0.63     0.00    '=IF($A12<MAX($A$10:$A12)*0.5,$A12-$A$10,) 0.37     0.00    '=IF($A13<MAX($A$10:$A13)*0.5,$A13-$A$10,) 0.14     0.11    '=IF($A14<MAX($A$10:$A14)*0.5,$A14-$A$10,) 0.38     0.00    '=IF($A15<MAX($A$14:$A15)*0.5,$A15-$A$14,) 0.64     0.00    '=IF($A16<MAX($A$14:$A16)*0.5,$A16-$A$14,) 0.21     0.07    '=IF($A17<MAX($A$14:$A17)*0.5,$A17-$A$14,) 以下同様に計算

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

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

Sub 式セット() Dim i As Integer Dim k As Integer '設定する式 '=IF($A2<MAX($A$2:$A2)*0.5,$A2-$A$2,) k = 2 '基準の行 Cells(k, 2).FormulaR1C1 = "=IF(RC1<MAX(R" & k & "C1:RC1)*0.5,RC1-R" & k & "C1,)" i = 3 Do While Cells(i, 1).Value <> "" If Cells(i - 1, 2).Value <> 0 Then k = i - 1 End If Cells(i, 2).FormulaR1C1 = "=IF(RC1<MAX(R" & k & "C1:RC1)*0.5,RC1-R" & k & "C1,)" i = i + 1 Loop End Sub

seiji600
質問者

お礼

エレガントな回答ありがとうございます。、希望通りです。

その他の回答 (1)

noname#21649
noname#21649
回答No.1

現在ネットにつないでいるのでVBが動きません。 考え方だけ。 データの数=(適当に) for I%=1 to データの数 データ(i%)=(適当に) next IMode%=0 for I%=1 to データの数 call 条件計算(データ(i%),IMode%) next Sub 条件計算(データ,IMode%, 計算結果) if IMode%=0 then (適当な計算) if (次の条件に変更するか) then IMode%=Imode%+1 elseif IMode%=1 then (適当な計算) if (次の条件に変更するか) then IMode%=Imode%+1 elseif IMode%=1 then -----(中略)------ else '想定外のImode%値の場合 stop end if end sub

seiji600
質問者

お礼

ありがとうございます、勉強させていただきました

関連するQ&A

  • エクセルの計算式が理解できません

    表計算詳しくないので教えてください。 もともと人がエクセルで作った表を使ってるのですが、 IF(E9="","",$G$5*M9*0.5/"1:0:0") という式が1列全部に設定されています。(E9とM9だけ行ごとに変わる) 同じ数字のかけざんのはずなのに、2行だけ小数点以下が繰り上げられてしまいます。 (正しくは461のところ、2行だけ462と表示される) 計算式は各行にコピーしたのになぜ表示される計算結果が 2行だけ違うということがおきるのでしょうか? どうしたら、繰り上げされず、他の行と同じ表示にできますか?

  • ホームページ作成は初心者です。

    ホームページ作成は初心者です。 以下エクセルのような計算表を作成したいので、 エクセルの表現をさせていただきます。 まず2行2列(A1:B2)の表を作成し、 1行目(A1:A2)は自由入力可能なテキストボックス。 2行目(B1:B2)は計算結果を反映させたいです。 計算式は、 B1・B2セルは、ROUNDDOWN(SUM(A1:A2)*COUNT(A1:A2),0)の式とし、 Web上では、テキストボックスに入力した数値の結果だけを表します。 式の意味は、 A1からA2までの数値の合計を空白を除く入力数を乗算し、 小数点を切り捨てる内容となります。 大変申し訳ないですが、お教え願います。

  • エクセルで計算が出来ません。

    エクセルで表を作成し平均値を出したいのですがどうしても出来ません。教えてください。   A    B   C   D   E   F(合計)     1280    25   4823  325   1   6128      362   2220 1890 466 1 4938 4736 1650 436 1234 1 8056 0 0   0 19122 平均値                             6374 というように平均値を出したいんですが、なん行かの表を作っておいて最後の行で計算をしたいのです。Eの列はFの列がスペースでないときには、1を立たせ入力がないつまり空白のときは、0になるようにしたいのです。最後に入力があった行(1)を足して合計を割れば出来ますが、F行= " ","0","1"とう式は成り立ちません。よい方法を教えてください。 

  • エクセルの計算式について

    エクセルの計算式について教えて下さい。以下の表があります。 a列とb列は日ごとに変化します。c列は、a/bで計算されます。d列は、bx10をaから引いた値です。e列は前日のeと当日のeの差を表示しています。 x1列は、e列が10以上ならばSを表示する条件式で値を出しています。x2列は、0以下ならばBを表示する条件式で値を出しています。 h列の計算は、x1とx2でBが表示された場合、例えばa列の1/12の18620から1/11の18830を引く計算をし、b列の1/11の1682から1654を引く計算をして、それぞれの解を足します。 また、同様にx1とx2でSが表示された場合には、下記の表のa列1/12の18620から1/21の18760を引き、b列の1/21の1618から1654を引き、それぞれの解を足します。 上記に説明した、それぞれの計算式を教えて下さい。 また、x1とx2は、それぞれaやbの値から導き出される式で日々表示が変わります。ただ、以下の表のようにx1列のように、Sの表示が連続して表示されます。これを、1度Sが表示されると、次の行からはSが表示されないようにする計算式を教えて下さい。 すみません、よろしくご教示下さい。 date      a      b      c  d e x1 x2  h 2000/1/11 18830 1682.0 11.20 2010 -190 B   2000/1/12 18620 1654.0 11.26 2080 70 S 70,000 2000/1/13 18920 1673.0 11.31 2190 110 S 2000/1/14 18850 1654.0 11.40 2310 120 S 2000/1/17 19300 1680.0 11.49 2500 190 S 2000/1/18 19150 1662.0 11.52 2530 30 2000/1/19 18930 1634.0 11.59 2590 60 2000/1/20 19060 1640.0 11.62 2660 70 S 2000/1/21 18760 1618.0 11.59 2580 -80 B -220,000

  • 表計算のifの条件式について

    LibreOfficeの表計算のifの条件式について わからない点があります。 A1からA9までテストの点(満点100)が入力されています。 問題は 【59以下なら『C』、79以下なら『B』、100以下なら『A』とする。】 とあります。 なので(1)~(4)の導けそうな日本語文を考え その条件で入力しましたが、 (4)しか正しく導けませんでした。 (1)~(3)のダメな点は一体どこなんでしょうか? 何しろ初心者なもので、あまり専門用語を使わず 噛み砕いてご回答してくださるとよりありがたいです。 是非、よろしくお願いします。 (1)、100以下なら『A』、80未満を『B』、60未満を『C』とする。  =if(a1<=100,"A",if(a1<80,"B",if(a1<60,"C","")))  →全部がAになる (2)、100以下なら『A』、79以下を『B』、59以下を『C』とする。  =if(a1<=100,"A",if(a1<=79,"B",if(a1<=59,"C","")))  →全部がAになる (3)、60未満を『C』、80未満を『B』、それ以外を『A』とする。  =if(a1<60,"C",if(a1<80,"B","A"))  →全部がCになる (4)、60未満を『C』、80未満を『B』、100以下を『A』とする。  =if(a1<60,"C",if(a1<80,"B",if(a1<=100,"A","")))  →ちゃんとなる。

  • エクセル表のカウントの仕方について

    エクセルの表でいいカウントの仕方を教えてください。 まず思い浮かべて頂きたい簡単な表の例を示しておきます。行は20行程度というのを思い浮かべてください。 A列には1~10の数字、B列にはあ~んの五十音の一文字のみが、それぞれ重複ありで記入されているような単純な表です。 そこで、A列が「5」かつB列が「あ」という両条件を満たした行の数を、どこかのセルにカウントして表示したいのですが、私の能力では経験不足でできないで困っています。 どうすればいいのか教えていただきたいのです。 よろしくお願いします。

  • IF関数の計算式について教えてください

    以下の式の場合、「真の場合」として扱われません。 [条件] セルA1=0.9 セルA2=0.9(=0.6+0.3で入力) [計算式] =IF(A1-A2>=0,"真","偽") 通常の計算であれば「0」となるため、「真」が返るはずなのですが 「偽」が返ってしまいます。 「真」が返る方法ありますか?

  • Excelで,特定の月にだけ計算する方法

    Excel初心者です. Excel2010で,特定の月だけ計算したいのですが,やり方を教えていただけないでしょうか? 2012/4/1, 2012/5/1, ... , 2025/11/1, 2025/12/1 という年月日を入れた行を作ってあるのですが,別の行で6月と12月だけ計算する行を作りたいです. IF文の論理式で条件を書こうと思ったのですが,月の条件を書く方法が分からず,つまづいてます.

  • エクセルで、計算で表示された数字を別のセルに入力したい

    よろしくお願いします。 エクセルで、以下のような表を作りました。 Dのセルには計算式が入っています。 【表1】   A B C D   1 2 3 1(計算式C2-C1にて)   2 3 4 1(計算式C3-C2にて)   3 4 5 -5(計算式C4-C3にて)  この表を、Aの行の数値をもとに降順でソートをかけると、  以下のようになり、Dの数値は、元のものと異なってしまいます。 【表2】   A B C D   3 4 5 -1(計算式にて)   2 3 4 -1(計算式にて)   1 2 3 -3(計算式にて)  計算ででた数字を、ソートした後にも表示させる良い方法は  ないでしょうか?  現在は、E行に、直接計算で出た数字を入力しているのですが、  数が多くて大変です(><)  お助けください!m(_ _)m

  • 入力されたテキストの行の中から最も文字数の多い行を表示するプログラム

    学校の課題なのですが、どうにも正しくプログラムできません もしお分かりになる方がいらっしゃったらご回答よろしくお願いします 条件、注意書きはほとんど書いた通りです 申し訳ありませんが早めのご回答お願いいたします #include <stdio.h> #define MAXLINE 1000 int getl(char s[], int lim){           不明箇所 } void copy(char to[], char from[]) { int i;  i=0;  while ((to[i] = from[i]) != '/0') ++i; } int main() { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max=0; while((len = getl(line,MAXLINE)) > 0) if(len > max){            不明箇所 } if(max > 0) printf("%d: %s", max, longest); return(0); } getl  標準入力から1文字ずつ読み込み、配列の先頭から順に格納する     読み込んだ文字が改行(/n)なら行末。/nを格納した次の要素に/0を格納     読み込んだ文字数(改行コード含む)を関数の値(戻り値にする) char s[]  読み込んだ文字を格納する文字配列       行末に達したら直後に/0 int lim  仮引数s[]の要素数。読み込む行の文字数がlimの値を超えるとそこで行の入力を打ち切る len  getlで読み込んだ行の文字数 line  getlで読み込んだ行を格納 longest  一番長かった行を保持 max  一番長かった行の文字数を保持 while  作成する関数の戻り値がEOFでない限り繰り返す      今読み込んだ行がこれまで一番長かった行より長い場合にはmaxを更新し、読み込んだ行をcopyでlongest[]にコピーしておく mainの最後でmax>0ならば(有効な行を読み込んでいたら)最も長い行を%sで表示 例 入力 123      12345      12   出力 12345    

専門家に質問してみよう