[[20151006224025]] 『一定以上の数値の時に一定の値まで引き算をしたい』(kk2) ページの最後に飛ぶ

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

 

『一定以上の数値の時に一定の値まで引き算をしたい』(kk2)

  A
1 461
2 105
3  57
4 210
5  75

と数値があった場合に100以上の数値が入っているセルの値だけ
  B  C   D 
1 100 100 100
2 100  5  100
3 100     10
4 100
5  61

というような感じで100で引けるまで100で表示し最後に余りを表示させられるような、
関数もしくはマクロはできないでしょうか?

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


 縦横入替えではありません・・・。

 A1=461
 A2=IF(A$1-(ROW()-2)*100<=0,"",IF(A$1-(ROW()-2)*100>100,100,A$1-(ROW()-2)*100))
 A2を必要なだけ↓へコピー
(カリーニン) 2015/10/06(火) 23:12

 >100以上の数値が入っているセルの値だけ 

 これを見落としてました。
(カリーニン) 2015/10/06(火) 23:13

 =IF(A$1>=100,IF(A$1-(ROW()-2)*100<=0,"",IF(A$1-(ROW()-2)*100>100,100,A$1-(ROW()-2)*100)),"")

 100以下の場合は計算しないで詰める、なら、私の案は全くダメです。
(カリーニン) 2015/10/06(火) 23:15

カリーニンさん回答ありがとうございます。
やはりできれば100以下の場合は計算しないで詰めるれるのが理想ではあります。

ただこの関数もきちんと理解したいのでいくつか質問したいのですが、
(ROW()-2)*100
この部分で-2、*100をしている理由はなぜでしょうか?
また上記の式だと最後に余りが出てこないのですが、余りを表示させることはできますか?
(kk2) 2015/10/06(火) 23:23


とりあえず、

 B1 : =IF(INDEX($A:$A,COLUMN()-1)="","",IF(INDEX($A:$A,COLUMN()-1)>=ROW()*100,100,IF(INDEX($A:$A,COLUMN()-1)-100*(ROW()-1)<0,"",INDEX($A:$A,COLUMN()-1)-100*(ROW()-1))))

 これを、下に、右にフィルコピー。

 スマートな式は、早晩、専門家さんから。

(β) 2015/10/06(火) 23:27


 >また上記の式だと最後に余りが出てこないのですが、余りを表示させることはできますか?

 ??
 余りは出てますよ。式を必要なだけ↓方向にコピーしてますか?

 >(ROW()-2)*100 
 >この部分で-2、*100をしている理由はなぜでしょうか? 

 >-2
 これは、A1に数値を入れて、数式をA2から入力しているからです。
 A1からですと-1になり、A3からですと-3になります。

 >*100

 説明を考え中です。
(カリーニン) 2015/10/06(火) 23:34

βさんありがとうございます。
やりたいことはβさんの式で実行することができました。
ただなぜできるかの中身が理解できていないですが;
もう一つこれを100以下の数字は省いて、100以上のみ結果表示することはできるでしょうか?

カリーニンさんありがとうございます。
 -2について理解することができました。
(kk2) 2015/10/06(火) 23:56


 マクロの例です。

Sub test()

 Dim r As Range
 Dim c As Range
 Dim cnt As Integer
 Dim num  As Integer
  Set r = ActiveSheet.Range(ActiveSheet.Range("A1"), ActiveSheet.Range("A" & Rows.Count).End(xlUp))
  cnt = 0
  For Each c In r
   If IsNumeric(c.Value) And c.Value >= 100 Then
      cnt = cnt + 1
      num = c.Value \ 100
      ActiveSheet.Cells(1, cnt + 1).Resize(num).Value = 100
      If c.Value Mod 100 <> 0 Then ActiveSheet.Cells(1, cnt + 1).Offset(num).Value = c.Value Mod 100
   End If
  Next c
  Set r = Nothing
End Sub

(カリーニン) 2015/10/06(火) 23:57


 う〜ん、、、私のマクロですと、最後のあまりが小数点以下が丸められてしまいますね・・・。
 原因究明中です。
