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

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

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

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

Q&A

解決済

2回答

7668閲覧

VAB 結合セルとループ

eri___21

総合スコア12

VBA

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

0グッド

0クリップ

投稿2016/12/08 04:43

###前提・実現したいこと
| 2013 | 1 | 山田
| | 2 | 田中
| | 3 | 佐藤
| 2014 | 1 | 山田
| 2015 | 1 | 山田
| | |
| 2017 | 1 | 田中
| | 2 | 山田

上記のようなA列(年)、B列(番号)、C列(名前)があり、
A列は結合セルでB列とC列は単体のセルのときとします。
その際に、結合セルの分だけループして番号が一番大きい値を取得したいです。
2013の場合は、佐藤が取得され、2014年は山田が取得されるというものです。
また、上記以外で簡単に名前が取得できるのであれば他の方法でもかまいません。
よろしくお願いします。

###試したこと
結合ループの範囲を取得することや
名前を取得して下のセルが空もしくは番号が1でないときは(実現できず)など。

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

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

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

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

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

himakuma

2016/12/08 06:55

実際のコードを載せられますか?
guest

回答2

0

ベストアンサー

こんな感じでしょうか。

VBA

1Sub Test() 2 Dim count As Integer 3 Dim value As Integer 4 Dim name As String 5 Dim newValue As Integer 6 Dim r As range 7 8 Set r = Sheets("Sheet1").range("A1") 9 10 While count < 3 11 row = r.row 12 col = r.Column 13 14 If r(1, 1).value = "" Then 15 count = count + 1 16 Else 17 count = 0 18 value = 0 19 For Each c In r.MergeArea 20 newValue = c.Offset(0, 1).value 21 If value < newValue Then 22 value = newValue 23 name = c.Offset(0, 2).value 24 End If 25 Next c 26 r.Offset(0, 3).value = name 27 End If 28 29 30 Set r = r.Offset(1, 0) 31 Wend 32 33End Sub

これを実行すると次のように D 列に結果が表示されます。

イメージ説明

投稿2016/12/08 07:02

twyujiro15

総合スコア217

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

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

0

VBAを使う場合

今回はご自身で作成されたコードの提示がないのでサンプルコードの提示は控えさせていただきますが、以下のような処理手順で実現できると思います。

①変数iRowに1をセットしてループ処理開始 -iRowループ開始- ②iRow行のA列を取得し、結合行数を調べる (⇒ Cells(iRow, 1).MergeArea.Rows.Count で結合行数が取得できます) ・現在年度の開始行:iRow ・現在年度の終了行:iRow + 結合行数 -1 ・次年度の開始行 :iRow + 結合行数 ③現在年度の終了行から名前(C列)の値を取得します。 ④iRowに次年度の開始行をセットします。 ⑤iRowが最終行(8行目)を超えるまでループ継続 --iRowループここまで-- ⑥処理終了

VBAを使わない場合

今回の場合、B列に年度ごとの連番が用意されています。
この行を利用すればExcel関数とフィルター機能だけでも実現可能です。

①まず先頭に見出し列を追加します。(D列を最大行の計算用として使用します)

Year No Name Max 2013 1 山田 2 田中 3 佐藤 2014 1 山田 2015 1 山田 2017 1 田中 2 山田

②次に、D2セルに以下の計算式を記述します。
=IF(C2="","",IF(VALUE(B3)>1,"","V"))

これは
・名前(C2)が空欄ならD2は空欄
・次行の連番(B3)が1以下ならD2に"V"をセット、それ以外ならD2は空欄
という式です。

③D2セルをコピーしてD3~D9セルに貼り付けます。
計算結果は以下のようになります。

Year No Name Max 2013 1 山田 2 田中 3 佐藤 V 2014 1 山田 V 2015 1 山田 V 2017 1 田中 2 山田 V

④見出し列にカーソルを置き、オートフィルターします。

⑤D列のフィルターで"V"だけ抽出すると目的の結果が得られます。

Year No Name Max 2013 3 佐藤 V 2014 1 山田 V 2015 1 山田 V 2017 2 山田 V

参考になれば幸いです。

投稿2016/12/09 01:12

jawa

総合スコア3013

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問