こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルで範囲が変化する場合のΣ

エクセルのマクロ初学者です。上下二つのセルの塊が用意してあり、上の塊にはすべて値が入っています。下のセルには、一定のルールで上のセルの和をとりその結果を表示させたいです。
ちなみにエクセル2003を使用しています。
以下、エラーが発生するデータ
Sub Sigmaoperation()


Dim i As Long
Dim j As Long

For k = 4 To 26
For i = 1 To 20
//kとiを変化させて二次元のデータを取得したいです。

For j = 1 To i 

A = A - Cells((22 - j), k).Value + Cells((22 - j), (k - 1)).Value - Cells((23 - j), k).Value + Cells((23 - j), (k - 1)).Value
  
//上の塊のセルを4つ(jとkに依存)を選択し、その値を用いて上のような計算をします。ここで”型が違います”とエラーがでます。

Next

Cells(51 - i, k).Value = A
//ここでセルに値が入るつもりです

Next
Next
End Sub

Cells().valueの使い方がおかしいのか、おかしかったらどう変更すればよいのかいろいろ調べましたが解決しなかったので質問させていただきました。お詳しい方是非ご教授いただけるとありがたいです。
ここまで読んでいただきありがとうございます。

投稿日時 - 2009-08-03 22:33:35

QNo.5179668

すぐに回答ほしいです

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

セルの中身の一部が文字列になっているために「型が一致しません」とエラーで止まっている物と思います。
方法としては2種類ですが前者が簡単です。
 1.Cells().ValueをVal()で囲んでVal(Cells().Value)というようにする
 2.IsNumeric関数を使用してIsNumeric(Cells().Value)=False (<=数字でない場合にFalseになります)となった場合に0として計算する
1.のVal関数は頭の文字から1文字ずつ読み始めて数字でなくなった時点までの文字を数字に変換する関数です。(例:Val("20ABC")の結果は20になります)
2.のIsNumeric関数は中の文字全体を見て数字か否かを判断する関数です。先ほどの"20ABC"はFalseになるので完全な数字である場合だけに処理をする時などに使用します。ただしこちらの場合は別の一時的に数値を格納する変数が必要になってコードの長さも長くなるのが欠点です。

ところで、セルの中に文字(特にスペース文字系のみが入っている場合は発見が困難です)が入っていることを容易に見つけ出す方法があります。
値を書き込んでいる範囲の1個を選択して、条件付き書式に以下の数式を入力して条件に一致した場合はセルの塗りつぶし色を変更するように設定してください。
[数式が |▼] [=AND(ISNUMBER(A1)=FALSE,ISBLANK(A1)=FALSE)   ]
A1という部分を選択したセルのアドレスを「$」マークをつけずに指定してください。そのセルが空白や数字でない場合にそのセルの色が変わります。
後はこのセルの書式を形式を指定して貼り付けで範囲全体に条件付き書式をコピーしてください。すると、一発で数字以外のデータが入っているセルが見つかります。
それでは健闘祈ります。

投稿日時 - 2009-08-04 12:53:52

お礼

ありがとうございます。解決いたしました。ご丁寧にどうも、勉強になります。

投稿日時 - 2009-08-12 15:16:45

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

いきなりA=A-・・・・となっていますが最初にAがいくつであるかを指定してから計算式に入ることが必要ですね。Forが始まる前にそれを入れることが必要でしょう。数値が文字列などの問題ではないでしょう。

投稿日時 - 2009-08-04 09:08:21

お礼

そこもおかしいですね、Aの初期化をしてもエラーが出たので色々足したり削ったり試行錯誤しているうちに消してしまったようです。
ご回答ありがとうございました。

投稿日時 - 2009-08-12 15:15:38

ANo.3

こんにちは。

最初に回答に直接関係ないことだけれど、「//」のコメントアウトは、VBAのものではありませんから、「'(アボスロフィ)」を入れてください。その言語にあわせた、コメントの書き方にしたほうがよいのではないかと思います。他人との差別化するために書く目的なら別ですが、それはまた別の問題があるように思います。

エラーの原因は、私もおそらくは、セルに文字列が入ったものだとは思います。それ以外にエラーの発生する要因が見られません。ただ、この程度は、マクロ側で弾きだすよりも、ワークシートからはじき出したほうがよいです。


範囲に対して、CountA 関数 - Count 関数 を引けば、同じなら文字列はないが、差が出れば、文字列があります。ジャンプ機能を使ってもよいと思います。

例:
  With ActiveSheet.UsedRange
   If WorksheetFunction.CountA(.Cells) - WorksheetFunction.Count(.Cells) > 0 Then
    MsgBox "文字列があるので、エラーが発生する可能性があります。", vbExclamation
    Exit Sub
   End If
  End With


そうでなければ、Val 関数で変換するわけです。

A = A - Val(Cells((22 - j), k).Value) +Val(Cells((22 - j), (k - 1)).Value) _
           - Val(Cells((23 - j), k).Value) + Val(Cells((23 - j), (k - 1)).Value)

投稿日時 - 2009-08-04 08:56:11

お礼

コメントについては質問の際に後から説明を入れたかったのですが、VBAの書き方は存じませんでした、ご指摘ありがとうございます。
ワークシートですか、なるほど。参考になります。ご回答ありがとうございました。

投稿日時 - 2009-08-12 15:13:12

ANo.2

単純化して実行してみると、空のシートではエラーは発生しません。
おそらく、参照しているセルのいずれかに数値に変換できない文字列でも入っているのではないでしょうか。
Sub Sigmaoperation()
Dim i As Long, j As Long, k As Long
Dim A
k = 4
i = 1
j = 1
A = A - Cells((22 - j), k).Value + Cells((22 - j), (k - 1)).Value - Cells((23 - j), k).Value + Cells((23 - j), (k - 1)).Value
Cells(51 - i, k).Value = A
End Sub

原始的なデバッグ法としては、
debug.print Cells((22 - j), k).Value,Cells((22 - j), (k - 1)).Value - Cells((23 - j), k).Value,Cells((23 - j), (k - 1)).Value
といった文を、A = A - ...の前に入れて実行してみれば良いと思います。

投稿日時 - 2009-08-03 23:59:27

お礼

解決いたしました。ご回答どうもありがとうございました。

投稿日時 - 2009-08-12 15:09:38

ANo.1

エラーが出たときにデバッグして、セルの値を確認しましたか?
数値ではなく文字列とかを計算していませんか?
予期せぬセルを参照していたりしていませんか?

投稿日時 - 2009-08-03 23:52:55

お礼

上の方々がおっしゃるように、文字列を参照してしまっていたようです。ご回答ありがとうございました。

投稿日時 - 2009-08-12 15:08:37

あなたにオススメの質問