(カリーニン) 2015/10/07(水) 00:14

 >If c.Value Mod 100 <> 0 Then ActiveSheet.Cells(1, cnt + 1).Offset(num).Value = c.Value Mod 100

 ↓に修正してください。

 If c.Value - 100 * num <> 0 Then ActiveSheet.Cells(1, cnt + 1).Offset(num).Value = c.Value - 100 * num
(カリーニン) 2015/10/07(水) 00:18

カリーニンさんありがとうございます。
100以下のものを整列することができました。
ただVBAの部分がわからないのですが、
簡単でいいのでそれぞれ意味することを記載していただくことはできないでしょうか?
本当に求めてばかりですいません。
(kk2) 2015/10/07(水) 00:26

 コードの解説です。

 '変数の宣言
 Dim r As Range
 Dim c As Range
 Dim cnt As Integer
 Dim num  As Integer

  'セル範囲/アクティブシートのA1からA列の最終行まで
  Set r = ActiveSheet.Range(ActiveSheet.Range("A1"), ActiveSheet.Range("A" & Rows.Count).End(xlUp))

  'カウントの初期化
  cnt = 0

  'セル範囲をループ
  For Each c In r

   'セルが数値であり、かつ、100以上だったら
   If IsNumeric(c.Value) And c.Value >= 100 Then

      'カウントアップ
      cnt = cnt + 1

      'セルの値を100で割った商を取得(1)
      num = c.Value \ 100

      A1から右方向にカウント分列移動したセルから(1)の数値分下方向に拡張したセル範囲に100を入力(2)
      ActiveSheet.Cells(1, cnt + 1).Resize(num).Value = 100

      'セルの値を100で割った余りが0でなかったら、余りを(2)の次の行に入力
      If c.Value - 100 * num <> 0 Then ActiveSheet.Cells(1, cnt + 1).Offset(num).Value = c.Value - 100 * num
   End If

  '次へ
  Next c

  '変数の解放
  Set r = Nothing
(カリーニン) 2015/10/07(水) 00:36

解説ありがとうございます。
一つ一つ試しながら内容を理解していきたいと思います。
カリーニンさん、βさんありがとうございます。
(kk2) 2015/10/07(水) 00:44

 もう見ていないかもしれませんが。

 >>もう一つこれを100以下の数字は省いて、100以上のみ結果表示することはできるでしょうか? 

 =IF(INDEX($A:$A,COLUMN()-1)<100,"",IF(INDEX($A:$A,COLUMN()-1)>=ROW()*100,100,IF(INDEX($A:$A,COLUMN()-1)-100*(ROW()-1)<0,"",INDEX($A:$A,COLUMN()-1)-100*(ROW()-1))))

 とすれば、当該列は空白になります。

 これを、空白列を作らず、左詰めということであれば、関数音痴のβの手には負えません。

(β) 2015/10/07(水) 05:14


 >う〜ん、、、私のマクロですと、最後のあまりが小数点以下が丸められてしまいますね・・・。
 >原因究明中です。

 VBAヘルプの「Mod 演算子」に↓の解説がありました。

 >解説

 >剰余演算子は、数式 number1 を数式 number2 で除算し、その余りを演算結果 result として返します。このとき浮動小数点数は整数に丸められます。たとえば、次に示す式では、変数 A (演算結果 result) の値は 5 になります。

 >A = 19 Mod 6.7
(カリーニン) 2015/10/07(水) 09:18

 式での場合。

 B1セルに
 =IF(COUNTIF($A:$A,">100")<COLUMN(A1),"",100)
 と入力して右へコピー。

 B2セルに
 =IFERROR(TEXT(IF(B1="","",MIN(100,INDEX($A$1:$A$100,SMALL(IF($A$1:$A$100>=100,ROW($A$1:$A$100),""),COLUMN(A1)))-SUM(B$1:B1))),"0;;")*1,"")
 と入力してShiftキーとCtrlキーを押しながらEnterキーで式を確定(確定後、式が{}で囲まれればOK)
 その後、右と下へフィルコピーでどうか?

 追記

 kk2さんすまない。

 この式では小数点以下を考慮していなかった。
 小数点以下もある場合は式中の「"0;;"」部分を「"G/標準;;"」としてくれ。

 追記の2
 何度もすまない。
 式中に無駄な部分があった。

 =IFERROR(TEXT(MIN(100,INDEX($A$1:$A$1000,SMALL(IF($A$1:$A$1000>=100,ROW($A$1:$A$1000),""),COLUMN(A1)))-SUM(B$1:B1)),"G/標準;;")*1,"")
 としてくれ。

