• 締切済み

Excel VBAで1列に同じ値がある場合

ExcelVBAで1列に同じ値が2つ以上ある場合、他の列を取り出すようにしたいです。 下記のようなテーブルがあった場合に、 No.4の値を2行から最終行まで、確認していき、 同じ値が2行以上あった場合に、それを1行にまとめて、 No.2に小さい値を、No.3に大きい値を書き込むようにしたいです。 例) No.1 No.2 No.3 No.4 No.5 q    1    1    1    a q    2    2    1    a q    3    3    1    a VBAで下記のようなテーブルにしたいです。 No.1 No.2 No.3 No.5 q    1    3    a 当方、初心者でまだ日が浅いため、どうしても1行にまとめることができず、どなたか助けていただけますでしょうか。 回答よろしくお願いいたします。

みんなの回答

  • kkkkkm
  • ベストアンサー率65% (1633/2478)
回答No.5

添付画像のようにNo.4に複数の別値が存在してそれぞれ一行にしたいという場合です。 4と1と5を一行にしています。5はもともと一行なのでそのまま。 Sub Test3() Dim i As Long, LastRow As Long, LastRow2 As Long Application.ScreenUpdating = False LastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To LastRow AutoFilterMode = False LastRow2 = Cells(Rows.Count, "G").End(xlUp).Row + 1 If WorksheetFunction.CountIf(Range(Cells(i, "D"), Cells(LastRow, "D")), Cells(i, "D")) >= 2 And _ WorksheetFunction.CountIf(Range(Cells(2, "D"), Cells(i, "D")), Cells(i, "D")) = 1 Then Range(Cells(1, "A"), Cells(LastRow, "E")).AutoFilter Field:=4, Criteria1:=Cells(i, "D").Value Cells(LastRow2, "G").Value = Cells(i, "A").Value Cells(LastRow2, "H").Value = WorksheetFunction.Subtotal(5, Range(Cells(2, "B"), Cells(LastRow, "B"))) Cells(LastRow2, "I").Value = WorksheetFunction.Subtotal(4, Range(Cells(2, "C"), Cells(LastRow, "C"))) Cells(LastRow2, "J").Value = Cells(i, "E").Value ElseIf WorksheetFunction.CountIf(Range(Cells(2, "D"), Cells(LastRow, "D")), Cells(i, "D")) = 1 Then Cells(LastRow2, "G").Value = Cells(i, "A").Value Cells(LastRow2, "H").Value = Cells(i, "B").Value Cells(LastRow2, "I").Value = Cells(i, "C").Value Cells(LastRow2, "J").Value = Cells(i, "E").Value End If Next Application.ScreenUpdating = True End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2478)
回答No.4

テーブルが実際のテーブルだとしたら Sheet2やテーブル1、テーブル2は実際のものに変更してください。 画像では左がテーブル1で右がテーブル2です。 テーブルは画像の位置に無くても大丈夫です。 Sub Test2() Dim ws As Worksheet Dim tbl As ListObject, tb2 As ListObject Dim tblBody As Object, tb2Body As Object Dim i As Long, LastRow As Long Set ws = Sheets("Sheet2") Set tbl = ws.ListObjects("テーブル1") Set tb2 = ws.ListObjects("テーブル2") Set tblBody = tbl.DataBodyRange Set tb2Body = tb2.DataBodyRange With tblBody For i = .Rows.Count To 1 Step -1 If .Cells(i, 4).Value <> "" Then LastRow = i Exit For End If Next For i = 1 To LastRow If WorksheetFunction.CountIf(.Columns(4), .Cells(i, 4)) >= 2 Then tb2Body.Cells(1, 1).Value = .Cells(1, 1).Value tb2Body.Cells(1, 2).Value = Application.Min(Range(.Cells(1, 2), .Cells(LastRow, 2))) tb2Body.Cells(1, 3).Value = Application.Max(Range(.Cells(1, 3), .Cells(LastRow, 3))) tb2Body.Cells(1, 4).Value = .Cells(1, 5).Value End If Next End With Set ws = Nothing Set tbl = Nothing Set tb2 = Nothing Set tblBody = Nothing Set tb2Body = Nothing End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2478)
回答No.3

