• 締切済み

VB.net 重複チェックがしたいです

DB接続しない前提です。 データセットを用いてグリッドビュー内で重複チェックをしたいです。 リストボックス内にファイル毎にテキストを取り込み、任意の日付を抽出しテーブルに登録。 テーブルに重複あるか確認してboolenで判定したいのですが、構文がエラーになります。 For i = 0 To ListBox1.Items.Count - 1 ST = ListBox1.Items.Item(i) GT = GetText(ST) Dim strSearchChardate As String = "Date " Dim datetxt As String = GT.Substring(lngPointdate + 5, 10) Dim dsdt = DataSet1.DataTable1 Dim checktxt As DateTime = DateTime.Parse(datetxt) Dim check As Boolean = dsdt.Contains(datetxt)    ←ここのdatetxtエラー ’グリッドビューに重複なければ書き込み dsdt.AddDataTable1Row(datetxt, code) という風に進めたいのですが、修正を含め違うやり方等ありましたら教えていただきたいです。 現在はエラー処理でしておりますがこれをやめたいです。 '日付の重複処理 Try dsdt.AddDataTable1Row(datetxt, code) '日付をユニークキーにしているため Catch ex As System.Data.ConstraintException MsgBox("同一日付があります") End Try よろしくお願いします。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

>Dim check As Boolean = dsdt.Contains(datetxt)    ←ここのdatetxtエラー dsdt.Containsメソッドは dsdt.Contains(value As DataSet1.DataTableRow) As Boolean dsdt.Contains(value As DataSet1.DataTableRow, comparer As IEqualityComparer(Of DataSet1.DataTableRow)) As Boolean の2つがおそらくあると思います。 引数としてStringを要求するものはありませんからエラーになるのは当然かと(構文エラーではありませんが) 具体的なコードは書けませんが dsdt.Contains(value As DataSet1.DataTableRow) As Boolean は行データの全一致(質問では日付とコード)が条件でしょうから使えず dsdt.Contains(value As DataSet1.DataTableRow, comparer As IEqualityComparer(Of DataSet1.DataTableRow)) As Boolean を使う事になるかとと思います。 具体的なコードは書けませんが(質問に書かれている内容では分からない型や名前等ありますし) 第2引数の比較用クラスを定義しておいて Imports System.Collections.Generic Class DataComparer Implements IEqualityComparer(Of DataSet1.DataTable1Row) Private Function IEqualityComparer_Equals(x As DataSet1.DataTable1Row, y As DataSet1.DataTable1Row) As Boolean Implements IEqualityComparer(Of DataSet1.DataTable1Row).Equals Return x.日付 = y.日付 End Function Private Function IEqualityComparer_GetHashCode(obj As DataSet1.DataTable1Row) As Integer Implements IEqualityComparer(Of DataSet1.DataTable1Row).GetHashCode Return obj.日付.GetHashCode() End Function End Class Dim row As DataSet1.DataTable1Row = Me.DataSet1.NewDataTable1Row() row.日付 = datetxt row.コード = コード If Not dsdt.Contains(row, New DataComparer()) Then dsdt.AddDataTable1Row(row) End If とか。 もしくはdsdtから1行づつ調べてまわるとか。 になるんじゃないでしょうか。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

Dictionaryの仕組を使ってはどうですか。 http://www.wednesdaymoon.net/kzweb/articles/vbnet/article.aspx?articleid=38 Dictionaryの使い方 https://www.dotnetperls.com/dictionary-vbnet ーー If dictionary.ContainsKey("xx") Then 同一キーあり 日付は文字列にしておく必要があるかも。

hatanankayuta
質問者

補足

配列にしていないので、できませんでした><

