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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

6596閲覧

VB.NET(言語:VB)でEXCELのような複数列で重複削除

Kouta2020

総合スコア2

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/06/28 23:05

編集2020/06/29 14:23

https://hironimo.com/prog/vbnet/dataview/

を参考にDataTableの重複の削除を試みています。
3列の内、2列が重複している行を削除したいです。

DataView.ToTableで上記サイトのように3列のうち2列の項目を指定すると、重複削除でき2列だけが表示されます。

例)データテーブル
name old height
ひろ  10  100
ひろ  10  110
ひろ  10  120
ひろ  10  130
ひろ  10  140
ひろ  20  150
ひろ  20  160
ひろ  20  170
ひろ  20  180
ひろ  20  180

Dim dtView As DataView
dtView = New DataView(dt)
dt = dtView.ToTable(True, {"name", "old"})

結果
name old
ひろ  10
ひろ  20

希望している重複削除後の表示は3列のままにして、しかも下側の行を残すことです。

希望する結果
name old height
ひろ  20  180
ひろ  10  140

Excelでは残したい行が上になるように並べかえて、重複の削除で列を2つ選択すれば実現できます。

例)height降順並び替え
name old height
ひろ  20  180
ひろ  20  180
ひろ  20  170
ひろ  20  160
ひろ  20  150
ひろ  10  140
ひろ  10  130
ひろ  10  120
ひろ  10  110
ひろ  10  100

重複の削除でnameとoldの2列を選択する

希望する結果
name old height
ひろ  20  180
ひろ  10  140

これをVB.NET(言語VB)でできる方法を教えて下さい。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/28 23:49

url 文字列を貼り付けるだけでなくリンクを張って下さい。
退会済みユーザー

退会済みユーザー

2020/06/29 21:44

思いつきレベルですが (なので回答として書きませんが)、Linq を使う方向で検討してはどうでしょう? グループ化してから最大値を取るとか・・・
退会済みユーザー

退会済みユーザー

2020/06/29 23:30

Linq がダメなら、ループを回して最大値を取るとかの方法でなんとでもなると思います。name と old が重複しないレコードの取得までは出来ているようですので、例えば、全レコードから取得した name, old と一致するレコードで height が最大のものをループを回して調べていくとか。 Linq 案、上に書いたループを回す案、その他でもいいので、考えてコードを書いて質問することをお勧めします。
guest

回答1

0

自己解決

SurferOnWwwさんのヒントを元に「vb.net datatable linq 最大値」で調べて以下のプログラムにたどり着きました。


Sub test()
Using DataTable1 As DataTable = New DataTable
'テストデータ
With DataTable1
.Columns.Add("name", GetType(String))
.Columns.Add("old", GetType(Integer))
.Columns.Add("height", GetType(Integer))
.Rows.Add(New Object() {"ひろ", 10, 100})
.Rows.Add(New Object() {"ひろ", 10, 110})
.Rows.Add(New Object() {"ひろ", 10, 120})
.Rows.Add(New Object() {"ひろ", 10, 130})
.Rows.Add(New Object() {"ひろ", 10, 140})
.Rows.Add(New Object() {"ひろ", 20, 150})
.Rows.Add(New Object() {"ひろ", 20, 160})
.Rows.Add(New Object() {"ひろ", 20, 170})
.Rows.Add(New Object() {"ひろ", 20, 180})
.Rows.Add(New Object() {"ひろ", 20, 180})
End With

Me.DataGridView1.DataSource = DataTable1 'LINQで、日付毎の値段と量の最大レコードを抽出 Dim query As IEnumerable = From order As DataRow In DataTable1.AsEnumerable Group order By name = order.Field(Of String)("name"), old = order.Field(Of Integer)("old") Into height = Max(order.Field(Of Integer)("height")) Select New Object() {name, old, height} 'データテーブルへ代入 Using DataTable2 As DataTable = DataTable1.Clone For Each order As Object() In query DataTable2.Rows.Add(order) Next order '結果を表示 For Each wDataRow As DataRow In DataTable2.Rows For Each wDataColumn As DataColumn In DataTable2.Columns Console.Write(String.Format("{0} = {1} ", wDataColumn.ColumnName, wDataRow(wDataColumn.ColumnName))) Next wDataColumn Console.WriteLine() Next wDataRow Me.DataGridView2.DataSource = DataTable2 End Using End Using

End Sub


Form1のDataGridView1に重複削除前、DataGridView2に重複削除のデータ表示ができました。

DataGridView1
name old height
ひろ  10  100
ひろ  10  110
ひろ  10  120
ひろ  10  130
ひろ  10  140
ひろ  20  150
ひろ  20  160
ひろ  20  170
ひろ  20  180
ひろ  20  180

DataGridView2
name old height
ひろ  10  140
ひろ  20  180

SurferOnWwwさんありがとうございました。

投稿2020/07/02 11:33

編集2020/07/02 11:35
Kouta2020

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問