テーブルというのは単に表の事を言っているとして たとえば画像の位置にデータがあるとしたら Sub Test() Dim i As Long, LastRow As Long LastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To LastRow If WorksheetFunction.CountIf(Range(Cells(2, "D"), Cells(LastRow, "D")), Cells(i, "D")) >= 2 Then Range("G2").Value = Range("A2").Value Range("H2").Value = Application.Min(Range(Cells(2, "B"), Cells(LastRow, "B"))) Range("I2").Value = Application.Max(Range(Cells(2, "C"), Cells(LastRow, "C"))) Range("J2").Value = Range("E2").Value Exit For End If Next End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kon555
  • ベストアンサー率52% (1763/3382)
回答No.2

 No1と5の扱いが分からないのですが、個々の機能について参考ページを挙げておきます。 >>2行から最終行まで、確認していき https://excel-ubara.com/excelvba1r/EXCELVBA506.html >>同じ値が2行以上あった場合に1行にまとめて https://kirinote.com/excelvba-duplication-matome/ >>No.2に小さい値を、No.3に大きい値を https://kirinote.com/excelvba-variable-max/  最大最小値についてはもっと簡単な方法もありますが、初心者というならこの方法が良いと思います。 >>当方、初心者でまだ日が浅いため、  初心者の方がやるには程よいレベルの課題になると思います。頑張ってみてください。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

