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

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

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

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

マクロ

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

Q&A

3回答

774閲覧

セルの結合等の書式がファイルごとに異なる場合の一覧表用の集計マクロ

anindo_fu

総合スコア7

VBA

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

マクロ

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

0グッド

0クリップ

投稿2020/01/14 04:55

イメージ説明

図のようなデータがexcelで複数存在する時に、指定の項目について抜き出し、
一覧表を作りたいと考えています。ただし、excelには以下のような特徴があります。

①項目ごとにセルが結合されている場合がある(図のように果物は2列、値段は1列等)

②①はexcelによって結合されているセル数が異なる(別のファイルでは果物は1列、値段は2列のものある)

③抽出セルの位置がファイルによって異なる(ファイルごとに項目名の始まるセルが異なる)

以上のような条件の時に、「果物」と「金額」だけを抽出できるようなマクロはどのように組めばよいでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

イメージ説明

こんな感じになっているとき、

ExcelVBA

1Sub 集積() 2 抽出 Workbooks("Book1").Sheets(1).UsedRange 3 抽出 Workbooks("Book2").Sheets(1).UsedRange 4End Sub 5 6Sub 抽出(ByRef pRng As Range) 7 Dim rngCopyFrom As Range 8 Dim rngCopyTo As Range 9 10 With ThisWorkbook 11 Set rngCopyFrom = .Sheets("Sheet2").Range("A1:B1") 12 With .Sheets("Sheet1") 13 Set rngCopyTo = .Cells(.Rows.Count, "A").End(xlUp).Offset(1) 14 End With 15 End With 16 17 pRng.AdvancedFilter xlFilterCopy, , rngCopyFrom 18 Set rngCopyFrom = rngCopyFrom.CurrentRegion.Offset(1) 19 rngCopyFrom.Copy rngCopyTo 20End Sub

こんな感じで、
フィルターオプションの機能で各対象ブックから抽出できそう。

列方向の結合は気にしなくてよさそう。

投稿2020/01/15 03:31

mattuwan

総合スコア2136

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

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

0

結合セルではデータは一番左上のセルに格納されていて、他のセルは空欄になります。
つまり途中に空欄があるデータのあつまりということなので、結合セルということを特別意識する必要はなくコーディングできます。

例えば下記のような感じです。セルが結合されても、されてなくても同じコードでOKです。

vba

1Public Sub Sample() 2 Dim FruitRng As Range 3 Set FruitRng = Range("1:1").Find("果物") 4 If FruitRng Is Nothing Then Exit Sub 5 6 Dim AmountRng As Range 7 Set AmountRng = Range("1:1").Find("金額") 8 If AmountRng Is Nothing Then Exit Sub 9 10 Debug.Print "果物は" & FruitRng.Column & "列目です" 11 Debug.Print "金額は" & AmountRng.Column & "列目です" 12 13 Do 14 Set FruitRng = FruitRng.Offset(1) 15 Set AmountRng = AmountRng.Offset(1) 16 If FruitRng.Value = "" Then Exit Do 17 Debug.Print FruitRng.Value & "の金額は" & AmountRng.Value 18 Loop 19End Sub 20

投稿2020/01/14 07:04

hatena19

総合スコア33715

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

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

0

①項目ごとにセルが結合されている場合がある(図のように果物は2列、値段は1列等)
②①はexcelによって結合されているセル数が異なる(別のファイルでは果物は1列、値段は2列のものある)

MergeArea.Item(1)を参照することで、結合セル数にかかわらず値を取得することができます。

VBA

1Debug.Print Range("A2").MergeArea.Item(1).Value 2Debug.Print Range("D2").MergeArea.Item(1).Value

③抽出セルの位置がファイルによって異なる(ファイルごとに項目名の始まるセルが異なる)

簡易に対応するのであれば、位置を固定値で指定することになると思います。

VBA

1' ファイル1の個数 2Debug.Print wb1.Worksheets(1).Range("D2").MergeArea.Item(1).Value 3' ファイル2の個数 4Debug.Print wb2.Worksheets(1).Range("E2").MergeArea.Item(1).Value

集計対象のファイルがランダムで毎回決まったファイルを使用しなかったり、毎回書式が違っていたりする場合は、Find関数などで場所を探すことになるかと思いますが、面倒なのでサンプルはなし。
但しこの場合はヘッダーの文言は全ファイル統一されている必要があります。

投稿2020/01/14 05:42

編集2020/01/14 06:02
ttyp03

総合スコア16998

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問