[[20050512183852]] 『VBA:ワークシート関数を使う時の { について』(EVO7) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA:ワークシート関数を使う時の { について』(EVO7)
 いつもお世話になります。
 今回の質問ですが、ワークシート上でSUMPRODUCT関数で作った式が
 =SUMPRODUCT((F2:F200={"2249","2257"})*(U2:U200))だと、
 計算結果は正しく出ます。
 しかし、VBAで下記のように記載すると、{ の部分でカーソルが反転して
 ”コンパイルエラー:不正な文字です”と表示されます。
 = Application.WorksheetFunction.SumProduct((Range("F2:F200")={"2249","2257"})*Range("U2:U200"))
 正しい記載方法はどうなるでしょうか?
 ご教授の程宜しく御願いします。
 (EVO7)


 代わりにSUMIF関数ではどうでしょうか。
 
Set MyRange1 = Range("F2:F200")
Set MyRange2 = Range("U2:U200")
 
With Application
    MyVal = .SumIf(MyRange1, "2249", MyRange2) _
            + .SumIf(MyRange1, "2257", MyRange2)
End With

 (川野鮎太郎)


 御回答ありがとう御座います。
 やはり { は使えないのですね。SumIfで代用したいと思います。
 一つ、VBAを設計するに当たりアドバイス頂けますでしょうか?
 上記の式の組み合わせが50通り近くありますが、"2249"などの
 コード番号は連番とは限りません。
 このような場合、上記の式をズラズラと50セット書くしかないでしょうか?
 若しくは50セット分をコピーして、コード番号部分だけをうまく(効率よく)
 置き換えする方法はあるでしょうか?
 良い方法があればお教え頂ければと思います。
 宜しく御願いします。
 (EVO7)


 こういうことでしょうか。
  
Sub Test()
Const CstMyFind As String = "2249 2257 2260 2275 2281" ←とりあえず5個にしてます。
 
MyFind = Split(CstMyFind)
Set MyRange1 = Range("F2:F200")
Set MyRange2 = Range("U2:U200")
 
With Application
    For MyCount = LBound(MyFind) To UBound(MyFind)
        MyVal = MyVal + .SumIf(MyRange1, MyFind(MyCount), MyRange2)
    Next MyCount
End With
    MsgBox "対象の合計は " & MyVal & " です。"
End Sub

 (川野鮎太郎) To ご近所さん Splitのコードお借りしました。

 名前登場につき足跡足跡。雑談失礼。
私も人のコードを借りまくってます。
その為のインターネットと言う仕組みだし、この掲示板の理念でしょうし、サクサクと使い倒してください。
私もコーディングの折、川野鮎太郎さんのコードを参考にさせてもらったりしてます。Midの使い方とか。
(ご近所PG)ご近所に改めようかしら


 お世話になります。
 教えて頂いたコードですが、標準モジュールに貼り付けて
 実行してみました。ところが、”コンパイルエラー:Sub又はFunctionが
 定義されていません”とエラーになり、Splitのところがカーソル反転してます。
 ヘルプをみるとウィンドウの分割が・・・となってるので別物の話かなと思いますが、
 何をチェックすればいいでしょうか?
 御願い致します。
 (EVO7)

 Excel VBA Split関数は2000からの対応だったと思いました。
ご使用のバージョンは??過去ログではExcel97となっていますが。
(みやほりん)


 あ゛っ・・・
 そうでしたか、対応は2000からですか・・・
 おっしゃる通り、使用中のバージョンは97です。
 となると、コードは使えないと・・・ 残念です。(T.T)
 (EVO7)


 調べてたら、すでにみやほりんさんからフォローが(^_^A;
 これでどうでしょうか。
 
Sub Test1()
 
CstMyFind = Array("2249", "2257", "2260", "2275", "2281")
 
Set MyRange1 = Range("F2:F200")
Set MyRange2 = Range("U2:U200")
 
With Application
    For MyCount = LBound(CstMyFind) To UBound(CstMyFind)
        MyVal = MyVal + .SumIf(MyRange1, CstMyFind(MyCount), MyRange2)
    Next MyCount
End With
    MsgBox "対象の合計は " & MyVal & " です。"
End Sub

 (川野鮎太郎)あ”PGが抜けてましたね(^_^A; ←ここだけ追加

 同じような事を昔話してたなぁと思って検索。
自作Split関数
[[20041122160517]] 『CSVファイルを取り込む』(ウメ坊) 
(ご近所PG)完全互換ではないけど

 >コード番号部分だけをうまく(効率よく)
 >置き換えする方法はあるでしょうか?
 セルに値を入力しておいてループしながら参照する。
  (INA)

 ↑それを作ってました(汗;;
 ↓「組み合わせ」ってこういうことだと理解したのですが、違ったかしらん?
Rem A列、B列が一組の文字列として"設定シート"A1:B1以下に記述されていると想定。
Rem 計算の対象はSheet1と想定。
Sub Test()
    Dim MyFindRng As Range
    Dim MySh As Worksheet
    Dim TagSh As Worksheet
        Set TagSh = Worksheets("Sheet1")
        With TagSh
            Set MyRange1 = .Range("F2:F200")
            Set MyRange2 = .Range("U2:U200")
        End With
        Set MySh = Worksheets("設定シート")
        With MySh
            Set MyFindRng = .Range(.Cells(1.1), .Cells(65536, 1).End(xlUp))
        End With

        With Application
            For Each C In MyFindRng
                MyVal = .SumIf(MyRange1, C.Value, MyRange2) + _
                        .SumIf(MyRange1, C.Offset(, 1).Value, MyRange2)
                MsgBox "対象の合計は " & MyVal & " です。"
            Next C
        End With
End Sub
(みやほりん)


 御回答ありがとう御座います。
 凄いですね!イメージ通りの結果でした。
 後は、得られた結果をシートに反映していくコードを
 追記して完成させたいと思います。
 御回答下さった皆様に感謝です。
 (EVO7)


 解決されたのなら良かったです。
 結局、「組み合わせ」とはどっちの意味だったのかは気になるところではありますけど(^_^A;

 (川野鮎太郎)


 組み合わせとは"2249"、"2257"等と二つのコードが検索の対象となり、
 合計を出す範囲がもう1列ある為「組み合わせ」という言葉を使いました。
 2列目の合計を出すコードは教えて頂いたコードに手を加えて完成しました。
 もっと分かり易く書ければよかったのですが、文章能力が足りず、すみませんでした。
 (EVO7)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.