• ベストアンサー

sumproductの計算式で「エラー2015」(ローカルウィンドウにて)が表示(Excel2007、2003)

2つの条件に合致する数量の合計を出したい為、sumproduct関数を使って計算結果を算出しようと考えています。 sumproduct関数を使った例をwebからいくつも見て下記モジュールを書きましたが、「ans」(sumproduct関数での計算結果部分)でローカルウィンドウに「エラー2015」が表示され結果が出ません。 (試しにセル上に直接、sumproduct関数を使って計算結果が出るか確認したところ、結果表示されます。) 「"」や「&」の付け方に問題があるかと思い、いろいろなパターンで試しましたが同様です。 修正記述がお分かりの方がいらっしゃいましたら、お言葉をいただけると幸いです。 宜しくお願いいたします。 ------------------------ Sub culiturate() Dim str1, str2, str3 As Range Rows("2:2").Select cate = Selection.Find(what:="分類", lookat:=xlWhole).Column SP = Selection.Find(what:="特記", lookat:=xlWhole).Column kazu = Selection.Find(what:="数量", lookat:=xlWhole).Column saigo = Cells(Rows.Count, cate).End(xlUp).Row Set str1 = Range(Cells(3, cate), Cells(saigo, cate)) Set str2 = Range(Cells(3, SP), Cells(saigo, SP)) Set str3 = Range(Cells(3, kazu), Cells(saigo, unit)) ans = Evaluate("sumProduct((" & str1.Address & "=" & "2BB" & ") * (" & str2.Address & "=" & "7RR" & ")," & str3.Address & ")") '←ここでエラー2015になる End Sub

  • E_VB
  • お礼率54% (6/11)

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

>「"」や「&」の付け方に問題があるかと思い、いろいろなパターンで試しましたが同様です。 そのとおりです、「"」の付け方に問題がありました >ans = Evaluate("sumProduct((" & str1.Address & "=" & "2BB" & ") * (" & str2.Address & "=" & "7RR" & ")," & str3.Address & ")") '←ここでエラー2015になる の "sumProduct((" & str1.Address & "=" & "2BB" & ") * (" & str2.Address & "=" & "7RR" & ")," & str3.Address & ")" の、部分を文字列で出力すると sumProduct(($A$3:$A$5=2BB) * ($B$3:$B$5=7RR),$C$3:$C$5) の様になり、エラー個所が見やすいと思います sumProduct(($A$3:$A$5="2BB") * ($B$3:$B$5="7RR"),$C$3:$C$5) とするためには ans = Evaluate("sumProduct((" & str1.Address & "=" & """2BB""" & ") * (" & str2.Address & "=" & """7RR""" & ")," & str3.Address & ")") と修正してください 他も修正してみたので、試してみて Sub culiturate() Dim str1 As String, str2 As String, str3 As String Dim cate As Integer, SP As Integer, kazu As Integer, unit As Integer Dim saigo As Long Dim ans As Variant cate = Rows("2:2").Find(what:="分類", lookat:=xlWhole).Column SP = Rows("2:2").Find(what:="特記", lookat:=xlWhole).Column kazu = Rows("2:2").Find(what:="数量", lookat:=xlWhole).Column saigo = Cells(Rows.Count, cate).End(xlUp).Row str1 = Range(Cells(3, cate), Cells(saigo, cate)).Address str2 = Range(Cells(3, SP), Cells(saigo, SP)).Address str3 = Range(Cells(3, kazu), Cells(saigo, unit)).Address ans = Evaluate("sumProduct((" & str1 & "=""2BB"") * (" & str2 & "=""7RR"")," & str3 & ")") '←ここでエラー2015になる MsgBox ans End Sub 基本的な処理は変更していないので、これでエラーが出る場合は他に原因があると思います 変数str3をrangeからstringに変更してますが 次のEvaluate式を短くするために行っただけで 深い意味はありません 以上参考まで

E_VB
質問者

お礼

