- 締切済み
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 に結果を表示する
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- HohoPapa
- ベストアンサー率65% (455/693)
VBAを提示するのはやぶさかではないものの、 求めている仕様がよくわからないのです。 1)Excelにて、I列に分類条件が、”決", "D", "E*〇", E*△", 4種類あります。 2)(空白行もあり)計算済み数値がCP 列以降EO列まで記載されています。 3)セルCP2 (決+D+E*〇+E*△) 合計 4)セルCP5 (決+D) 合計 5)セルCP2 (決+D+E*△) 合計 6)JA2からJA18まで一旦、保存しています。 7)これをCP列からEO 列まで計算したいのですが、 8)添付のようなVBAになってしまいました。 ◆疑問1 上記5)の行は、 セルCP6 (決+D+E*△) 合計 の誤りですか? ◆疑問2 上記2)、CP 列以降EO列まで記載されています。 としている一方で、 上記3)、セルCP2 (決+D+E*〇+E*△) 合計 として計算していることから、 CP 列以降EO列までの列は、 データが1行目から埋まっているのではなく、 例えば、12行目からといった具合に、途中から始まっていますか? ならば、何行目から始まっていますでしょうか? また、列名(画像では、11行目)はありますか? ◆疑問3 上記6)、この行が意味不明です。 JA2からJD2の誤りですか? 画像で表現すると、添付のような結果を期待していますか? もし、添付画像の仕様でよければ、 VBAのコードをポストできると思います。 ◆疑問4 >元データの加工によっては、行列が違ってくる事もあります。 末尾の行が変動するんですね。 右端列も変動するものと思いますが、 1列全数が空欄の列もあるんでしょうか?
- Ultra-Hetare
- ベストアンサー率38% (204/526)
相当にわけのわからないコードですね、 特に添付の最初の4行が意味不明です。 そして、そもそも驚異的な横長の表を作成しているように見受けられます、 エクセルは縦に使用しましょう。 その上で、この作業の「要件」を 言っていただければ、ヒントくらいは提言出来るかも知れません。
補足
Ultra-Hetare さん、コメントありがとうございました。会社の業績データで、今期・来季・3年・5年の四半期毎の目標値が記載されているため横長のExcel になっています。 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")) この検索は、下記の様に For文にまとめる事ができました。 Dim i As Long For i = 1 To 4 Range("IZ2").Offset(, i) = WorksheetFunction.SumIf(Range("I:I"), Choose(i, "決", "D", "E*〇", "E*△"), Range("CP:CP")) Next i あとは、CP列~BD列で、I列の単独条件にある行の数値を求める「二重ループ」を試案しているのですが、うまい方法が見つかりません。
- imogasi
- ベストアンサー率27% (4737/17069)
回答者や質問・回答を見て勉強する人のために,もっと単純なデータ例にして説明してほしい。また文章でなく、少数行のシートデータ例にすること。これができてない質問者が多くて、読み解くのに時間が掛かる。 ーー 質問者の自分の実際の問題例ーーー>問題となる、重点を抽象化して問題を組み立てる。ーーー>その点を盛り込んで、問題例や質問文を書いて質問 ーーー>回答を自分の実際の場合に翻案して当てはめ この手法ができると、エクセルも、関数も、VBAも自分のレパートリーとなって上達すると思う。 === 参考に、小生は下記の例を作って、考えた。 間違い、漏れ、誤解の場合は、以下は無視して下さい。 ==== データ例 A1:C13 精勤名 コード 金額 a1 決 1 a2 D 2 a3 Eng 3 a4 Egy 4 a5 5 a6 AB 6 a7 決 7 a8 D 8 a9 Efgh 9 a10 Egy 10 a11 11 a12 AB 12 ーーー コード 度標準モジュールに Sub test01() s = 0 For i = 1 To 13 clnd = False '--- Select Case Cells(i, "B") Case "" cond = False Case "決" cond = True Case "D" cond = True Case Else End Select Select Case Mid(Cells(i, "B"), 1, 1) Case "E" cond = True End Select If cond = True Then ’MsgBox Cells(i, "B") s = s + Cells(i, "C") End If Next i Cells(15, "C") = s End Sub ーーー 結果 C15に 44 ===== 小生のコードは、Case文を使ったりして、長々しくて、実は気に食わない。 しかし、言い訳ですが、 (1)SUMIFsで。関数では複数該当条件でOR条件の場合、短い書き方を 小生は知らない(勉強不足かも)。 ワイルドカードなど使って、短くコードを書ければよいが。 (2)先頭の1文字の判定も、(正規表現などを「使うことをしないで) 行うことを知らない。 ので、上記のようなコードになってしまった・ (1)、(2)を覆す、回答が出れば、本回答は、無視してください。 ===== 最後に質問の中の表現、 E*〇+E*△の E*〇とE*△の違いは何だろう。読者の皆に判るのかな? 補足しておいてほしい。 「ワイルドカード」という言葉を知っているのかな? その点は小生は判ってないので、上記の回答の中には、その点は、盛り込めていないです。
補足
HohoPapaさん、ありがとうございました。 仕様の説明を再度、Excel VBA の構文を教えてください(2)に記載しました。 よろしくお願いします。