質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

836閲覧

VBA 数式の挿入について

sum724

総合スコア2

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/01/23 10:08

編集2021/01/23 12:25

前提・実現したいこと

CSVファイルからデータをExcelに取り込み、条件に合うデータの個数を集計するマクロを作成したいと考えています。

発生している問題・エラーメッセージ

現在はデータの個数の集計結果を表示する(図の9~11行目)ようなコードにしていますが、 図の赤枠内を変更したら変更が反映されるように、countifの数式が入るようにしたいのです。 調べてみると「Formula」を使うといいことは分かったのですが、コードの記述につまずいて おります。宜しくお願い致します。

イメージ説明

該当のソースコード

現在のコードを以下に記します。 Sub 考課取込() Dim fname As Variant Dim wb As Workbook Dim sh As Worksheet Dim r As Long Dim rng As Range fname = Application.GetOpenFilename("CSVファイル(*.csv),*.csv", MultiSelect:=False) If VarType(fname) = vbBoolean Then Exit Sub Application.ScreenUpdating = False With Worksheets("Sheet1") Set wb = Workbooks.Open(fname) Set sh = wb.Worksheets(1) For r = 1 To sh.Cells(Rows.Count, 1).End(xlUp).Row .Cells(r + 1, 1).Resize(, 2).Value = sh.Cells(r, 6).Resize(, 2).Value .Cells(r + 1, 3).Resize(, 3).Value = sh.Cells(r, 30).Resize(, 3).Value Next r wb.Close .Cells(r + 2, 2).HorizontalAlignment = xlCenter .Cells(r + 2, 2).Interior.Color = RGB(255, 242, 204) .Cells(r + 2, 2).Value = "A" Set rng = .Range("C2:C" & .Cells(Rows.Count, 3).End(xlUp).Row) .Cells(r + 2, 3).HorizontalAlignment = xlCenter .Cells(r + 2, 3).Interior.Color = RGB(255, 242, 204) .Cells(r + 2, 3).Value = WorksheetFunction.CountIf(rng, "A") Set rng = .Range("D2:D" & .Cells(Rows.Count, 4).End(xlUp).Row) .Cells(r + 2, 4).HorizontalAlignment = xlCenter .Cells(r + 2, 4).Interior.Color = RGB(255, 242, 204) .Cells(r + 2, 4).Value = WorksheetFunction.CountIf(rng, "A") Set rng = .Range("E2:E" & .Cells(Rows.Count, 5).End(xlUp).Row) .Cells(r + 2, 5).HorizontalAlignment = xlCenter .Cells(r + 2, 5).Interior.Color = RGB(255, 242, 204) .Cells(r + 2, 5).Value = WorksheetFunction.CountIf(rng, "A") (以下省略)

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

特定のセル範囲が変更されたときに処理を実行するのように、C2:E7の範囲が編加工されたときに、再集計するようにWorksheet_change()イベントに集計コードを埋め込めばできるでしょう。

投稿2021/01/23 13:09

seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sum724

2021/01/23 14:56

教えていただきありがとうございます。こんな方法もあるのですね。勉強になります。 一点お聞きしたいのは、その都度行数が変わる場合でも、この方法は有効なのでしょうか。今回はたまたま5人ですが、10人だったり100人だったりもするので、どのように範囲を特定したらよいでしょうか。 列数が変わることはありません。
seastar3

2021/01/24 09:16

質問については、始めから反応範囲を広くとっておくか、 end(xldown)やend(xltoright)で調べたデータ範囲を反映して、activecellの座標が所定の範囲にあるかを判定してから、ふさわしい範囲で WorksheetFunction.CountIf()関数を働かせると実現可能です。
sum724

2021/01/25 00:11

ご回答いただきありがとうございます。返信が遅くなってしまい申し訳ありません。 なるほど...いろんなやり方があるのですね!ネットでもいろいろ検索してはいるのですが、素人なもので、文字の羅列を見るだけでげんなりしています...。この方法でも試してみたいと思います! ありがとうございました。
guest

0

ベストアンサー

現状のコードが結果が正しく表示されているのなら、

vba

1.Cells(r + 2, 3).Value = WorksheetFunction.CountIf(rng, "A")

上記のコードを下記に変更するだけです。

vba

1.Cells(r + 2, 3).Formula= "=COUNTIF(" & rng.Address & ", ""A"")"

以降の WorksheetFunction.CountIf の部分も上記のように変更してください。


下記のように一気に書式と数式を設定することもできます。

vba

1'省略 2 3 With Worksheets("Sheet1") 4 5'省略 6 7 With .Cells(r + 2, 2).Resize(3, 4) 8 .HorizontalAlignment = xlCenter 9 .Rows(1).Interior.Color = RGB(255, 242, 204) 10 .Rows(2).Interior.Color = RGB(204, 255, 242) 11 .Rows(3).Interior.Color = RGB(242, 204, 255) 12 .Cells(1, 1).Value = "A" 13 .Cells(2, 1).Value = "B" 14 .Cells(3, 1).Value = "C" 15 .Offset(, 1).Resize(, 3).Formula = "=COUNTIF(C$3:C$" & r & ",$B" & r + 2 & ")" 16 End With 17 End With

矩形セル範囲に数式を設定する場合、左上のセルの数式を Formula に設定すると、右と左にオートフィルしたのと同様に数式が変換されて設定されます。

投稿2021/01/24 02:58

編集2021/01/24 03:50
hatena19

総合スコア33729

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sum724

2021/01/24 23:26

ご回答いただきありがとうございます。返信が遅くなってしまい申し訳ありません。 コードを変更する方法、書式と数式を一気に設定する方法、両方試してみました。どちらも自分の思い通りのものができ、思わず「お~」と声を上げてしまいました! VBAは素人なのでだらだら書いてしまいがちですが、こうして一気に設定できるとすっきりしていいですね。大変助かりました。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問