hige_082様 回答ありがとうございます。 今回の原因は、範囲の変数の定義を各変数にしなかったことのようです。 (hige_082様が書いて下さったデバッグが起こる箇所の記述は、webで書込みをした記述以外で試したものでした。) 私が記述したもので、文字列にした場合の確認の仕方までふれて下さり、誤りが明確に分かりました。 アドバイスありがとうございます。 感謝します。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 #1で書いた、 「本当は、そのような数式を使わずに、セルひとつずつにループして計算するようにしたほうがよいです」 のコードを出して置きます。多少、スピードには難点がありますが、VBAらしさを求めても良いと思います。書き方によっては、もう少しスピードは上がります。 '------------------------------------------- Sub Test2()   Dim rng As Range   Dim c As Range   Dim dbSum As Double   Const ARG1 As String = "2BB"   Const ARG2 As String = "7RR"   With ActiveSheet    Set rng = .Range("B3", .Range("B65536"))   End With   Application.ScreenUpdating = False   For Each c In rng     If c.Value = Trim(ARG1) And _       c.Offset(, 2).Value = Trim(ARG2) Then       dbSum = dbSum + c.Offset(, 3).Value     End If   Next c   Application.ScreenUpdating = True   MsgBox dbSum End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 VBAのプロシージャで、Evaluate の中では、配列も同じですから、SUMで良いのです。ただ、VBAの数式の配列を使うというのは、上級のレベルになりますから、本当は、そのような数式を使わずに、セルひとつずつにループして計算するようにしたほうがよいです。 × Set str3 = Range(Cells(3, kazu), Cells(saigo, unit)) 配列数式なのに、別の範囲を入れたらエラーが発生します。 Set str3 = Range(Cells(3, kazu), Cells(saigo, kazu)) 本来は、Set str3 = Cells(3, kazu).Resize(saigo - 2) のように、Resize を利用したほうが確かです。 ans = Evaluate("SUM((" & str1.Address & "=""2BB"")*(" & str2.Address & "=""7RR"")*(" & str3.Address & "))")

E_VB
質問者

お礼

Wendy02様 回答ありがとうございます。 誤りご指摘のstr3ですが、変数を誤って書いていました。 (「unit」を「kazu」に書き換えていたのですが、webでの投稿時に書き換えモレをしてしまいました。) 範囲の変数を省略せずに、各変数ごとに「as Range」と定義し、ansの「&」記述箇所を訂正したところ、計算結果が出るようになりました。 Wendy02様が案を出して下さったsum関数を使った式も、大変参考になるので有り難く思っています。