関連するQ&A

  • ListBoxのデータを高速でファイルに書き込む方法 VB.NET

    ListBoxに大量のデータを登録してありそれをファイルに保存する場合 Dim data As String For i As Integer = 0 To ListBox1.Items.Count - 1 data = data & ListBox1.Items(i) & VbCrLf Next という方法で変数に読み込むとデータが大量にある場合 非常に遅く、OutOfMemoryのエラーが出てしまったりするのですが、 このような場合により適切な方法がありましたらご教授頂けないでしょうか。 宜しくお願いいたします。

  • [VB2008]リストボックス内の複数選択された項目を削除したい

    タイトルの通り、リストボックス内の複数選択された項目を削除したいのですが どうすればいいでしょうか? 下記のコードを組んでみましたが動作しませんでした。 Dim SelectItem As Object Dim ItemList As String = "" For Each SelectItem In Me.ListBox1.SelectedItems Me.ListBox1.Items.Remove(SelectItem.ToString()) Next ご回答お願いします。

  • 教えて★ExcelでVBのマクロについて

    以前ここで質問させていただきました。 http://okwave.jp/qa3029622.html 上の内容のとおり教えていただきました。 マクロにさらにタイトルを追加したいのですが可能でしょうか? ファイルAのタイトルは5行目から始まり8行目まであります。 ファイルBのタイトルは2行目から始まり6行目まであります。 ★ファイルAのタイトルにファイルBのタイトルをつけ加えたい! 以下のソースに付け加えるとしたら、どこにどのように追加すればよいですか? 以上ですがよろしくお願いいたします。 Sub findJoin() On Error GoTo err Dim st1 As Worksheet Dim st2 As Worksheet Set st1 = ActiveSheet Workbooks.Open ("870xtd.xls") Set st2 = Workbooks("870xtd.xls").Sheets(1) Dim st1MaxRow As Long Dim st2Maxrow As Long st1MaxRow = st1.Cells(st1.Rows.Count, "A").End(xlUp).Row st2Maxrow = st2.Cells(st2.Rows.Count, "AB").End(xlUp).Row Dim R As Long For R = 2 To st1MaxRow Dim nmRng As Range Set nmRng = st2.Range("AB2:AP" & st2Maxrow).Find(st1.Cells(R, "A").Value, LookIn:=xlValues) If Not nmRng Is Nothing Then '発見した。 st2.Range("A" & nmRng.Row & ":AP" & nmRng.Row).Copy Destination:=st1.Range("DQ" & R) End If Next st1.Activate Set st1 = Nothing Set st2 = Nothing Exit Sub err: MsgBox Error End Sub

  • VBタイムアウト

    タイムアウト、プールサイズの制限値 VB2010で業務アプリケーションの集計ツールを作成しています。 仕組みは単純で、下記の様にDateTimePicker(カレンダー)から日付を選び ボタンクリックでフォーム内のデータグリッド内に集計値が入っていく仕組みです。 'カレンダー日付選択 Sub Aggregate() '日付の取得 DateTimePicker1.Format = DateTimePickerFormat.Custom DateTimePicker1.CustomFormat = "yyyy-MM-dd 1つのフォームにデータグリッドが10個ほどあるので画面遷移までに5秒くらいかかってしまいます。 1度目の表示は問題ないのですが、日付を選択し直し2度、3度と実行すると ”タイムアウトに達しました。プールから接続を制限する前にタイムアウト期間が過ぎました。 プールされた接続がすべて使用中で、プールサイズの制限値に達した可能性があります。” と表示されてしまいます。開放も行っているつもりで原因がわかりません。 原因がわかれば教えていただきたいです。処理をスピードアップできる方法があればそれもお願いします。 接続文字は以下の通りです。 Function CONNECT(ByVal SqlText As String) As String Dim St As String Dim Cn As New System.Data.SqlClient.SqlConnection Dim SQL As New System.Data.SqlClient.SqlCommand Dim ServerName As String = "AAAAAAAAA" Dim UserID As String = "BBBBBBBBB" Dim Password As String = "CCCCCCC" Dim DatabaseName As String = "DB" Dim Adapter As New System.Data.SqlClient.SqlDataAdapter Dim Table As New DataTable Adapter.SelectCommand = SQL SQL.Connection = Cn SQL.CommandTimeout = 120 St = "Server=" & ServerName & ";" St &= "User ID=" & UserID & ";" St &= "Password=" & Password & ";" St &= "Initial Catalog=" & DatabaseName Cn.ConnectionString = St SQL.CommandText = SqlText Cn.Open() Return SQL.ExecuteScalar SQL.Connection = Nothing SQL.Transaction = Nothing SQL.Dispose() Cn = Nothing Cn.Dispose() Cn.Close() End Function データグリッドの転記は下記の様なコードをずらっと書いています。 DataGridView10(2, 3).Value = CONNECT("SELECT COUNT(*)" & _ " FROM dbo.IOTBL, dbo.APLTBL" & _ " WHERE APLTBL.APLID=IOTBL.APLID" & _ " And (APLTBL.APLTYPE='JA01')" & _ " And (APLTBL.DELETED<>'1')" )

  • 【Excel】リストボックスにデータを重複せず昇順に表示する方法

    教えてください。 ユーザーフォームにリストボックス(Listbox1)があり、日付が昇順で入力されるようになっています。 ただし、この日付データは重複が多いため重複されないよう表示しようと下記のコードを記述しましたが「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」と表示されてしまいます。 これを回避し、実行させるためにはどういう風に記述を修正したらよいでしょうか? ================================================================ Private Sub UserForm_Initialize() Dim i As Long For i = 2 To 2000 ListBox1.AddItem Worksheets("データ").Cells(i, 1) Dim myValue As Variant Dim myRng As Range, myCell As Range Set myRng = Worksheets("データ").Cells(i, 1).End(xlUp) myValue = myRng.Value Application.ScreenUpdating = False myRng.Sort Worksheets("データ").Cells(i, 1), xlAscending, Header:=xlYes With ListBox1 .Clear For Each myCell In myRng.Resize(myRng.Rows.Count - 1).Offset(1) _ .SpecialCells(xlCellTypeVisible) .AddItem myCell.Value Next .ListIndex = 0 End With Next i ListBox1.ListIndex = 0 End Sub ================================================================

  • ”ListBoxへのAddでエラー”

    タイトルの通りです。 DoubleからStringの型変換が不可なんでしょうか? ”.ToString” によってエラーになってるようです。 For~Eachでの3行で処理するとOKなのですが1行で なんとかならないものかと調べていましたが、いきずまっています。 Items.AddではなくItems.AddRangeを使う場合、どういうふうに 書くんでしょうか?。ちなみに、配列がString型の場合にはエラー にならないことは知っています。(.ToStringも不要) ’--------サンプル---------- Public Class Form1 Private Sub Button1_Click() Handles Button1.Click Dim Test_arr() As Double = {1.4, 1.2, 1.9, 1.7, 1.4, 2.8, 1.2, 3.2, 1.99, 4.2} ListBox1.Items.AddRange(Test_arr.ToString) '←この行でエラー For Each x As Double In Test_arr '←これはOK ListBox1.Items.Add(x.ToString) ' Next ' End Sub End Class エラー内容は、↓ ------------------------------------------------------------------ エラー 1 これらの引数で呼び出される、アクセス可能な 'AddRange' が ないため、オーバーロードの解決に失敗しました: 'Public Sub AddRange(items() As Object)': 型 'String' の値を 'Object の 1 次元配列' に変換できません。 'Public Sub AddRange(value As System.Windows.Forms.ListBox.ObjectCollection)': 型 'String' の 値を 'System.Windows.Forms.ListBox.ObjectCollection' に変換できません。 ------------------------------------------------------------------ どなたかご教授願えれば幸いです。環境はVisualBasic2010+WindowsXPです。

  • VB2015 ListBoxの二次元配列を呼出す

    始めまして。 趣味でVBソフトを作りたいと奮闘中です。 ExcelVBAやC#の簡単ソフトを作った経験があります。 パソコン環境は、W10x64、VB2015です。 ListBoxに2次元配列で下記のように書き込み、選択した行の右側のデータ(欄2)を他のTextBoxに表示させたいのです。 下のデータを2次元配列にして読み込ませる方法と、選択した行の欄2のデータを取り込む方法を教えて頂けると嬉しいです。ListBoxのプロパティのMultiColumnはTrueにしてあります。  欄1 欄2 北海道  550 青森県  138 宮城県  230 東京都  1360 現在は次のようにしてなんとか逃げておりますが、2次元配列でスマートに出来れば嬉しいです。 書き込み ListBox1.BeginUpdate() ListBox1.Items.Add("北海道 , 550") ListBox1.Items.Add("青森県 , 138") ListBox1.Items.Add("宮城県 , 230") ListBox1.Items.Add("東京都 , 1360") ListBox1.EndUpdate() 呼び出し Dim textArray = ListBox1.SelectedItem.ToString.Split(",")  Dim Jinko As Single = Single.Parse(textArray(1)) TextBox.Text = Jinko 宜しくお願い致します。 熊谷

  • リストボックスのアイテムをマウスで並べ替えたいです

    リストボックスのアイテムをマウスのドラッグドロップで並べ替えたいのですが、 下のような感じで書いてみたのですが、 この状態だと、4番目のものを一番上に持ってくるという動作だけするのですが、 4番目から3番目に移動する場合や、1番目から3番目に移動する場合など 追加していくとIFが重なってきてすごくややこしくなってしまいます。 もっと分かりやすくて合理的な方法がありましたら、 大体でも良いですので、教えて頂けたら助かります。 よろしくおねがいいたします。 Private Sub Form1_Load(...略 ListBox1.Items.Add("AAA") ListBox1.Items.Add("BBB") ListBox1.Items.Add("CCC") ListBox1.Items.Add("EEE") End Sub Private Sub ListBox1_MouseDown(...略 SelectedSortFrom = ListBox1.SelectedIndex End Sub Private Sub ListBox1_MouseUp(...略 SelectedSortTo = ListBox1.SelectedIndex ListBox1Sort(SelectedSortFrom, SelectedSortTo) End Sub Private Function ListBox1Sort(ByVal From As Integer, ByVal Too As Integer) If From = -1 Then Exit Function If Too = -1 Then Exit Function Dim A(ListBox1.Items.Count) As String Dim B As Boolean For i As Integer = 0 To ListBox1.Items.Count - 1 A(i) = ListBox1.Items(i) Next For i As Integer = 0 To ListBox1.Items.Count - 1 If i = Too Then ListBox1.Items(i) = A(From) B = True Else ListBox1.Items(i) = A(i - 1) End If Next End Function

  • vb 日付の判断

    こんにちは。vb2005で日付の判断をしたいのですが、 スマートな方法がわかりません。 Dim y() as string ~ dim y(0) には 20081231 が入る ~ Dim wk As String = y(i).Insert(4, "/") wk = wk.Insert(7, "/") If IsDate(wk) Then ひづけ有効な場合 処理 とりあえずこれで、日付として成立するかを判断しているのですが、 もうすこしスマートな方法はないでしょうか?

  • 100万行位のファイルを出来るだけ速くListBoxに登録したい

    vbCrLfで区切られた100万行位のテキストファイルがあり、 これを出来るだけ速くListBoxに登録するには どのような方法が良いでしょうか。 現在はStreamReaderで変数strに読み込んで、 Dim Data() As String = Split(str,vbCrLf)で配列に読み込み、 ListBox1.Items.AddRange(Data) で登録しているのですが、何分もかかってしまいます。 良い方法がありましたら、ご教示頂けると助かります。

専門家に質問してみよう