VB6で重複チェックを行う方法

このQ&Aのポイント
  • Visual Basic6.0を使用して、キー入力した値と重複しているかどうかをチェックする方法について教えてください。
  • 保存先はVB内のテキストボックスが第1希望で、外部のtxtファイルやcsvファイルは第2希望です。
  • 入力値と保存値の一致率を知りたいです。
回答を見る
  • ベストアンサー

VB6 重複チェックについて

お世話になります。 次の処理をVisual Basic6.0で教えてください。 1.Text1にキー入力した値をコマンドボタンクリックすると、Text1の値を保存します。 2.次にText1に新たに入力してコマンドボタンクリックで前項で保存した値と重複して   いないかチェックして重複無しならText1の値を保存します。 3.Text1に新たに入力して・・・・重複チェックして・・・・ といった具合に保存する値と重複チェックする対象の値がどんどん増えていきます。 さすがに10,000件はいかないですが。 保存先は読み書き込みの時間も考慮してVB内のTextBOXが第1希望、外部のtxtファイルやcsvファイルは第2希望としたいです。 If Text1=保存値 Then  処理 else  処理 End If 保存値をText2として行いましたが、完全一致でないとダメでした。 入力値:保存値=1:n(入力値が複数の保存値と重複したかどうか)が知りたいです! お手数おかけしますが、何卒よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • FoolWord
  • ベストアンサー率73% (14/19)
回答No.3

こんな考え方はどうでしょう。 1.Publicな配列とカウント変数を用意します。 2.コマンドボタンクリック時に入力した値と配列をforで回しながら判定します。 3.配列内に入力したデータと一致するデータがない場合は、配列を1つ増やし入力データを記録し、ファイルにデータを追加します。 [Module1.vb] Public InpHist(0) As String Public aryCt As Long [Form1.vb] Private Sub Command1_Click() Dim InpData As String Dim i As Long Dim flg As Boolean ' 入力した文字を取得 InpData = Text1.Text flg = True ' 今まで入力したデータと今回入力したデータを比較 For i = 0 To UBound(InpHist) If InpData = InpHist(i) Then ' 既に入力されたデータ flg = False Exit For End If Next If flg = True Then ' 入力済みでないデータ処理 If aryCt = 0 Then ' 初回の時は、初期履歴配列を使用する Else ' 履歴配列を1つ追加 ReDim Preserve InpHist(aryCt) End If ' 履歴配列にデータを追加 InpHist(aryCt) = InpData aryCt = aryCt + 1 ' ファイルの末尾にデータを書込む Else ' 既に入力済みデータはメッセージで警告 MsgBox ("既に入力済みです。") End If End Sub Private Sub Form_Load() ReDim InpHist(0) aryCt = 0 End Sub

ichyojp
質問者

お礼

foolwordさん ありがとうございます!配列使って出来そうです。 txtファイルを使用して作成したものを改良しようと思います。 感謝致します!

その他の回答 (2)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

#1です。 補足に書かれている事は回答したコードの テキストボックス名とコマンドボタン名を変更したら そのまま当てはまりそうな気がしますけど? ⇒重複した場合には >' 重複していた場合の処理 ここでエラーメッセージを出せばいいのかな? と言うくらいかと。 >保存されるデータは文字列が1000回分くらいまで入れたいし これがフォームを開いて途中で閉じて(中断して) またフォームを開いたあとも保持されると言うなら、 Dictionaryでは無理かなぁ。 ⇒別ファイルへの書き出しになるかもしれませんが、 そこは他の回答を待ってみるしか。。。 Excelへの書き出しも考えるなら、 最初からExcelで作成するのも1つの方法ではあるけれど。

ichyojp
質問者

お礼

n-junさん いろいろ教えてくださり、ありがとうございました。 Dictionaryを調べるなかで、txtファイルに保存値を書き込み、 データ読み出しで出来るようになりました。 きっかけを与えてくださり感謝します。 今後もまた質問すると思いますので、よろしくお願いします。!

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

第一希望がTextBoxの利用と言う事なら、 フォームが開いている間だけ重複がチェックできればいいのかな? ならばDictionaryオブジェクトを使って ' 変数の宣言 Private myDic As Object ' フォームが開く時 Private Sub Form_Load() ' Dictionaryオブジェクトのセット Set myDic = CreateObject("Scripting.Dictionary") End Sub Private Sub Command1_Click() ' Dictionaryオブジェクトに値がない場合 If Not myDic.Exists(Text1.Text) Then ' Dictionaryへのキー設定を行なう myDic(Text1.Text) = "" ' 重複していない場合の処理 Else ' 重複していた場合の処理 End If End Sub ' フォームを閉じる時 Private Sub Form_Terminate() ' Dictionaryオブジェクトの解放 Set myDic = Nothing End Sub みたいな感じはいかがかな?

