[[20090915170723]] 『13桁の数値の検索』(まー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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)

ごめんなさい。そのとおりです。
こぴぺしなかったもので適当に書いてしまいました。
set c=sheets("リスト").range("A1").CurrentRegion.Columns("A").find(what:=ID,lookin:=xlvalues,lookat:=xlwhole,searchorder:=xlbyrows)

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

みなさんありがとうございます。
HANAさんのいうとおりに別のユーザーフォームの挿入してみましたが、検索にひっかかりません。
ちなみにsheets("リスト")のA2セルと同じIDをテキストボックスに入力して

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.