• ベストアンサー

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

エクセルのマクロ初学者です。上下二つのセルの塊が用意してあり、上の塊にはすべて値が入っています。下のセルには、一定のルールで上のセルの和をとりその結果を表示させたいです。 ちなみにエクセル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の使い方がおかしいのか、おかしかったらどう変更すればよいのかいろいろ調べましたが解決しなかったので質問させていただきました。お詳しい方是非ご教授いただけるとありがたいです。 ここまで読んでいただきありがとうございます。

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

  • ベストアンサー
  • Randomize
  • ベストアンサー率70% (38/54)
回答No.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という部分を選択したセルのアドレスを「$」マークをつけずに指定してください。そのセルが空白や数字でない場合にそのセルの色が変わります。 後はこのセルの書式を形式を指定して貼り付けで範囲全体に条件付き書式をコピーしてください。すると、一発で数字以外のデータが入っているセルが見つかります。 それでは健闘祈ります。

stead2009
質問者

お礼

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

その他の回答 (4)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

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

stead2009
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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)

stead2009
質問者

お礼

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

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.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 - ...の前に入れて実行してみれば良いと思います。

stead2009
質問者

お礼

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

回答No.1

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

stead2009
質問者

お礼

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

関連するQ&A

  • 合計値がある範囲の場合に印をつけるには?

    どなたかご存じでしたらご回答をお願いします。 【質問】 下記のVBAを実行すると、「異なる 25個のものから 5個を選ぶ組み合わせ の総数 nCr (53,130通り)」を作成します。A列~E列の合計をF列に表示しておりますが、 F列の値が58~102の場合、G列に”●”をつけるには、 下記VBAのソースはどのように修正すればよいでしょうか? ●VBAソース ub test() Const MaxNum = 25 Dim s(25) As String Dim i As Integer Dim r As Integer Dim c As Integer i = 1 For r = 1 To 5 For c = 1 To 5 s(i) = Cells(r, c).Value i = i + 1 Next Next Dim j, k, l, m Dim rowX As Long rowX = 0 rowX = rowX + 1 For i = 1 To MaxNum - 4 For j = i + 1 To MaxNum - 3 For k = j + 1 To MaxNum - 2 For l = k + 1 To MaxNum - 1 For m = l + 1 To MaxNum Cells(rowX, 1).Value = s(i) Cells(rowX, 2).Value = s(j) Cells(rowX, 3).Value = s(k) Cells(rowX, 4).Value = s(l) Cells(rowX, 5).Value = s(m) Cells(rowX, 6).Value = Application.WorksheetFunction.Sum(s(i), s(j), s(k), s(l), s(m)) rowX = rowX + 1 Next m Next l Next k Next j Next i End Sub ●VBA実行結果(やりたいこと) A    B     C     D     E     F  G 1     2     3     4     5     15       1     2     3     4     6     16       1     2     3     4     7     17  1     2     3     4     8     18 1     2     3     4     9     19             :             : 1     5     12    19     20    57 1     5     12    19     21    58  ● 1     5     12    19     22    59  ● 1     5     12    19     23    60  ●             :             : 20    21    22     24    25    112 20    21    23     24    25    113 20    22    23     24    25    114 21    22    23     24    25    115   【注意事項】   ・使用するエクセルは2010です。 以上、よろしくお願いします。

  • エクセルVBA、ステップモードと結果が異なる

    たとえば、 dim i,j,k as integer for i=1 to 10 for j=1 to 1000 for k=1 to 100 cells(i*1000+j,k).value=worksheets(i).cells(j,k).value next k next j next i みたいなものを実行させると、転記する行がずれることってありますでしょうか。 F8キーを押し続けて一行ずつ実行させたときには問題ないのですが、普通に実行させたときと結果が異なります。 本当はもっと複雑なプログラムを走らせているのですが、決まって同じセルでおかしな値が入力されてしまうのです。 同じような経験をされた方とか、解決方法をご存じの方、よろしくお願いします。

  • マクロ 検索範囲を修正したい 1つ置きのセルで

    前に以下のマクロをここで教えていただきました。このときはB列からF列の範囲でお願いしたのですが、F列~AG列の1つ置きのセル(G、I、K・・・列)で検索したいです。どう修正したらよいですか?初心者なので調べても分からなかったので教えてください。 Sub Sample1() 'この行から Dim i As Long, j As Long, vL vL = InputBox("検索値を入力してください。") Application.ScreenUpdating = False Cells.Interior.ColorIndex = xlNone For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row For j = 2 To 5 With Cells(i, j) If .Value <> "" And .Value >= vL - 3 And .Value <= vL + 3 Then .Interior.ColorIndex = 36 End If End With Next j Next i Application.ScreenUpdating = True End Sub 'この行まで

  • エクセル2003のVBAで列を指定

    エクセルで特定の列の2~10行目に対して、ある作業をする場合、列を指定する方法は以下のどれがいいでしょうか?あるいはもっといい方法があれば教えてください。 実際には列は約40列(固定)、行は1~2万行(変動)程度で、作業はもっと複雑です。 Sub test01() Dim col Dim i As Long, n As Long For Each col In Array(1, 3, 7, 8, 11) '列番号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test02() Dim col Dim i As Long, n As Long For Each col In Array("A", "C", "G", "H", "K") '列の記号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test03() Dim col Dim i As Long, n As Long For Each col In Range("A2,C2,G2,H2,K2") 'セルで指定 For i = 2 To 10 n = n + 1 col.Offset(i - 2).Value = n Next i Next col End Sub

  • Excel VBAにて2の100乗を計算するには

    プログラミングの勉強でVBAを学んでいるものです 以下の様な問題を出されました 2の100乗の値を計算する。この値はLong型で表せる最大の値をはるかに超すので、十分な大きさのInteger型の配列を用意し、その各要素で各けたの値を表す。値を2倍するサブプロシージャ「二倍」を書いてプログラムを完成させ、値を計算せよ。 Option Explicit Sub 二の百乗() Const n As Integer = 200 Dim s(n) As Integer Dim i As Integer, j As Integer s(1) = 1 For i = 2 To UBound(s) 'UBoundは配列の最大の添え字を返す関数 s(i) = 0 Next i For i = 1 To 100 二倍 s Next i For i = UBound(s) To 1 Step -1 If s(i) <> 0 Then Exit For Next i For j = 1 To i Cells(1, j).Value = s(i - j + 1) Next j End Sub セル一つに計算結果を表示させられないことはよく分かるのですが、そのための2の掛け算を全く思いつきません 二倍のサブプロシージャをどのようにすればいいのでしょうか

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • EXCEL VBA2010 MsgBox

    Sub 重複() Dim i As Long, j As Long For i = 6 To 500 For j = 3 To 3 If WorksheetFunction.CountIf(Range("C6:C500"), Cells(i, j)) > 1 Then Cells(i, j).Interior.ColorIndex = 6 End If Next j Next i End Sub このVBAに重複が何件ありますよというメッセージを出したいです。 MsgBoxの入れ方を教えてください。

  • エクセル マクロ 抽出

    教えてください。 ○と記入されたセルを参照して、一つ上のセル・A列にある同じ行のセル・ 9行目にある同じ列のセルを抽出しようとしています。 下記の通り入力すると 行数=値.Rowでエラーが出たしまいました。 試行錯誤頑張りましたが解決できそうにありませんのでお力を貸して頂けないでしょうか。 Sub 抽出() Dim i, 行数, 列数 As Long Dim 値 As Range i = 0 行数 = 値.Row 列数 = 値.Column For Each 値 In Sheets("sheet1").Range("C12:R171") If 値.Value = "○" Then i = i + 1 With Sheets("sheet2") .Cells(i, 3).Value = Sheets("sheet1").Cells(行数, 1).Value .Cells(i, 4).Value = Sheets("sheet1").Cells(9, 列数).Value .Cells(i, 5).Value = 値.Offset(-1, 0).Value End With End If Next End Sub

  • EXCEL VBAについて

    EXCEL VBAについて教えてください やりたいことは以下の通りです。 ・全シートJ列1~100行目を検索しアルファベットが含まれるセルが存在すれば 上のセルをコピーする ここまで作ったのですが上手くいきません Sub VBAsample() Dim GYO As Long For GYO = 1 To 100 If Find([a-z], LookAt:=xlPart) Then Cells(GYO, 10).Value = Cells(GYO - 1, 10).Value End If Next GYO End Sub 添削をお願いします

  • エクセルマクロで特定の範囲内の検索

    A10からA100までのセルを上から順に調べて、セルにAという文字が入力されているときに、その隣にBという文字を入力するマクロを下記のように作りました。 「セルにAという文字が入力されているとき」という条件に加え、「検索しているセルから上の9個のセル(cells(i-9,1)からcells(i-1,1)まで)にAという文字が入力されていない」という条件を加えたいのです。 Sub 検索() Dim i As Integer For i = 10 To 100 If Cells(i, 1).Value = "A" Then Cells(i, 2).value = "B" End If Next i End Sub つまり If Cells(i, 1).Value = "A" Then  の部分を If Cells(i, 1).Value = "A" かつ Range(cells(i-9,1),cells(i-1,1))にAが入力されていない Then という形にしたいのですが、表現の仕方がわかりません。 ご教示よろしくお願いします。

専門家に質問してみよう