Excel VBA質問箱 IV

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

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


3792 / 13645 ツリー ←次へ | 前へ→

【60138】if関数を使った結果の参照について qunlo 09/1/29(木) 20:17 質問[未読]
【60139】Re:if関数を使った結果の参照について ponpon 09/1/29(木) 20:35 発言[未読]
【60141】Re:if関数を使った結果の参照について qunlo 09/1/30(金) 4:15 お礼[未読]
【60143】Re:if関数を使った結果の参照について ichinose 09/1/30(金) 6:48 発言[未読]
【60145】Re:if関数を使った結果の参照について ponpon 09/1/30(金) 10:32 発言[未読]
【60151】Re:if関数を使った結果の参照について qunlo 09/1/30(金) 14:23 お礼[未読]
【60152】Re:if関数を使った結果の参照について にぃ 09/1/30(金) 14:32 発言[未読]
【60168】Re:if関数を使った結果の参照について qunlo 09/2/1(日) 8:10 お礼[未読]
【60140】Re:if関数を使った結果の参照について ゆみこん 09/1/29(木) 21:06 発言[未読]
【60142】Re:if関数を使った結果の参照について qunlo 09/1/30(金) 4:22 お礼[未読]
【60144】Re:if関数を使った結果の参照について ゆみこん 09/1/30(金) 9:10 発言[未読]

【60138】if関数を使った結果の参照について
質問  qunlo  - 09/1/29(木) 20:17 -

引用なし
パスワード
   セルA1が空白なら空白、100以上なら2、100未満なら1をセルA2に出力するようなIF関数を書いています。
(例1)
=IF(A$1="","",IF(A$1>=100,2,1))

この関数をセルA2からE2まで書いています。

A2からE2までの合計を出力したいのですが、例えばB1が空白だった場合、B2も空白になるのですが、合計しようとすると「型が一致しません」となってしまいます。
関数を書いていない空白の場合は自動的に0と見なされるのですが、関数が書いてあるセルは見た目が空白でも空白と認識されないようです。

今回、空白を0に置き換えたくないので、空白として参照したいのですが、何か良い方法はありませんでしょうか。

宜しくお願いします。

【60139】Re:if関数を使った結果の参照について
発言  ponpon  - 09/1/29(木) 20:35 -

引用なし
パスワード
   >合計しようとすると「型が一致しません」となってしまいます。
どのようにしたとき、このようになるのでしょうか?
再現しません。

Sub test()
  MsgBox Application.WorksheetFunction.Sum(Range("A2:E2"))
End Sub

Sub test2()
  Range("F2").Formula = "=SUM(A2:E2)"
  MsgBox Range("F2").Value
End Sub

【60140】Re:if関数を使った結果の参照について
発言  ゆみこん  - 09/1/29(木) 21:06 -

引用なし
パスワード
   ▼qunlo さん:
>A2からE2までの合計を出力したいのですが、例えばB1が空白だった場合、B2も空白になるのですが、合計しようとすると「型が一致しません」となってしまいます。

エラーって、

Sub abc()
Dim i As Integer
Dim j As Integer

For i = 1 To 5
j = j + Cells(2, i).Value
Next
MsgBox j
End Sub

な感じで、整数型に文字列""を足そうとして失敗しているのでは?

回避方は既に出ていますので省略します。

【60141】Re:if関数を使った結果の参照について
お礼  qunlo  - 09/1/30(金) 4:15 -

引用なし
パスワード
   ▼ponpon さん:
回答ありがとうございます。
私の挙げた例が良くなかったようです。
実際は、A1、C1、E1・・・という風に一つ飛ばしのセルの値を合計したいので、SUM関数は使ってません。FOR文で一つ飛ばしに値を取得して、変数に蓄積させています。
具体的に書くと、こうです。
(例)
Sub test()
  Dim i  As Integer  'loop counter
  Dim sum As Integer  'sum
  
  For i = 1 to 5
    sum = sum + Sheets("XXX").Cells( 1, ( i - 1 ) * 2 + 1 ).Value
  Next
End sub

XXXシートのA1、C1、E1、G1、I1にはIF関数が書かれており、例えばB1が100以上ならA1に2を出力し、B1が100未満ならA1に1を出力します。また、B1が空白の場合は、A1を空白のままになるようにIF関数を書きます。
(例.A1のセル)
=IF(B1="","",IF(B1>=100,2,1))

同様にC1はD1に、E1はF1に、G1はH1に、I1はJ1に対応します。
(例.C1のセル)
=IF(D1="","",IF(D1>=100,2,1))
(例.E1のセル)
=IF(F1="","",IF(F1>=100,2,1))
(例.G1のセル)
=IF(H1="","",IF(H1>=100,2,1))
(例.I1のセル)
=IF(J1="","",IF(J1>=100,2,1))

すると、100以上や100未満で2とか1とか出力される場合は良いのですが、空白になった場合に、合計する処理にてエラーになります。

要求仕様的にフォーマットを変えることができないのですが、SUM関数を使える方法が浮かんだので、それで試してみます。

【60142】Re:if関数を使った結果の参照について
お礼  qunlo  - 09/1/30(金) 4:22 -

引用なし
パスワード
   ▼ゆみこん さん:
回答ありがとうございます。
私も、ゆみこんさんの仰るように整数型に""を足そうとしているからだと思いました。
しかし、関数を書いていないセルの場合は、""を足そうとしても0と同じように処理されて問題なく動作するので、関数が書いてあることが問題なのかと思いました。
この件が既出とは存じませんでいた。
調べてみます。