(ねむねむ) 2015/10/07(水) 09:56


 憚りながら・・・。

 >B1セルに
 >=IF(COUNTIF($A:$A,">100")<COLUMN(A1),"",100)

 ↓と思われます。

 =IF(COUNTIF($A:$A,">=100")<COLUMN(A1),"",100)
(カリーニン) 2015/10/07(水) 10:36

 カリーニンさんありがとう。

 kk2さんすまない、カリーニンさんのとおりに修正してくれ。

(ねむねむ) 2015/10/07(水) 10:42


 B1 =IFERROR(IF(INT(INDEX($A:$A,SMALL(INDEX(($A$1:$A$10<100)*10^16+ROW(A$1:A$10),),COLUMN(A1)))/100)+1<ROW(A1),"",IF(INT(INDEX($A:$A,SMALL(INDEX(($A$1:$A$10<100)*10^16+ROW(A$1:A$10),),COLUMN(A1)))/100)<ROW(A1),MOD(INDEX($A:$A,SMALL(INDEX(($A$1:$A$10<100)*10^16+ROW(A$1:A$10),),COLUMN(A1))),100),100)),"")

 範囲コピー。

 ※だらだら。
 
(GobGob) 2015/10/07(水) 14:02

βさん、ねむねむさん、カリーニンさん、GobGobさんありがとうございます。
空白列を右づめにするの完璧にできました。
とても助かりました。ありがとうございます。
(kk2) 2015/10/08(木) 00:01

すいません。解決したと思っていたのですが、実際に打ち込むセルを変えたところうまく関数が動いてくれなくなってしまいました。

実際に使っているのがねむねむさんとカリーニンさんが書いていただいた式で
「1」、=IF(COUNTIF($A:$A,">=100")<COLUMN(A1),"",100) と

「2」、=
IFERROR(TEXT(MIN(100,INDEX($A$1:$A$1000,SMALL(IF($A$1:$A$1000>=100,ROW($A$1:$A$1000),""),COLUMN(A1)))-SUM(B$1:B1)),"0;;")*1,"")

なのですがB1とB2に入れた場合は当たり前ですが問題なく動きます。
今回式を入れるセルをF2に「1」、F3に「2」を入れようと以下のように修正してみたました。
461、105、57などのバラけさせたい数字はD2からD列に羅列しています。

 =IF(COUNTIF($D:$D,">=100")<COLUMN(D2),"",100)

=IFERROR(TEXT(MIN(100,INDEX($D$2:$D$1000,SMALL(IF($D$2:$D$1000>=100,ROW($D$2:$D$1000),""),COLUMN(D2)))-SUM(F$2:F2)),"0;;")*1,"")

このように実際のセルの位置だけ変えたのですが最初のようにうまく計算してくれません。
どこが間違っているのでしょうか?

表記の仕方としては以下の通りです。

 A B C D E F 
1      461 
2      105 
3      57
4      210
5      75

と数値があった場合に100以上の数値が入っているセルの値だけ

 A B C D  E  F  G  H  I
1
2      461    100 100 100
3      105    100  5  100
4      57    100     10
5      210    100
5      75     61

とてもややこしいですがよろしくお願いします。

(kk2) 2015/10/18(日) 11:17


 新しい使用前、使用後ですけど、使用前は 1行目から、で、使用後は元のD列も含めて 2行目からにしたいのですか??

(β) 2015/10/18(日) 11:27


βさん
すいません表記を間違えていました。
1行目は「数字」などラベル?を表示させたいので必然的に入れていく数字や計算式は2行目(D2やF2)から開始したいと考えています。

以下が正しい表記の仕方です

 A B C D E F
1
2      461 
3      105 
4      57
5      210
6      75

と数値があった場合に100以上の数値が入っているセルの値だけ
 A B C D  E  F  G  H  I
1
2      461    100 100 100
3      105    100  5  100
4      57    100     10
5      210    100
5      75     61
(kk2) 2015/10/18(日) 11:39


コメント返信:

[ 一覧(最新更新順) ]


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