関連するQ&A

  • ExcelのVBA ListBox.RowSourceの範囲について教えてください。

    下記のように範囲を変数で検索指定したいのですが、うまくいきません。VBAは初心者です。誰か助けて。 内容は・・・五十音順にあるリストを作り、ウ音のみをListBoxに表示したいのですが。 Private Sub ToggleButton3_Click() Dim A As Range Dim BBB As String Dim C As Range Dim DDD As String Set A = Cells.Find(what:="ウ", lookat:=xlWhole) BBB = Cells(A.row, A.Column + 1).Address Set C = Cells.Find(what:="エ", lookat:=xlWhole) DDD = Cells(C.row - 1, C.Column + 1).Address ListBox商品名.RowSource = "BBB:DDD" End Sub PS 違う方法でもいいのでどなたか教えてください。

  • SUMPRODUCTでエラーになってしまいます。

    関数を少しづつ勉強しながら集計表作成の業務を同時進行しています。 初心者です。 今作ってるのは複数条件の合計金額を求めたくて、 SUMPRODUCT(('4月'!D4:D38="*"&$C135&"*")*('4月'!$H4:H38=C58)*('4月'!E4:E38)) を作ったのですが、どうやらSUMPRODUCTだと「~を含む」の機能が使えないみたいなので 色々調べて SUMPRODUCT((ISNUMBER(FIND($C$135,'4月!$D$4:$D$38)))*('4月!H4:H38=C61)*('4月!E4:E38)) が完成しました! そして、更に右にコピーするとシートの月も5月、6月・・と変わるようにしたかったので 前回ここで教えてもらった関数を参考に SUMPRODUCT((ISNUMBER(FIND($C$135,INDIRECT(MOD(COLUMN(C1),12)+1&"月!$D$4:$D$38))))*(INDIRECT(MOD(COLUMN(C1),12)+1&"月!H4:H38=C61))*(INDIRECT(MOD(COLUMN(C1),12)+1&"月!E4:E38))) を作りました。 でも・・・エラーになってしまうのです。 セルにエラー表示がされるのではなく正しく直るまで「修正しなさい」って出るバージョンの エラーです。。。。 もう何がいけないのかさっぱりで・・・・・ あと一番上の原型の関数からなのですが、セル番地を列で指定したいのですが、 D:DとかH:Hにするとセルのエラーになってしまいます。 こちらも何でエラーになるのかわからなくて困っています。 どなたか詳しい方教えて下さい。

  • vba 結合されたセルの列番号を取得したい

    セルを結合しているセルに、値が入っていて、 その値を検索して列番号を取得したいのですが エラーになります。 A1セルとA2セルを結合して、 「a」をいれて Sub test() MsgBox Cells.Find(What:="a", LookAt:=xlWhole).Column MsgBox Rows("1:2").Find(What:="a", LookAt:=xlWhole).Column End Sub をしても、どちらもエラーになります。 実行時エラー91「オブジェクト変数またはWithブロック変数が設定されていません」 というエラーです。 でもB1に「a」を入れれば、問題なく2が返されます。 結合されててもセルを検索する方法を教えてください。

  • VBAで画像のアップロードをした時だけ

    以前こちらに質問した者ですが http://oshiete.coneco.net/qa8302218.html htmlファイルをvbaでFTPでアップロードすることは出来たのですが 画像がうまくアップロードできません。 Sub FTPで送る() Dim str送信ファイル As String str送信ファイル = MyDesktop & "\" & strSheetsName '送信ファイル Set FTP = CreateObject("basp21.FTP") With Sheets("メイン") Server = .Cells(.Cells.Find(What:="ホストアドレス", LookAt:=xlWhole).Row, 2) User = .Cells(.Cells.Find(What:="FC2_ID", LookAt:=xlWhole).Row, 2) Pass = .Cells(.Cells.Find(What:="FTPパスワード", LookAt:=xlWhole).Row, 2) End With Folder = "/" '送信フォルダ rc = FTP.Connect(Server, User, Pass) rc = FTP.PutFile(str送信ファイル, Folder) If rc <> 1 Then Debug.Print Dir(str送信ファイル) & "を送信できませんでした。" FTP.Close Exit Sub End If FTP.Close End Sub これで、拡張子がhtmlは問題なくアップロードできますが jpgはアップロードされますが、画像を開けません。 画像が空白になります。 FFFTPでアップロード済みの画像を開いてみようとすると、 「ファイルが破損しているか大きすぎる可能性があります」 となります。 VBAを使わずに手動で同じ画像をFFFTPでアップロードすると 問題なく画像が表示されます。 VBAで画像のアップロードをした時だけ画像が一応アップロードはされますが 表示されません。 なぜでしょうか? 再度ご教授いただければ助かります。 よろしくお願いします。

  • 改行のあるセルをFindで検索したい

    エクセルです。 A1セルに 「あああ」と入力して、ALT+Enterで改行し、「いいい」と入力しました。 VBAで Sub test() MsgBox Cells.Find(What:="あああ" & Chr(13) & "いいい", LookAt:=xlWhole).Address End Sub として、セル番地を取得したいのですが オブジェクト変数または With ブロック変数が設定されていません。(Error 91) と言うエラーが返ってきてしまいます。 $a$1が返ってきてほしいのですが。 Sub test() Debug.Print Cells.Find(What:="あああ*", LookAt:=xlWhole).Address End Sub で、$a$1が返ってきますが、 できれば改行含む検索ができるようになりたいです。

  • エクセルのVBAで悩んでいます。

    いつもありがとうございます。 エクセルのVBAで悩んでいます。 セルの範囲指定をVBAで行いたいのです。 ただし、引数に数値変数を使用する為、Cellsプロパティを使います。 すると、離れている範囲の範囲指定が出来ないのです。 例えば、Rangeプロパティだと、 Range("A5:E5,A9:E32").Select こうなるところを、 A9:E32 を変数に置き換えたくて、 Range("A5:E5", Cells(g, 1), Cells(h, 5)).Select と、するとエラーが出ます。 VBAの前文は次の通りです。 Private Sub CommandButton1_Click() a = Me.TextBox1.Value b = Me.TextBox2.Value Set c = Range("a:a").Find(what:=a, LookIn:=xlValues, lookat:=xlWhole) Set d = Range("a:a").Find(what:=b, LookIn:=xlValues, lookat:=xlWhole) 'MsgBox c + d e = c.Address 'MsgBox e f = d.Address 'MsgBox f g = Range(e).Row MsgBox g h = Range(f).Row MsgBox h Range(Cells(g, 1), Cells(h, 5)).Select End sub よろしくお願い致します。

  • マクロエラ-

    初心者です。win2000,エクセルでマクロが途中で止まってしまいます。時々に、最後までいくことがありますが、8割がたは、同じところでストップします。 マクロ言語は理解できていません。 うまく完了のケ-スは、デ-タの中身次第かなと思います。 記憶では、”0”があれば、何かをするようにしたと思います。 想定外のデ-タで、とまるのなら、回避方法を教えてください。 黄色反転して、ストップする部分は、以下です。 mcr3 Range("A1").Select ActiveCell.SpecialCells(xlLastCell).Select Columns("C:C").Select Selection.Find(What:="0", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False).Activate いつもここで止まります。 ActiveCell.Replace What:="0", Replacement:="", LookAt:=xlWhole, _ SearchOrder:=xlByRows, MatchCase:=False, MatchByte:=False Selection.Find(What:="0", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False).Activate -----------→つずく。

  • エクセル マクロ 検索

    お世話になります。 範囲がA2からK221までの表があります。 検索して検索されたセルの左のセルを表示するマクロを組みたいのですが、検索する文字(数値)はE1に、検索結果はK1に表示するようにするにはどのようにしたらいいでしょうか? Sub FIND_DATA1() ' FIND_DATA1 Macro ' マクロ記録日 : 2006/9/1 ユーザー名 : ' Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole).Activate End Sub Sub Data_Find3() Dim 対象セル As Range Dim 最初のセル番地 As String Dim 検索件数 As Long Cells.Interior.ColorIndex = xlNone If Range("E1").Value = "" Then Exit Sub End If Set 対象セル = Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole) 最初のセル番地 = 対象セル.Address Do 対象セル.Interior.ColorIndex = 37 検索件数 = 検索件数 + 1 Set 対象セル = Cells.FindNext(対象セル) Loop While 対象セル.Address <> 最初のセル番地 MsgBox "検索件数は" & 検索件数 - 1 & " 件です" End Sub 本を見たり調べたりでここまでできたんですがこれだと検索件数、検索結果が色付きになるだけで使い勝手がいまいちです。 よろしくお願いします。

  • 【至急助けて下さい!!】VBAでのIF関数挿入

    VBA初心者です。上級者の方助けてください。 VBAで入力セルを消去後、IF関数をN列に挿入したいです。 挿入したいIF関数のところが解決できればあとの記述はなんとかなります。 ■挿入したいIF関数 =IF(M4=$Y$5,$Z$9,IF(M4=$Y$6,$Z$9,IF(M4=$Y$7,$Z$9,IF(M4=$Y$8,$Z$6,IF(M4=$Y$9,$Z$10,IF(M4=$Y$10,$Z$9,IF(M4=$Y$14,$Z$7,IF(M4=$Y$15,$Z$8,"")))))))) 他関数は下記構文でうまくいくのですが、 IF関数はどのように記述したらよろしいでしょうか。 ■他 ws.Cells(i, jig_col).Value = "=VLOOKUP(F" & i & ",Sheet1!$A$2:$C$358,2,0)" ■現在の記述 Dim ws As Worksheet Dim endrow As Long Dim endcol As Long Dim you_col As Integer Dim gak_col As Integer Dim jig_col As Integer Dim bc_col As Integer Dim chg_col As Integer Dim i As Long '確認メッセージを表示し、「NO」の場合は処理を行わない If MsgBox("入力されている内容をクリアします。よろしいですか?", vbYesNo) = vbNo Then Exit Sub End If '画面の更新を行わない Application.ScreenUpdating = False Set ws = ThisWorkbook.Sheets("シンフォームイレギュラー運用状況") '呼び出し元シートの最終行、最終列を取得する endrow = ws.Cells(ws.Rows.Count, 6).End(xlUp).Row endcol = ws.Cells.Find(What:="変更フラグ", LookIn:=xlValues, LookAt:=xlWhole).Column - 2 If endrow < 4 Then Exit Sub ws.Range(ws.Cells(4, 1), ws.Cells(endrow, endcol)).ClearContents you_col = ws.Cells.Find(What:="曜日", LookIn:=xlValues, LookAt:=xlWhole).Column gak_col = ws.Cells.Find(What:="学年", LookIn:=xlValues, LookAt:=xlWhole).Column jig_col = ws.Cells.Find(What:="事業所", LookIn:=xlValues, LookAt:=xlWhole).Column 'bc_col = endcol - 1 'chg_col = endcol For i = 4 To endrow ws.Cells(i, you_col).Value = "=B" & i ws.Cells(i, gak_col).Value = "=VLOOKUP(F" & i & ",Sheet1!$A$2:$C$358,3,0)" ws.Cells(i, jig_col).Value = "=VLOOKUP(F" & i & ",Sheet1!$A$2:$C$358,2,0)" 'ws.Cells(i, bc_col).Value = "=IFERROR(MID(H" & i & ",LEN(H" & i & ")-1,1), "")" 'ws.Cells(i, chg_col).Value = 0 ws.Range("W" & i).Value = 0 Next '画面の更新を行う Application.ScreenUpdating = True End Sub

  • VBA 400エラー 1004エラー

    以下のVBAはセルのカット&ペーストをしたり、置換をするプログラムです。 しかし、EXCEL2003であれば通常に動作するのですが、 EXCEL2000だと400エラーや1004エラーが出てしまいます。 原因を探求するもよく分からなかったため、ご教示いただけば幸いです。 Sub 一ページ17名標準() Application.ScreenUpdating = False ActiveSheet.Unprotect Range("A1").Select Cells.Find(What:="No.2").Offset(-1, 36).Resize(3, 8).Insert Shift:=xlDown Cells.Find(What:="No.2").Offset(-1, 2).Resize(3, 1).EntireRow.Delete Rows("2:61").RowHeight = 21.75 '''行の幅 変更点 Cells.Find(What:="No.1").Offset(-1, 2).Resize(3, 1).EntireRow.Copy Range("38:38").Insert '''No2見出し挿入カ所 変更点 Range("A39").Replace What:="No.1", Replacement:="No.2" '''No1→No2置換カ所 変更点 Cells.Find(What:="No.2").Offset(-1, 36).Resize(3, 8).Delete Shift:=xlUp Cells.Find(What:="♯管理欄").Resize(3, 8).Activate ' ' '名字のエクセル関数の調整(全共通) Selection.Cut Range("AK63").Select Selection.Insert Shift:=xlDown Cells.Find(What:="♯管理欄").Resize(3, 8).Activate Selection.Cut Range("AK38:AS40").Select Selection.Insert Shift:=xlDown Range("A1").Select ActiveSheet.Protect Application.ScreenUpdating = True End Sub 宜しくお願いします。

専門家に質問してみよう