【60143】Re:if関数を使った結果の参照について
発言  ichinose  - 09/1/30(金) 6:48 -

引用なし
パスワード
   おはようございます。

>私の挙げた例が良くなかったようです。
そうですね!!最初から、このわかりやすい投稿がほしかったですね

エラーが起きる状態に当該シートのデータを設定した状態
(例 セルB1を""にしておけば、セルA1も数式で""になる)で
以下のコードを実行してみてください。

Sub test()
  Dim i  As Integer  'loop counter
  Dim sum As Integer  'sum
 
  For i = 1 To 5
   
    MsgBox TypeName(Cells(1, (i - 1) * 2 + 1).Value)
    
    sum = sum + Cells(1, (i - 1) * 2 + 1).Value
  Next
  
End Sub

エラーが発生する直前の Msgboxの変数の型は String ですよね?

確かに

sub samp1()
  Dim a As Long
  a = a + ""
end sub

とすれば、「型が一致しない」というエラーが発生します。


次に数式の結果を値に変換してから 変数の型を調べてみると

Sub test2()
  Dim i  As Integer  'loop counter
  Dim sum As Integer  'sum
 
  For i = 1 To 5
    Cells(1, (i - 1) * 2 + 1).Value = Cells(1, (i - 1) * 2 + 1).Value
    
    MsgBox TypeName(Cells(1, (i - 1) * 2 + 1).Value)
    
    sum = sum + Cells(1, (i - 1) * 2 + 1).Value
  Next
  
End Sub

表示される変数の型は「Empty」となって、エラーになりません。

これも簡単コードで検証すると、確かにエラーになりません。

Sub Samp2()
  Dim a As Long
  Dim b As Variant
  b = Empty
  a = a + b
  MsgBox a
End Sub


数式で設定した""と値で設定した""では、セルのValueプロパティの型が
違っていることが エラーになる ならないの原因になっています。

VBAは、型の違う変数や定数の演算に対して親切です。

例1

sub aaa()
 dim b as long
 b=b+"5"
 msgbox b
end sub

sub bbb()
  dim c as string
  c= c & 5
  msgbox c
end sub

↑こんなコードは、型を変換して結果を出してくれます。
私が、VBAをはじめる前に使っていたBasicでは、
「型が一致しない」といずれもエラーになりました。

型変換してくれるとコード記述は楽になりますけど、
やってくれるとものだと思い込んでいるとたまにこういう落とし穴がありますから、
注意してください。


エラーをなくすには、

    sum = sum + Val(Cells(1, (i - 1) * 2 + 1).Value)

このようにしておくとよいでしょう

【60144】Re:if関数を使った結果の参照について
発言  ゆみこん  - 09/1/30(金) 9:10 -

引用なし
パスワード
   ▼qunlo さん:
>▼ゆみこん さん:
>回答ありがとうございます。
>私も、ゆみこんさんの仰るように整数型に""を足そうとしているからだと思いました。
>しかし、関数を書いていないセルの場合は、""を足そうとしても0と同じように処理されて問題なく動作するので、関数が書いてあることが問題なのかと思いました。
>この件が既出とは存じませんでいた。
>調べてみます。

>この件が既出とは存じませんでいた。
SUM関数を用いれば大丈夫と思っただけです。
⇒ ponpon さんが先に回答されてましたので、と言う意味です。

【60145】Re:if関数を使った結果の参照について
発言  ponpon  - 09/1/30(金) 10:32 -

引用なし
パスワード
   ▼ichinose さん:
>おはようございます。
おはようございます。朝早いですね!!

>これも簡単コードで検証すると、確かにエラーになりません。
>
>Sub Samp2()
>  Dim a As Long
>  Dim b As Variant
>  b = Empty
>  a = a + b
>  MsgBox a
>End Sub
>
>
>数式で設定した""と値で設定した""では、セルのValueプロパティの型が
>違っていることが エラーになる ならないの原因になっています。
>

なるほどね! 勉強になります。

【60151】Re:if関数を使った結果の参照について
お礼  qunlo  - 09/1/30(金) 14:23 -

引用なし
パスワード
   ▼ichinose さん:
回答ありがとうございます。
詳しい解説をつけて頂いたおかげで、素人の私でもよく分かりました。

【60152】Re:if関数を使った結果の参照について
発言  にぃ  - 09/1/30(金) 14:32 -

引用なし
パスワード
   ▼qunlo さん:
こんにちは!

素直にこんな方法はダメですか?

  With Sheets("XXX")
    For i = 1 To 5
      If .Cells(1, (i - 1) * 2 + 1).Value <> "" Then
        Sum = Sum + .Cells(1, (i - 1) * 2 + 1).Value
      End If
    Next
  End With

あと、Stepを使ってはどうでしょう?

  With Sheets("XXX")
    For i = 1 To 9 Step 2
      If .Cells(1, i).Value <> "" Then
        Sum = Sum + .Cells(1, i).Value
      End If
    Next
  End With

【60168】Re:if関数を使った結果の参照について
お礼  qunlo  - 09/2/1(日) 8:10 -

引用なし
パスワード
   ▼にぃ さん:
回答ありがとうございます。
言われてみれば納得ですね。
計算の前にif文で逃がしてしまえば良かったんですね。
STEPというのは知りませんでした。活用させて頂きます。

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