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

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

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

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

Q&A

解決済

1回答

738閲覧

Excel VBAでデータベースを元に列に値を埋めるやり方

SnowBallEffect

総合スコア28

VBA

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

0グッド

1クリップ

投稿2021/04/09 03:55

編集2021/04/09 08:46

データベースのシートがあります。A列はデータタイプでB列はA列が属するグループです。

シート名 "Database"

AB
あ-1
あ-2
あ-3
あ-4
い-1
い-2
い-3
う-1
う-2
う-3

次にTableというシートにデータ表があります。今のところは列A,B,Cにしかデータは存在していなく、D列とE列はシートDatabaseをもとに埋めていきたいです。A列はデータタイプ、B列はブロックナンバー、C列はデータの値です。D列はA列のグループでE列はC列のデータの値の合計です。

シート名 "Table"

| A | B | C |D|E |:---- |:------:| -----:| -----:| -----:| | あ-1 | Block 1 | 50 || | あ-2 | Block 1 | 10 || | あ-3 | Block 1 | 35 || | い-1 | Block 1 | 45 || | う-1 | Block 1 | 15 || | い-2 | Block 1 | 5 || | あ-4 | Block 1 | 50 || | | Block 1 Total | 210 |

私は下記の表のように結果を出したいです。D列のグループの合計はそのグループが最初にあるデータと同じ列に並ばないとなりません。例えばあ-1はあグループの最初のデータなので、「あ」のグループの合計はあ-1と同じ行にこないといけません。あと、たまにA列のデータは順番に並んでいません。例えば、下記のようにい-2はう-1の後に来ます。あと、B列は必ずブロックの最後に合計が出てきます。

ABCDE
X-1Block 150X145
X-2Block 110
X-3Block 135
Y-1Block 145Y50
Z-1Block 115Z15
Y-2Block 15
X-4Block 150
Block 1 Total210
X-1Block 210X80
X-2Block 270
Y-1Block 215Y20
Y-2Block 25
Z-1Block 2100Z600
Z-2Block 2200
Z-3Block 2300
Block 2 Total700

今までのマクロはこんな感じです。

VBA

1 2 Dim lastrow As Integer 3 Dim cell As Range 4 Dim i, x, As Integer 5 Dim NumRows As Integer 6 7 Table_lastrow = Worksheets("Table").Range("A" & Rows.Count).End(xlUp).Row 8 Database_lastrow = Worksheets("Database").Range("A2").End(xlDown).Row 9 10 For i = Table_lastrow To 2 Step -1 11 12 FundName_T = Worksheets("Table").Range("A" & i).Value 13 14 For x = 2 To Database_lastrow 15 FundName_D = Worksheets("Database").Range("A" & x).Value 16 17 If Cells(i, "A") <> "" And FundName_T = FundName_D Then 18 GroupName = Worksheets("Database").Range("B" & x).Value 19 Cells(i, "D") = GroupName 20 21 End If 22 23 Next x 24 Next i 25

上記のマクロだとこのような結果になります。

ABCDE
X-1Block 210X
X-2Block 270X
Y-1Block 215Y
Y-2Block 25Y
Z-1Block 2100Z
Z-2Block 2200Z
Z-3Block 2300Z
Block 2 Total700

どうすれば、D列とE列を埋めることができますでしょうか?
困っています。。。どなたか分かる方がいればご教示お願いできますでしょうか?

宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

たとえばこんな感じでどうでしょう。

VBA

1Sub sample() 2 3 Dim dic 'As Scripting.Dictionary 4 Set dic = CreateObject("Scripting.Dictionary") 5 6 Dim c As Range 7 For Each c In Sheets("Database").UsedRange.Resize(, 1) 8 dic(c.Value) = c.Offset(, 1).Value 9 Next 10 11 Dim rng As Range, arr As Variant, maxRow As Long 12 Set rng = Sheets("Table").UsedRange.Resize(, 5) 13 arr = rng.Value 14 maxRow = UBound(arr, 1) 15 16 Dim i 17 For i = 1 To maxRow 18 arr(i, 4) = dic.Item(arr(i, 1)) 19 Next 20 rng.Value = arr 21 22 For i = 1 To maxRow 23 arr(i, 5) = WorksheetFunction.SumIfs(rng.Columns(3), rng.Columns(4), arr(i, 4), rng.Columns(2), arr(i, 2)) 24 Next 25 rng.Value = arr 26 27 For i = 1 To maxRow 28 If arr(i, 4) <> "" And WorksheetFunction.CountIfs(rng.Resize(i).Columns(2), arr(i, 2), rng.Resize(i).Columns(4), arr(i, 4)) = 1 Then 29 Else 30 arr(i, 4) = "" 31 arr(i, 5) = "" 32 End If 33 Next 34 rng.Value = arr 35End Sub 36

投稿2021/04/09 10:29

jinoji

総合スコア4592

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

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

SnowBallEffect

2021/04/12 02:13

返信が遅れて申し訳ありません。すごいです!まさしく、これがやりたかったのです。jinojiさんが書いて頂いたコードを1時間くらいかけてようやく何が起きているのか分かりました。辞書機能があったこと知らなかったので、今回は非常に勉強になりました。本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問