Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9512 / 13644 ツリー ←次へ | 前へ→

【26871】条件一致での合計値を求める かじったばかり 05/7/21(木) 23:52 質問[未読]
【26874】Re:条件一致での合計値を求める ichinose 05/7/22(金) 6:51 発言[未読]
【26903】Re:条件一致での合計値を求める かじったばかり 05/7/22(金) 22:33 お礼[未読]
【26929】Re:条件一致での合計値を求める ichinose 05/7/23(土) 12:17 発言[未読]
【26930】Re:条件一致での合計値を求める かじったばかり 05/7/23(土) 18:49 お礼[未読]

【26871】条件一致での合計値を求める
質問  かじったばかり  - 05/7/21(木) 23:52 -

引用なし
パスワード
   初めて質問させてもらいます。
早速ですが下記のようにA列には積算値で必ず増加してゆきます。
B列C列には計器からの信号でONかOFFの状態で入力されています。
BとCともにONの時があります。又行数は定まっていませんが約3000行ほどあります
求めたいことはBがONでCがOFFのときのA列の増加量です。
下記表では(6-1)+(35-33)=7
となります。

どのように考えたらよいのか考えあぐねています。
どうかアドバイスをください。
 A     B  C
1 1    ON OFF
2 3    ON OFF
3 6    ON OFF
4 7    ON ON
5 9    ON ON
6 11    OFF ON
7 18    OFF ON
8 20    OFF ON
9 25    OFF ON
10 30    OFF ON
11 33   ON OFF
12 35   ON OFF




【26874】Re:条件一致での合計値を求める
発言  ichinose  - 05/7/22(金) 6:51 -

引用なし
パスワード
   ▼かじったばかり さん:
おはようございます。

>初めて質問させてもらいます。
>早速ですが下記のようにA列には積算値で必ず増加してゆきます。
>B列C列には計器からの信号でONかOFFの状態で入力されています。
>BとCともにONの時があります。又行数は定まっていませんが約3000行ほどあります
>求めたいことはBがONでCがOFFのときのA列の増加量です。
>下記表では(6-1)+(35-33)=7
>となります。
>
>どのように考えたらよいのか考えあぐねています。
>どうかアドバイスをください。
> A     B  C
>1 1    ON OFF
>2 3    ON OFF
>3 6    ON OFF
>4 7    ON ON
>5 9    ON ON
>6 11    OFF ON
>7 18    OFF ON
>8 20    OFF ON
>9 25    OFF ON
>10 30    OFF ON
>11 33   ON OFF
>12 35   ON OFF
>・
>・
>・
上記のようにA列1行目からデータが入力されているものとして

'==================================
Sub main()
  Dim rng As Range
  Dim A1add As String, A2add As String
  Dim B1add As String, B2add As String
  Dim C1add As String, C2add As String
  On Error Resume Next
  Set rng = Range("a1", Cells(Rows.Count, 1).End(xlUp))
  Set rng = rng.Resize(rng.Count - 1, 1)
  If Err.Number = 0 Then
    With rng
     A1add = .Address
     B1add = .Offset(0, 1).Address
     C1add = .Offset(0, 2).Address
     A2add = .Offset(1, 0).Address
     B2add = .Offset(1, 1).Address
     C2add = .Offset(1, 2).Address
     funcstr = "SUM(IF((" & B2add & "=""on"")*(" & _
        C2add & "=""off"")*(" & _
        B1add & "=""on"")*(" & _
        C1add & "=""off"")," & _
        A2add & "-" & A1add & ",0))"
     End With
    MsgBox "増加量は----- " & Evaluate(funcstr)
  Else
    MsgBox "増加量は----- " & 0
    End If
  On Error GoTo 0
End Sub

名前の定義と数式を組み合わせるとVBAが
要らないかも知れません

【26903】Re:条件一致での合計値を求める
お礼  かじったばかり  - 05/7/22(金) 22:33 -

引用なし
パスワード
   ichinose さん
ありがとうございます。
思ったとおりの結果になりました。
今まで悩んでいたのがすっきりはれました。
>funcstr
の式の内容なんですがどのようになっているのでしょうか?
よければご教授ください。


