- ベストアンサー
エクセルで範囲が変化する場合のΣ
エクセルのマクロ初学者です。上下二つのセルの塊が用意してあり、上の塊にはすべて値が入っています。下のセルには、一定のルールで上のセルの和をとりその結果を表示させたいです。 ちなみにエクセル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の使い方がおかしいのか、おかしかったらどう変更すればよいのかいろいろ調べましたが解決しなかったので質問させていただきました。お詳しい方是非ご教授いただけるとありがたいです。 ここまで読んでいただきありがとうございます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
セルの中身の一部が文字列になっているために「型が一致しません」とエラーで止まっている物と思います。 方法としては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という部分を選択したセルのアドレスを「$」マークをつけずに指定してください。そのセルが空白や数字でない場合にそのセルの色が変わります。 後はこのセルの書式を形式を指定して貼り付けで範囲全体に条件付き書式をコピーしてください。すると、一発で数字以外のデータが入っているセルが見つかります。 それでは健闘祈ります。
その他の回答 (4)
- KURUMITO
- ベストアンサー率42% (1835/4283)
いきなりA=A-・・・・となっていますが最初にAがいくつであるかを指定してから計算式に入ることが必要ですね。Forが始まる前にそれを入れることが必要でしょう。数値が文字列などの問題ではないでしょう。
お礼
そこもおかしいですね、Aの初期化をしてもエラーが出たので色々足したり削ったり試行錯誤しているうちに消してしまったようです。 ご回答ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 最初に回答に直接関係ないことだけれど、「//」のコメントアウトは、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)
お礼
コメントについては質問の際に後から説明を入れたかったのですが、VBAの書き方は存じませんでした、ご指摘ありがとうございます。 ワークシートですか、なるほど。参考になります。ご回答ありがとうございました。
- mitarashi
- ベストアンサー率59% (574/965)
単純化して実行してみると、空のシートではエラーは発生しません。 おそらく、参照しているセルのいずれかに数値に変換できない文字列でも入っているのではないでしょうか。 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 - ...の前に入れて実行してみれば良いと思います。
お礼
解決いたしました。ご回答どうもありがとうございました。
- cistronezk
- ベストアンサー率38% (120/309)
エラーが出たときにデバッグして、セルの値を確認しましたか? 数値ではなく文字列とかを計算していませんか? 予期せぬセルを参照していたりしていませんか?
お礼
上の方々がおっしゃるように、文字列を参照してしまっていたようです。ご回答ありがとうございました。
お礼
ありがとうございます。解決いたしました。ご丁寧にどうも、勉強になります。