• ベストアンサー

excel VBAで計算式を入力したい

下記の計算式をVBAから入力したいのですが、うまくいきません。 =SUMPRODUCT((稼動データ!F2:F89="C")*(稼動データ!E2:E89={49,65,66,67,68,70,73,74,93,8106,8169,8192,8194,8561})*稼動データ!I2:I89) 文字列は、""で囲むのは判っているのですが。。。 いくつか試しましたがうまくいきません。 Range("M43").Formula = の後にどのような式を入力すればうまくいきますか? よろしくお願いします。

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

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

こんにちは。 #1さんの回答で間違いありませんが、単に、それは、「F2:F89="C"」の"C" が違っているだけです。 一応、A1型で書いておきます。 Range("M43").Formula = "=SUMPRODUCT((稼動データ!F2:F89=""C"")*(稼動データ!E2:E89={49,65,66,67,68,70,73,74,93,8106,8169,8192,8194,8561})*稼動データ!I2:I89)" とすればよいです。 なお、複雑な配列数式を行うなら、マクロ自体で計算をさせたほうが良いです。配列数式は、ワークシートのメモリを消費しますから、数が多くなると、不都合が出てくることもあります。

makekin
質問者

お礼

Wendy02さん。 前にも私の質問に回答していただいたことがありますが、いつも勉強になります。 > Range("M43").Formula = "=SUMPRODUCT((稼動データ!F2:F89=""C"")*(稼動データ!E2:E89={49,65,66,67,68,70,73,74,93,8106,8169,8192,8194,8561})*稼動データ!I2:I89)" マクロの記録では、A1型にはならないため上記回答ですっきりしました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

#3の回答者です。 普通は、以下のような内容のマクロは書かずに、ひとつの列に対して、Offset で処理しますが、あえて、分かりやすくするために、範囲を3つに分けて、数式をマクロに置き換えてみました。 Sub Test2()   '=SUMPRODUCT((稼動データ!F2:F89=""C"")*(稼動データ!E2:E89={49,65,66,67,68,70,73,74,93,8106,8169,8192,8194,8561})*稼動データ!I2:I89)"   Dim rng1 As Range   Dim rng2 As Range   Dim rng3 As Range   Dim i As Long   Dim arData As Variant   Dim Ret As Variant   Dim dblSum As Double   With Worksheets("稼動データ")   arData = Array(9, 65, 66, 67, 68, 70, 73, 74, 93, 8106, 8169, 8192, 8194, 8561)   Set rng1 = .Range("F2:F89") '1列のこと   Set rng2 = .Range("E2:E89")   Set rng3 = .Range("I2:I89")   For i = 1 To rng1.Rows.Count    If rng1.Cells(i, 1).Value = "C" Then      Ret = Application.Match(rng2.Cells(i, 1).Value, arData, 0)     If IsNumeric(Ret) Then      dblSum = dblSum + rng3.Cells(i, 1).Value     End If    End If   Next i     .Range("M43").Value = dblSum   End With   Set rng1 = Nothing: Set rng2 = Nothing: Set rng3 = Nothing End Sub

makekin
質問者

お礼

判りやすく説明していただいたのですが、理解に時間がかかりそうです。じっくり理解していきたいと思います。 今回もありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#64582
noname#64582
回答No.2

私も同様に困ったことがあります。 いろいろ調べまわった結果、 VBAで、Sumproduct を通常の使用法(積の和)として使う以外は、Evaluate というのを使う、ということがわかり、これで解決しました。 ご質問のケースも、複数条件を満たすものの合計という使い方だと思われますので該当するのではないでしょうか。 以下URLの、回答(■12034)にありました。 http://hpcgi1.nifty.com/kenzo30/b_cbbs/cbbs.cgi?mode=al2&namber=12033&rev=&no=0&P=R&KLOG=77

makekin
質問者

お礼

> Evaluate というのを使う、ということがわかり、これで解決しました。 Evaluateメソッドは知っていたのですが、計算式では無く値が入力されてしまう為使ってませんでした。 回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • deecyan
  • ベストアンサー率38% (89/233)