エクセル特有のステートメントを駆使してVBAを1行にまとめれば高速化できそうだが、それに拘らず、 セルの読み書き(この関数を最初に作る)、 forでループ、 ifで比較(代入演算子等を使う)、 を数行に別けてゆったり書いたほうがよい。 その3つで出来るよ。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBAでの値の比較

    お世話になります。 Excel VBAでの値の比較方法についてご教授頂きたく存じます。 下記のような値がセルに入っていると仮定しまして、 セルA1とセルG1を比較する セルA2とセルG2を比較する セルB1とセルH1を比較する セルB2とセルH2を比較する 値が違う場合のみ、A列、又は、B列のセルの色を変更したいのですが・・・。 下記例の場合であれば、B1とA2がセルの色が変われば良いです。    A列 B列    G列 H列 1行  1  1     1   2 2行  2  2     3   2 VBAで実現したいと思います。 何卒、宜しくお願い申し上げます。

  • Excel VBA 値取得について

    お世話になります。 どなたかお力をお貸しください。 Excel2003 VBAでプログラムを組んでおり、エクセルのシートをデータベース代わりに利用しています。 複数のブック散乱している10万個近くのテキストボックスの値を、 「A」というブックの「シート1」のセルに格納して行きたいと思っております。 値の格納方法としては、「A」ブックの「シート1」の セルA1からA2、A3…A列最終行(6万強)まで縦の並びにデータを格納していきます。 ただし、「シート1」に格納したい値は10万個近くあるので、 A列だけでは足りなくなります。 A列の最終行まで値を格納し終えたら、自動的にB列に移動して、 セルB1からB2、B3…B列最終行(6万強)という遷移させていきたいのです。 A列のみに格納していくのであれば、理解できるのですが、 自動遷移がわかりません。 For i = 0 To 最終行(6万強) シート1.Range("A" & i) = 参照元 Next i よろしくお願いします。

  • エクセルのVBAで

    ある列(仮にA列とします)の最終行がA30であり A25までは空白だとします。 この時に、A30の値をA29~A25=データの入力されていないセルに入力(コピー)するにはVBAでどのように記述すればいいのでしょうか? 最終行から、上にその最終行の値をデータの入力されているセルに達するまで入力(コピー)したいのですが。 分りづらい表現で申し訳ありませんが、よろしくお願い致します。

  • Excel VBA - 数式のコピーと値貼り付け

    A~Cを使った表があり、AとBには値が入力されています。 C2に"=A2+B2"と入力し、その式を、A列の最終行と同じ行までコピーし、C2からCの最終行までの範囲をコピーして同じ範囲に値貼り付けするにはどういうVBAを書けばいいでしょうか。 宜しくお願い致します。

  • VBAで複数の行のナンバーを取得し、その行の列の値を参照して値を入れる

    下記のことをしたいのですが、調べてもわかりません。 どなたか教えてください。 よろしくお願いします。 内容: エクセルシートのA列の値が11である行ナンバーを取得(複数ある可能性があります)する。 その行のE列(5列目)の値と他のテーブルの値を参照して所定の値をA列の値が11である行のE列(5列目)に返す。 以下のVBAを書いてみましたがうまくいきません。 ----------------------------------------------------------------- Dim ROWCOUNT As Integer Dim row_array() As Variant Dim i As Integer '全行数を取得 ROWCOUNT=Worksheets("sheet1").Range("A1",Range("A65536").End(xlUp)).Count For i = 1 To ROWCOUNT If Cells(i, 1).Value = 11 Then Cells(i,1).Offset(0,5).Value=WorksheetFunction.VLookup(Cells(i, 1).Offset(0, 5).Value, Worksheets("sheet2").Range("A1:H1786"), 3, False) End If Next I

  • エクセルVBAもし同じ値なら!!

    エクセルVBAもし同じ値なら!! 開いているBookのFormから違うBookのSheet1のA列にDATAを入力することはできます。 例)TextBox1の値があれば次の列に入れることはできます。 悩んでいるのは (1)TextBox1と違うBookの"Sheet1”のA列が同じ値なら  MsgBox "既に登録済みです。"と表示させて  ElseでDATAを入力させたいです。 '使用行を格納 lngYcnt_K = SH1.UsedRange.Rows.Count For lng = 1 To lngYcnt_K 'TextBox1と同じ値を見つけてテキストボックスの値を入力。 If CStr(TextBox1.Text) = CStr(SH1.Cells(lng, 1)) Then MsgBox "既に登録済みです。" Else 最終行 = SH1.Range("a65536").End(xlUp).Row TextBox1.Text = SH1.Cells(lng, 1) TextBox2.Text = SH1.Cells(lng, 2) End If Next lng どのようにすれば良いのでしょうか?? 教えて下さい!

  • エクセルVBAの初心者です。特定の値を基準とし、行に罫線をひきたいので

    エクセルVBAの初心者です。特定の値を基準とし、行に罫線をひきたいのですが、上手く行きません。 チャレンジしている内容は、下記の通りです。        A       B 1行目    100      X店 2行目    100   X店 3行目    101  Y店 4行目    101A      Y店Z営業所 5行目    102      V店 500行程、R列まで情報が入っています。 罫線をひく条件ですが、 1)A列を基準(上記より値の数が増えていきます。例:102,102Cなど) 2)100の様に同じ値がある場合、100同士の間には罫線をひかず、   100と101の間(2と3行目)に罫線をひく 3)101と101Aは同じグループとなるが、間に2)とは異なる罫線をひく   101Aと102の間は2)と同じ罫線をひく 作業を一つずつ分割し、IFなどを使い考えましたが、できません。 そもそも、やろうとしている事がVBAではできないのか、 このVBAを組むのに私の発想の転換が必要なのか、分からなくなってきてしまいました。 アドバイス等、ご教示頂けますでしょうか? 宜しくお願い致します。

  • エクセルVBA

    エクセル2003です エクセルの印刷するマクロをおしえてください *A列からQ列までで行は1~300で伸縮します  最終行をA5より下のA列のセルに値が連続で入っている最後が最終印刷範囲行とします *罫線ありです *1ページを30行とします *2ページ目からの先頭行に(A4:Q4)を印刷に入れたい マクロで印刷設定をした事がないのでさっぱりわかりません *ヘッダーとフッダーも可能でしょうか? 出来れば説明付きでよろしくお願いします

  • エクセルでの条件付きの値結合

    エクセルでのリストの編集方法を教えてください。 下記のような商品リストがあります。全て文字列形式です。 A列:商品コード (例:ATR-0001)半角英数 B列:バリエーション名 (例:カラー)全角 C列:バリエーション値 (例:ブラック)全角 D列:バリエーション品番 (例:-bk)半角英数 このとき、A列の値が同じでかつ、B列の値が同じ行の場合、 C列の値をつなげた値をE列に、 D列の値をつなげた値をF列に返したいです。 A列とB列が同じ値なら、E列、F列に入る値も同一で結構です。 ただ、つなげる際は値と値を半角コロンで区切る必要があります。 同じ値が何行並ぶかどうかは一定ではなく商品ごとに異なります。 VBAでも数式でも結構です。 よろしくお願いいたします。

  • VBAでセルに値が入ったときにイベントを起こしたい

    VBAでタイトルのことをやりたいのですがどうやったらいいのか全く思いつきません。どなたかヒントをいただけないでしょうか? B列の10行目から2000行までの間限定で、5行ごとのセルに値を入れたときに動くようにしたいんです。 例としてB10に値が入ったらA10から下に連番をふります。(1から5) B15に値が入ったらその続きを入れたいんです(6から10) どのようにしたらいいでしょうか?

専門家に質問してみよう