[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.