ichyojp
質問者

補足

Dictionaryや配列つかっていろいろやりましたが、うまくいきませんでした。 改めて質問させていただきます。 やりたいことは、、、、 Input.textとstartボタンを準備します。 (1)Input.textに文字列7桁を入力する。 (2)コマンドボタンのstartボタンを押すと、入力された文字列がPC内の所定の保存場所に存在するかチェックする(重複しているか?)。 (3)存在(重複)していなければ、Input.textに入力された文字列をPC内の 所定の保存場所に保存する。重複していればエラー。 ・・・以降(1)~(3)を100回程度繰り返します。 PC内の所定の保存場所とは、フォームのTextBoxでも配列でも、外部のcsvファイルやExcelでもかまいません。可能ならフォームのTextBoxか配列が希望です。 (配列は基礎しかわかりませんが。。。) 保存されるデータは文字列が1000回分くらいまで入れたいし、クリアもしたいです。 私の初心者知識では限界です。 可能な限りコードもお願い致します。 申し訳ありませんが、教えてください。

関連するQ&A

  • 重複チェック

    いま、重複チェックをしているのですが、MoveFirstで データをある分だけ調べていて、データが重複してなかったら、データを更新したいのですが、はじめにMoveFirst で、データを調べたので、カレント行が最終行にあると思うので、それを例えば、3行目のデータだったり、5行目のデータを変更したいのですが、よろしくお願いします。 重複チェック rs.MoveFirst   Do While Not rs.EOF    If Text2(0).Text <> rs.Fields(1) Then rs.MoveNext End If Loop rs.Fields(1) = Text2(0).Text

  • ACCESS重複のチェック

    ACCESSで重複チェックをしたいと思います。 現在は電話番号テーブルだけしかありません。 電話番号のテーブルを主キーを使って重複している場合エラーメッセージを出すというものです。保存ボタンもありません。 Private Sub text電話番号_BeforeUpdate(Cancel As Integer) If IsNumeric(text電話番号) = False Then '数字チェック。 MsgBox "電話番号は数字で入力して下さい。", vbCritical Cancel = True ' 処理を取り消します。 Me.Undo End If Dim strmsg As String strmsg = "重複しています" If Not IsNull(DLookup("[電話番号]", "ダブリチェックテーブル", "[電話番号] = [text電話番号]")) Then MsgBox strmsg, 16, "ダブリチェック" Cancel = True '処理を取り消します。 Me.Undo '元に戻します。 Else Cancel = False '処理を続行します。 End If End Sub これに、企業名と出発日という項目を増やしたいと思います。 ですが、何万とある電話番号を一気に入力して調べているので、一回一回企業名と出発日を入れていると生産性が落ちます。 ですので、企業名と出発日は最初の入力だけで次のレコードに移動してを継続させたいのです。そして電話番号以外にカーソルを行かないようにしたいです。 何か良い方法があればご教授お願いします。 ちなみにいろいろ自分なりに試したのですが、重複してエラーを出した場合に企業名にカーソルが飛んだししてうまくいきませんでした。

  • VB.NET テキストボックスの入力チェック

    Visual Basic 2008 に関する質問です。 画面のテキストボックスの入力値をチェックする処理として、 Validatingイベントを使用しています。 例えば、 画面上に配置しているボタンをクリックして画面を閉じさせたい場合(Application.Exit()等)、 テキストボックスの値が未入力であると、上記の入力チェックが先にはしってしまい、 画面を閉じることができません。 閉じるボタンの処理を最優先させる方法について、 どなたかご教授いただけませんでしょうか? (※初歩的なご質問で大変申し訳ございません。)

  • Access2000でレコードの重複チェックをするとエラーに

    ボタンをクリックすると、「品名」「色番」「ロット」「枝番」「巾」の重複が無いかチェックして、重複があればエラーテキストを表示させたいのです。 下記のコードで動かすと、 「エラー'91':オブジェクト変数またはWithブロック変数が設定されていません」と出ます。 どこが問題でしょうか? 教えて頂けると幸いです。 Private Sub 重複チェックボタン_Click() Dim Rs As ADODB.Recordset Dim strSQL As String strSQL = "" strSQL = strSQL & " Select * From 変更ロットテーブル " strSQL = strSQL & " Where 品名 = '" & Forms!変更ロット入力チェックフォーム!品名 & "'" strSQL = strSQL & " And 色番 = '" & Forms!変更ロット入力チェックフォーム!色番 & "'" strSQL = strSQL & " And ロット = '" & Forms!変更ロット入力チェックフォーム!ロット & "'" strSQL = strSQL & " And 枝番 = '" & Forms!変更ロット入力チェックフォーム!枝番 & "'" strSQL = strSQL & " And 巾 = '" & Forms!変更ロット入力チェックフォーム!巾 & "'" Rs.Open strSQL, CurrentProject.Connection If Rs.EOF = False Then If MsgBox("重複ロットが存在します!", vbOKCancel) = vbOK Then Cancel = True End If End If End Sub

  • ACCESSの重複チェックについて

    顧客データをACCESS2003にて作成しています。 フォームにてVBAを用いて重複チェックをしているのですが、件数が多いせいかチェックに時間が掛かっております。(入力済件数は10万は超えております。) テーブル(T_顧客管理)よりチェック出来るようにしており、チェックのフィールドは「住所」にしております。 Private Sub 住所_BeforeUpdate(Cancel As Integer) If DCount("住所", "T_顧客管理", _ "住所='" & Me!住所 & "'") > 0 Then Beep MsgBox "既存のデータと同じ住所が入力されました! " & _ "別の値を入力してください。", _ vbOKOnly + vbExclamation, "重複エラー" Cancel = True Me.Undo End If End Sub 上記の式を入れておりますが、別の方法(式)にて上記と同じ内容にてチェック出来る式があれば教えていただきたいと思いますので、宜しくお願い致します。

  • 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 よろしくお願いします。

  • テキストボックスの入力値チェックについて

    テキストボックスに入力した値に対して半角カナで入力されているかのチェックをコマンドボタン押下時に行いたいのですが、 どのようなコードを書けばよろしいのでしょうか? ついでに、半角数字のみのチェックも教えてください。

  • Accessで、重複データのチェック

    Access2000で、テーブル更新用のフォームを作っています。既に登録済みのレコードを編集する、あるいは新規のレコードを登録する機能を持っています。 そのフォーム上のテキストで、既存レコードを編集、あるいは追加したい新規レコードを入力して、テキストからフォーカスを離すと、入力したレコードが既存のレコードと重複していないか、チェックを走らせています。重複している場合は、適切なレコードが入力されるまで、そのテキストからフォーカスを離さないようにしています。が、やはりそのようなチェックの仕方では、既存のレコードに一度手を加えてしまうと、手を加える前のレコードに戻すことは出来ません。 たとえば、"東京都"というレコードが登録済みである→"東京都"を"北海道"に変える→やっぱり"東京都"というレコードに戻す→重複チェックにひっかかり、フォーカスもそこから離せない状態である→元のレコードにはもう戻せない、とにかく"東京都"と異なる値で登録するしかない。。。という具合です。以下の関数を、更新前処理でよんでいます。どなたか、よいアドバイスをください。お願いいたします。 Function ChkInp(pCntrl As Control, _ pClmName As String, _ pCourt_Cd As String) As Boolean   Dim wSQL As String ChkInp = False wSQL = "" wSQL = "select AREA_CD from COURTED_XXT009" wSQL = wSQL + " where COURT_CD = '" & pCourt_Cd & "'" wSQL = wSQL + " and " & pClmName & " = '" & pCntrl & "'" Set rst = CurrentDb.OpenRecordset(wSQL, , acReadOnly) If rst.EOF() = False Then ChkInp = True End If End Function

  • 重複チェック

    あるシートに値を入れた時、そのシートのA1:Z80の範囲内で重複する値が既存するかどうか調べたいです。 下記のコードを試すと、どの値を入れても既存すると帰ってきます。 入力した値自身を見つけて重複だと言っている気がするのですが、どのように対処すればいいのか教えてほしいです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myCell As Range For Each myCell In Sheets("居場所").Cells If Target.Value = myCell.Value Then MsgBox "この名前は既に存在しています。", vbOKOnly + vbExclamation Exit Sub If myCell.Address = "$Z$80" Then Exit Sub End If Next End Sub

  • 期間重複チェックがわかりません

    2年目の若手プログラマです 2年目にもなってこんなこともできないのかと 毎日のように怒られています VB2005+SQLServer2005で開発を行っています。 期間を3つ入力してデータを抽出する プログラムを作っているのですが 期間重複チェックがわかりません 期間(1)~期間(3)まであります(抽出条件) 1,2,3各期間重複する場合は再入力させるとしか 仕様書に書かれておらず プログラミングできず困っています。 期間(1) txtStartDate1.text txtEndDate1.text 期間(2) txtStartDate2.text txtEndDate2.text 期間(3) txtStartDate3.text txtEndDate3.text

専門家に質問してみよう