▼ichinose さん:
>▼かじったばかり さん:
>おはようございます。
>
>>初めて質問させてもらいます。
>>早速ですが下記のようにA列には積算値で必ず増加してゆきます。
>>B列C列には計器からの信号でONかOFFの状態で入力されています。
>>BとCともにONの時があります。又行数は定まっていませんが約3000行ほどあります
>>求めたいことはBがONでCがOFFのときのA列の増加量です。
>>下記表では(6-1)+(35-33)=7
>>となります。
>>
>>どのように考えたらよいのか考えあぐねています。
>>どうかアドバイスをください。
>> A     B  C
>>1 1    ON OFF
>>2 3    ON OFF
>>3 6    ON OFF
>>4 7    ON ON
>>5 9    ON ON
>>6 11    OFF ON
>>7 18    OFF ON
>>8 20    OFF ON
>>9 25    OFF ON
>>10 30    OFF ON
>>11 33   ON OFF
>>12 35   ON OFF
>>・
>>・
>>・
>上記のようにA列1行目からデータが入力されているものとして
>
>'==================================
>Sub main()
>  Dim rng As Range
>  Dim A1add As String, A2add As String
>  Dim B1add As String, B2add As String
>  Dim C1add As String, C2add As String
>  On Error Resume Next
>  Set rng = Range("a1", Cells(Rows.Count, 1).End(xlUp))
>  Set rng = rng.Resize(rng.Count - 1, 1)
>  If Err.Number = 0 Then
>    With rng
>     A1add = .Address
>     B1add = .Offset(0, 1).Address
>     C1add = .Offset(0, 2).Address
>     A2add = .Offset(1, 0).Address
>     B2add = .Offset(1, 1).Address
>     C2add = .Offset(1, 2).Address
>     funcstr = "SUM(IF((" & B2add & "=""on"")*(" & _
>        C2add & "=""off"")*(" & _
>        B1add & "=""on"")*(" & _
>        C1add & "=""off"")," & _
>        A2add & "-" & A1add & ",0))"
>     End With
>    MsgBox "増加量は----- " & Evaluate(funcstr)
>  Else
>    MsgBox "増加量は----- " & 0
>    End If
>  On Error GoTo 0
>End Sub
>
>名前の定義と数式を組み合わせるとVBAが
>要らないかも知れません

【26929】Re:条件一致での合計値を求める
発言  ichinose  - 05/7/23(土) 12:17 -

引用なし
パスワード
   ▼かじったばかり さん:
こんにちは。

>ありがとうございます。
>思ったとおりの結果になりました。
>今まで悩んでいたのがすっきりはれました。
>>funcstr
>の式の内容なんですがどのようになっているのでしょうか?
>よければご教授ください。
では、
>>> A     B  C
>>>1 1    ON OFF
>>>2 3    ON OFF
>>>3 6    ON OFF
>>>4 7    ON ON
>>>5 9    ON ON
>>>6 11    OFF ON
>>>7 18    OFF ON
>>>8 20    OFF ON
>>>9 25    OFF ON
>>>10 30    OFF ON
>>>11 33   ON OFF
>>>12 35   ON OFF
この例題で考えます。コードを実行すれば、上記の例題では、
Funcstrは、

「SUM(IF(($B$2:$B$12="on")*($C$2:$C$12="off")*($B$1:$B$11="on")*($C$1:$C$11="off"),$A$2:$A$12-$A$1:$A$11,0))」

となります。これは、配列数式になっています。
仮にセルI1に

「=SUM(IF(($B$2:$B$12="on")*($C$2:$C$12="off")*($B$1:$B$11="on")*($C$1:$C$11="off"),$A$2:$A$12-$A$1:$A$11,0))」

と指定し確定をEnterキーではなく、
Ctrl+Shift+Enterキーで行ってみてください。

セルI1にはコード実行時と同様の「7」と表示されます。

コードは、これと同じ事を行っています。

別の方法で分析してみましょう。

上記の例題に対して、

・セルD2〜D12を選択してください。

・選択した状態で数式バーに
 「=IF(($B$2:$B$12="on")*($C$2:$C$12="off")*($B$1:$B$11="on")*($C$1:$C$11="off"),$A$2:$A$12-$A$1:$A$11,0)」

と指定し、確定をEnterキーではなく、
Ctrl+Shift+Enterキーで行ってみてください。

   D
 1  
 2 2
 3 3
 4 0
 5 0
 6 0
 7 0
 8 0
 9 0
10 0
11 0
12 2

と表示されていれば正しく指定できたことになります。
(こうならなかったら、どこか指定方法が違っていると思ってください)
このD2からD12を合計した結果が7です。

これを一回で行ってしまうのがFuncstrに入る配列数式です。


配列は、うまく利用すると便利です。

「配列数式」で検索すればいくつも引っかかってくると思いますから、
調べてみてください。

【26930】Re:条件一致での合計値を求める
お礼  かじったばかり  - 05/7/23(土) 18:49 -

引用なし
パスワード
   ▼ichinose さん:
こんにちは
丁寧にご教授くださいありがとうございます

>これを一回で行ってしまうのがFuncstrに入る配列数式です。
>
>
>配列は、うまく利用すると便利です。
>
>「配列数式」で検索すればいくつも引っかかってくると思いますから、
>調べてみてください。

配列数式?初めて聴く言葉です。
検索結果で勉強中です。いろんなことが出来るんですね


月曜からの仕事がはかどります。
又ご教授ください。

9512 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free