[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『13桁の数値の検索』(まー)
いつもお世話になっています。 sheets("リスト")のA列に13桁の数値がID番号として入っているのですが、ID番号で検索してその列のデータを参照したいのですが、検索にヒットしないのです。 ちなみに13桁の数値はセルの書式設定で数値としていて、標準にすると7.11632E+12となります。IDはユーザーフォームのテキストボックスから取得します
sub 検索 dim ID as variant dim c as range
ID=userform1.textbox1.value set c=sheets("リスト").range("A1").end(xldown).find(what:=ID,lookin:=xlvalues,lookat:=xlwhole,searchorder:=xlbyrows) if not c is nothing then . . とこんな感じなのですが、テキストボックスから取得する値に問題があるのですか? 文字列とか・・・ 素人ですいません。 教えてください。
帰るのでヒントだけ。 テキストボックスの値は、文字列。 セルの数値とは別物。 Clng(textbox1.value) とかで、数値に直す。 BJ
と言うよりも >set c=sheets("リスト").range("A1").end(xldown).find(what:=ID,lookin:=xlvalues,lookat:=xlwhole,searchorder:=xlbyrows) ここがヘンだと思います。
sheets("リスト").range("A1").end(xldown) のセル A1セルから下方向へ見て行った時 最初の空セルの一つ前のセル を検索するのでは無いでしょう?
(HANA)
衝突してしまいましたが・・・
文字列と数値の差もあるかもしれませんが、根本的な問題は
Set c = Sheets("リスト").Range("A1").End(xlDown)・・・
だと思います。 検索範囲がA列の最終セルの1つのセルだけになっていますので
Set c = Sheets("リスト").Columns("A")・・・
に変更してみてください。 (momo)
BJさんのやりかたでしてみましたが、オーバーフローしてしまいます。
13桁あるので、だめなんですよね?
>ちなみに13桁の数値はセルの書式設定で数値としていて、標準にすると7.11632E+12となります。 Find method では無理なのでは?
sub 検索 dim ID as string ^^^^^^ dim r as range
ID=userform1.textbox1.value for each r in sheets("リスト").range("A1").CurrentRegion.Columns("A").cells if r.text = id then '見つかった end if next とか? (seiya)
>こぴぺしなかったもので適当に書いてしまいました。 実際はどうなっているのですか? 全文を載せてみられてはどうでしょう。
こちらのテストでは、momoさんのご指摘の箇所を変更しただけで 見つけることが出来ましたが。
リスト と言うシート名に [A] [1] 7116320000000 [2] 7116320000001 [3] 7116320000002 [4] 7116320000003 [5] 7116320000004 [6] 7116320000005 のデータ。
UserForm1 に TextBox1 と CommandButton1 を置いて ↓のコードで検索 Private Sub CommandButton1_Click() Dim ID As Variant Dim c As Range ID = UserForm1.TextBox1.Value MsgBox Len(ID) & "文字の " & ID & " を検索します。" Set c = Sheets("リスト").Columns("A").Find(what:=ID, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows) If Not c Is Nothing Then MsgBox "ありました。" Else MsgBox "ありません。" End If End Sub
新しいブックで試してみられては?
(HANA)
13桁なので型を意識するならDouble型だと思います(cdbl関数) でも、型をそろえなくてもHANAさんと同じく検索できましたけど・・ (momo)
すみません。 ほとんどよく見てなかった。 てっきりワークシート関数の類かと思って。 Findだと、数値と文字列を区別しませんね。 ただ、ワイルドカードが使えるか使えないかの違いだけだったかも。 BJ
Private Sub CommandButton1_Click()
Dim ID As Double
Dim c As Range
ID = Me.TextBox1.Value If ID = Sheets("リスト").Range("A2").Value Then MsgBox "同じ。" Else MsgBox "違う。" End If End Sub
だと、メッセジボックスに同じと表示されますが、検索には引っかからないなんでですかね?
全くアイデアは有りませんが、例えば 入力するのではなく UserForm1.TextBox1.Value = Sheets("リスト").Range("A2").Value で入れた物を、再度IDに移して検索したり
TextBoxを通さず、直接 ID に A2セルの値を入れて 検索したりすると
どうなんでしょう?
(HANA)
>sub 検索 >dim ID as variant >dim c as range >ID=userform1.textbox1.value >set c=sheets("リスト").range("A1").end(xldown).find (what:=ID,lookin:=xlvalues,lookat:=xlwhole,searchorder:=xlbyrows) >if not c is nothing then
まず、誰もが再現できるコードを記述してください。 上記コードでは、Userform1にテキストボックスを用意して実行しても、 テキストボックスに値は入らないです。
問題点を再現するまでのコードを含むドキュメントの投稿は、質問者がすることですよ!! 大変だ(というより、面倒)と言うことは、私もわかっていますけどね!!
新規ブックで試してください。
ユーザーフォームだけを用意してください。 中のコントロールは、コードで配置しますから、何もコントロールは配置しないでください。 ユーザーフォーム名は、UserForm1 とします。
このUserForm1のモジュールに
'======================================================================== Option Explicit Public kensaku As Boolean 'True:検索ボタンが押された Falsexボタンが押された Public txt As MSForms.TextBox Private WithEvents cmd As MSForms.CommandButton '======================================================================== Private Sub cmd_Click() kensaku = True Me.Hide End Sub '======================================================================== Private Sub UserForm_Initialize() With Me .Width = 300 .Height = 156 .Caption = "検索する数字を入力して、検索ボタンをクリック、検索中止は、Xボタンをクリック" Set txt = .Controls.Add("Forms.TextBox.1") With txt .Left = 30 .Top = 24 .Width = 150 .Height = 24 End With Set cmd = .Controls.Add("Forms.CommandButton.1") With cmd .Left = 30 .Top = 72 .Width = 54 .Height = 36 .Caption = "検索" End With End With kensaku = False End Sub '======================================================================== Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True Me.Hide End If End Sub
テキストボックス(検索する数字入力用)とコマンドボタン(検索開始ボタン)を が表示されるようになっています。
次に標準モジュールに
'====================================================================== Sub 検索() Dim ID As String Dim rng As Range Dim ansR As Range Call サンプルデータ作成 MsgBox "このシートのデータを検索します" With UserForm1 .Show If .kensaku = True Then ID = Application.Text(.txt.Text, "0 ;(0)") With Worksheets("リスト") Set rng = .Range("a1", .Cells(.Rows.Count, "a").End(xlUp)) Set ansR = rng.Find(what:=ID, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows) If Not ansR Is Nothing Then ansR.Select MsgBox ansR.Row & "行目に見つかりました" Else MsgBox ID & " は見つかりませんでした" End If End With End If End With Unload UserForm1 End Sub '======================================================================== Sub サンプルデータ作成() With ActiveSheet .Cells.ClearContents .Name = "リスト" With .Range("a1:a5") .Value = Application.Transpose(Array(7116320000000#, _ 7116320000001#, _ 7116320000002#, _ 7116320000003#, _ 7116320000004#, _ 7116320000005#)) .NumberFormatLocal = "0_);(0)" End With End With
End Sub
サンプルデータもコードで用意しましたから、何も入力されていないシートを アクティブにして、検索 を実行してください。
まず、アクティブシートにサンプルデータが作成されます。
メッセージボックスが表示されますから、サンプルデータを確認してOKボタンをクリック。
UserForm1が表示されますから、テキストボックスに検索する数値を入力して、 検索ボタンをクリックしてください(7116320000004)。
シートのA列を検索し、見つかれば、そのセルを選択し、その主旨のメッセージが表示されます。
試してみてください。
ichinose
追伸 前投稿で作動するとは思いますが(Win2000&Excel2002で確認)、Findメソッド使う方法が ベストか否かは別問題ですよ!!
A列のデータに重複値がないなら、ワークシート関数のMatchをVBA上で使う方法も考えられます。 重複値があっても、数値検索の場合は、Findメソッドより速い方法はいくつかありそうですよ!!
ichinose
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.