回答No.1

" で囲まれた" は "" と書きます。 多分これが出来てないとおもいます。   わからなかったら ツール→マクロ→新しいマクロの記録で その式をいれてみたらいいです 下記の様に記録されているので そこをちょこちょこっと変えましょう ActiveCell.FormulaR1C1 = _ "=SUMPRODUCT((稼動データ!R[-8]C[2]:R[79]C[2]=""C"")*(稼動データ!R[-8]C[1]:R[79]C[1]={49,65,66,67,68,70,73,74,93,8106,8169,8192,8194,8561})*稼動データ!R[-8]C[5]:R[79]C[5])"

makekin
質問者

お礼

> わからなかったら > ツール→マクロ→新しいマクロの記録で > その式をいれてみたらいいです そうですよね。一番手っ取り早いかもしれません。すっかり忘れていました。 回答ありがとうございます。助かりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAにて計算式を入力したい

    VBAにてマクロ作成中です。 下記の計算式をマクロから入力したいのですが、 どのような式になりますでしょうか? =SUM(SUMIF(稼動データ!F2:F89,{"D","F"},稼動データ!I2:I89)) R1C1形式だと、下記でうまくいくのですが。。 Range("G42").FormulaR1C1 = _ "=SUM(SUMIF(稼動データ!R[-40]C[-1]:R[47]C[-1],{" & """D"",""F""" & "},稼動データ!R[-40]C[2]:R[47]C[2]))"

  • エクセル計算式、VBAについて

    エクセル計算式、VBAについて 下記質問の続きでございます。 http://okwave.jp/qa/q5871637.html 先日の質問にて表もうまく完成したかに見えたのですが、 何度か動作確認のテストをしているうちに、少しおかしな点が出てきました。 下記のURLにある表を見ていただきたいのですが、 加工前の状態から、下記のVBAを実行して、別シートへ加工後の形に出力しました。 ※質問文に直接画像を貼りたかったのですが、どういうわけか出来なかったので、 画像URLでのご説明になることをお許し下さい。 ※「加工前」 http://f58.aaa.livedoor.jp/~works/4.jpg ※VBAの内容 Sub ボタン1_Click() With Sheets("加工後") .Range("2:65536").ClearContents For i = 2 To Range("A65536").End(xlUp).Row For j = 1 To Range("D" & i).Value GYOU = .Range("A65536").End(xlUp).Row + 1 .Range("A" & GYOU).Value = Range("A" & i).Value .Range("B" & GYOU).Value = Range("B" & i).Value .Range("C" & GYOU).Value = Range("C" & i).Value .Range("D" & GYOU).Value = Range("D" & i).Value .Range("E" & GYOU).Value = j .Range("F" & GYOU).Value = "111-1111-" & Right("1111" & (i - 1), 4) .Range("G" & GYOU).Value = GYOU - 1 .Range("H" & GYOU).FormulaR1C1 = _ "=MIN(RC[-5],RC[-6]-SUMIF(R1C[-2]:R[-1]C[-2],RC[-2],R1C[-5]:R[-1]C[-5]))" Next j Next i End With End Sub ※「加工後」 http://f58.aaa.livedoor.jp/~works/1.jpg 加工後の結果でおかしいのが、「箱内数量」です。 目立つようにピンクと黄色で色分けしました。 H9とH10 は箱内数量が正しい数値ですが、 H18とH19は本来、H18=50、H19=40 とならなければなりません。 さらに、H22:H24も、H22=50、H23=50、H24=20 となってほしいのです。 ”加工前” シートのH列には下記の計算式が入っており、H列下方へ相対参照にて計算式をコピーしています。 =MIN(INDEX(C:C,MATCH(F2,F:F,0)),INDEX(B:B,MATCH(F2,F:F,0))-(ROW()-MATCH(F2,F:F,0))*INDEX(C:C,MATCH(F2,F:F,0))) ”加工後” シートのH列には事前には何も計算式が入ってませんが、VBAを実行することにより、下記の計算式が入り、H列下方へ相対参照にて計算式がコピーされています。 =MIN(C2,B2-SUMIF(F$1:F1,F2,C$1:C1)) なぜうまく結果が出るところと、出ないところがあるのか分かりません。 正常な結果を求めるには、どこを修正すればよろしいでしょうか?

  • excel vbaの関数の使い方

    excel VBAでsumproduct関数を使いたいがでますのですがどうしても実行できません 何が原因でしょうか、どなたか教えてください。 ------------------------------------------------- 下記コードは実行できます。 Worksheets("集計").Range("j4").Value = WorksheetFunction.Sum(Worksheets("日常").Range("h4:h13")) 下記コードは型が違うとのコメントがでます。 Worksheets("集計").Range("j4").Value = WorksheetFunction.SumProduct((Worksheets("日常").Range("c4:c13") >= j2) * Worksheets("日常").Range("c4:c13") <= k2) * Worksheets("日常").Range("d4:d13") = l2 * Worksheets("日常").Range("f4:f13") = m2 * Worksheets("日常").Range("h4:h13") --------------------------------------------------------------------- ワークシートは、日常、集計、の二つがあります。 「日常」には、C4:H13にデータがあります。 c列に年月日、d列にコード番号、e列に購入箇所、f列にコード番号、g列に商品、h列に金額 が入力されています。 「集計」には、j2に開始日、k2に終了日、l2にd列のコード番号、m2にf列のコード番号、 が入力されています。 環境は、windows10 使用しています。 ----------------------------------------------------------- 以上の状況ですがvba でsumproduct関数を使いたいのですが実「実行」できません,たかどなたか教えて頂けませんか。

  • エクセルのVBAで簡潔に表示させたいのですが、知恵を貸してください。

    エクセルのVBAで簡潔に表示させたいのですが、知恵を貸してください。 エクセルのVBAで現在、下記のような指示をしています。 メンテナンスが困難なため、簡潔に記載する方法または関数を教えていただけないでしょうか。 activesheet.range("c2")= "=sumproduct(('[nen.xls]1'!c4)*1)" activesheet.range("d2")= "=sumproduct(('[nen.xls]1'!d4)*1)" activesheet.range("e2")= "=sumproduct(('[nen.xls]1'!e4)*1)" activesheet.range("f2")= "=sumproduct(('[nen.xls]1'!f4)*1)" activesheet.range("g2")= "=sumproduct(('[nen.xls]1'!g4)*1)" activesheet.range("c3")= "=sumproduct(('[nen.xls]1'!c5)*1)" activesheet.range("d3")= "=sumproduct(('[nen.xls]1'!d5)*1)" activesheet.range("e3")= "=sumproduct(('[nen.xls]1'!e5)*1)" activesheet.range("f3")= "=sumproduct(('[nen.xls]1'!f5)*1)" activesheet.range("g3")= "=sumproduct(('[nen.xls]1'!g5)*1)" activesheet.range("c4")= "=sumproduct(('[nen.xls]1'!c6)*1)" activesheet.range("d4")= "=sumproduct(('[nen.xls]1'!d6)*1)" activesheet.range("e4")= "=sumproduct(('[nen.xls]1'!e6)*1)" activesheet.range("f4")= "=sumproduct(('[nen.xls]1'!f6)*1)" activesheet.range("g4")= "=sumproduct(('[nen.xls]1'!g6)*1)" ・ ・ このパターンを全部で50回ほど繰り返します。 ・ ・  この繰り返し作業を簡単な記述に変更したいのですが、できません。  お知恵をお貸しください。よろしくお願いいたします。

  • Excel VBA の構文を教えてください。

    Excelにて、I列に分類条件が、”決", "D", "E*〇", E*△", 4種類あります。 (空白行もあり)計算済み数値がCP 列以降EO列まで記載されています。 セルCP2 (決+D+E*〇+E*△) 合計 セルCP5 (決+D) 合計 セルCP2 (決+D+E*△) 合計 JA2からJA18まで一旦、保存しています。 これをCP列からEO 列まで計算したいのですが、添付のようなVBAになってしまいました。 元データの加工によっては、行列が違ってくる事もあります。 VBA でシンプルに作成可能でしょうか?また、何となくExcel 関数でも簡単な方法がありましたら、 ご教授願います。(VBA初心者です)よろしくお願いします。 Sub 集計条件に一致した数値の合計() 'CP列 Range("JA2") = WorksheetFunction.SumIf(Range("I:I"), "決", Range("CP:CP")) Range("JB2") = WorksheetFunction.SumIf(Range("I:I"), "D", Range("CP:CP")) Range("JC2") = WorksheetFunction.SumIf(Range("I:I"), "E*○", Range("CP:CP")) Range("JD2") = WorksheetFunction.SumIf(Range("I:I"), "E*△", Range("CP:CP")) Range("CP2") = WorksheetFunction.Sum(Range("JA2:JD2")) Range("CP5") = WorksheetFunction.Sum(Range("JA2:JB2")) Range("CP6") = WorksheetFunction.Sum(Range("JA2:JC2")) 'CQ も同様に I列を検索して、 CQ列にある数値を一旦保存して、 CQ2 CQ5 CQ6 に結果を表示する

  • VBAで文字と数値のセルを計算したい

    EXCEL2000でVBA作成中です。  以下のコードで計算式を入れています。 セルの値が0のときは、セルの値を表示しないようにしています。 ところが印刷すると0が表示されてしまいます。 Range("F18").Formula = "=if(+G18>0,""朝"","""")" Range("h18").Formula = "=if(+I18>0,""昼"","""")" Range("J18").Formula = "=if(+K18>0,""夕"","""")" Range("G18").Formula = "=IF(COUNTIF(Q18:AB19, "" 朝"")=0,0,COUNTIF(Q18:AB19, ""朝""))" Range("I18").Formula = "=IF(COUNTIF(Q18:AB19, "" 昼"")=0,0,COUNTIF(Q18:AB19, ""昼""))" Range("K18").Formula = "=IF(COUNTIF(Q18:AB19, "" 夕"")=0,0,COUNTIF(Q18:AB19, ""夕""))" Range("L18").Formula = "=-(+G18*300+I18*350+K18* 400)" そこで Range("G18").Formula = "=IF(COUNTIF(Q18:AB19, "" 朝"")=0,"""",COUNTIF(Q18:AB19, ""朝""))" とすると、L18にエラーが出て計算してくれません。 ゼロを非表示にしてしかも計算させるようにするには どうしたらよろしいか。

  • EXCEL VBA Worksheet_Chang

    お世話になります。 EXCEL VBAで 以下の処理をしています。 C6の内容に応じて、セルに式を設定するだけなのですが このシートの全然関係ないセルで[Delete]キーを押下した際に 実行時エラー 13 型が一致しません というエラーが発生します。 どういう理由でエラーとなるのでしょうか? また、どのような対処をすればいいでしょうか? 以下、実際のコードです Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("C6") Then If Range("C6").Value = "する" Then Range("I11").Formula = "=C7" Range("I12").Formula = "=C7" Range("I13").Formula = "=C7" Range("I14").Formula = "=C7" Range("J11").Formula = "=C8" Range("J12").Formula = "=C8" Range("J13").Formula = "=C8" Range("J14").Formula = "=C8" Else Range("I11").Formula = "" Range("I12").Formula = "" Range("I13").Formula = "" Range("I14").Formula = "" Range("J11").Formula = "" Range("J12").Formula = "" Range("J13").Formula = "" Range("J14").Formula = "" End If Else End If End Sub

  • エクセルVBAについて教えてください。

    DSUMを使ってVBAで自動計算をさせたいのですがうまくいきません。  ・Sheetsデータにデータを置いていて、A1からU1610までデータが入ってます。  ・Sheets集計用は計算させるための(条件を入れる)シートで、A1からE列まで(選択する項目によって何行目になるかわかりません。)  ・mycountでE列のデータが入ってる行を出してます。  ・部屋タイプで1K~1LDKを選ぶとDSUMの式のタイプに1を入れたいのです。(1K~1LDKの場合はCells(1,3) 下記のように書いてみましたが上手くいきません。 どなたかご教授いただけると助かります。 mycount = "=COUNT(集計用!E2:E300)" Sheets("集計用").Cells(5, 7).Value = Range("g10") = " =DSUM(cells(データ!,1),1610,21),cells(データ!1,タイプ),cells(集計用!),cells(mycount,5))" '部屋タイプの選択 If Sheets("フォーム").Range("c30") = "1K~1LDK" then  タイプ = 3 ElseIf Sheets("フォーム").Range("c30") = "2K~2LDK" Then タイプ = 6 ElseIf Sheets("フォーム").Range("c30") = "3K~3LDK" Then  タイプ = 9 ElseIf Sheets("フォーム").Range("c30") = "4K~4LDK" Then タイプ = 12 Else Sheets("フォーム").Range("c30") = "その他" Then タイプ = 15 End If

  • Excel VBA の作り方について【初心者】

    Excel VBA の作り方について質問させてください。 A1セルに「営業部【山本】」と入力されています。 B1セルに「01:35:24」(タイム)と入力されています。 (1)D1セルに「山本」を抜き出して表示 (2)E1セルに「95」(分数)で表示 (3)A2以降で同じ作業の繰り返し(最終入力列まで) というVBAを作成しております。 Sub macro1() '行数確認 nr = Range("A1048576").End(xlUp).Row For i = 1 To nr '名前抜き出し x = Range("A1").Offset(i - 1) j1 = InStr(x, "【") j2 = InStr(x, "】") Range("D1").Offset(i - 1) = Mid(x, j1 + 1, j2 - j1 - 1) '分表示 x = Range("B1").Offset(i - 1) Range("E1").Offset(i - 1) = Int(x * 24 * 60) Next i End Sub ここまではプログラムが完成しています。 この後、 (4)C列セルに入力されている数値をF列セルにそのまま入力 したい場合には、どの部分にどのようなプログラムを追加すればよいでしょうか? よろしくお願いします。

  • エクセル VBAで 再計算をコントロールしたい

    早速ですが。シートは ORGDATA と 計算 の2枚 ORGDATA は WEB経由で 秒単位で 7セルほどのデータを受信します。 それを、5分単位で データを集約し 7セルほどのデータとして、計算シートに コピーで 送ります。 計算シートは、生データは 7セルの 2万行 I列から BU列 50行?位数式が 埋まっています。 基本 ORGDATAシートは Worksheet_Calculate() で 受信しますので、計算を止められません。 で、計算シートの 再計算を止めて、データが送り込まれたとき(5分ピッチ)のみ 再計算させたい。 が リクエストです。 下記が やってみたことの要約です。 Workbook_Open() 5分タイマーセット Application.Calculation = xlCalculationAutomatic Me.Worksheets("計算").Select Me.Worksheets("計算").Activate ActiveSheet.EnableCalculation = False  これが機能してないような?タスクバーに再計算してる%表示が出ている。 Me.Worksheets("orgdata").Select データ受信、5分後のタイマーで endsisu = keisan.Cells(1000, 2).End(xlDown).Row + 1 orgdata.Range("a4:g4").Copy Destination:=keisan.Range("b" & endsisu) keisan.Range("i" & endsisu - 2 & ":bu" & endsisu - 2).Copy keisan.Range("i" & endsisu & ":bu" & endsisu).PasteSpecial Paste:=xlPasteFormulas ここまでは 実行される。 下記のどちらかで VBエラー400(タイマーで 実行しているから) keisan.Range("i" & endsisu - 2 & ":bu" & endsisu).Select Selection.Calculate 要は OREGDATAは 常時再計算ON 計算シートは 常時再計算OFFで データが送り込まれた時だけ 再計算で 済んだら OFF が希望なのですが。 ご教示願えれば助かります。

専門家に質問してみよう