データ検索について

このQ&Aのポイント
  • シートAとシートBを使用し、ユーザーフォームで商品データを検索する方法についてのコードです。
  • コードの一部がデバッグエラーになっており、正常に機能しないため、修正方法を教えて頂きたいです。
  • 10kg、20kg、100kgの値が数字に変換されない問題もあります。
回答を見る
  • ベストアンサー

データ検索について

条件詳細 ・シートは、シートA/シートB。 ・シートAにユーザーフォームを表示するボタンを置く。 ・シートBに商品データ。 ・ユーザーフォームのオブジェクト名は、商品登録。 ・ ユーザーフォームにある項目は、商品番号/商品名/重さの3種類。  ※テキストボックス ・重さは、3種類((1)10kg/(2)20kg/(3)100kg)。 ・検索ボタンを押すと、検索フォームが表示される。 上記条件の下、ユーザーフォームに検索したデータを表示させたいのですが、 私のコードだと、デバックが出てしまい、うまく機能しません。 どのように追加または改造すれば、機能するのか ご教授願います。 私のコードは下記の通りです。 Private Sub cmd検索_Click() Dim SerchKey As String Dim SerchArea As Range lRow = Sheets("商品データ").Cells(65536, "A").End(xlUp).Row + 1 SearchKey = Application.InputBox( _ Prompt:="商品コードを入力して下さい。", Type:=2) If SearchKey = "" Or SearchKey = "False" Then Exit Sub End If Set SearchArea = Sheets("商品データ").Range(Range("A1"), Range("A1").End(xlDown))  ⇒このコードが黄色でデバック! Set FoundCell = SearchArea.Find( _ What:=SearchKey, _ SearchOrder:=xlByRows, _ LookAt:=xlWhole, _ MatchCase:=False) If FoundCell Is Nothing Then MsgBox "見つかりません", vbCritical GoTo ExitHandler End If With FoundCell 商品登録.txt商品コード.Value = .Value 商品登録.txt商品名.Value = .Offset(0, 1).Value 商品登録.txt重さ.Value = .Offset(0, 2).Value End With With Sheets("シートA") If .Cells(lRow, "G").Value = "10kg" Then txt重さ.Value = "0" ElseIf .Cells(lRow, "G").Value = "20kg" Then txt重さValue = "1" ElseIf .Cells(lRow, "G").Value = "100kg" Then txt重さ.Value = "2" End If End With ExitHandler: Set SearchArea = Nothing Exit Sub End Sub 下記がデバック(黄色)が出てしまいます。 Set SearchArea = Sheets("商品ータ").Range(Range("A1"), Range("A1").End(xlDown))   また、10kg/20kg/100kgが数字((1)(2)(3))に変換されません。 If~が機能してないようです。 どのようにしたら良いかお願いします。

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

  • ベストアンサー
  • Masa2072
  • ベストアンサー率51% (94/182)
回答No.2

>Set SearchArea = .Sheets("商品データ").Range(.Range("A1"), .Range("A1").End(xlDown)) すいません、この部分に間違いがありました。 Set SearchArea = .Range(.Range("A1"), .Range("A1").End(xlDown)) としてください。

fumfumponp
質問者

お礼

ありがとうございます。 反応しました! 1歩前へ進むことができました。 また、If~部分もできました。 そこで一つ質問なのですが、 If~部分で 文字(りんご、みかん等)を 数字で入力させることも可能なのでしょうか? 例 りんご=0、みかん=1、いちご=3 よろしくお願いします。

その他の回答 (1)

  • Masa2072
  • ベストアンサー率51% (94/182)
回答No.1

>下記がデバック(黄色)が出てしまいます。 > >Set SearchArea = Sheets("商品データ").Range(Range("A1"), Range("A1").End(xlDown)) 商品データシートが表示されている状態であれば問題ありませんが、別シートが表示された状態ではエラーになります。 With Sheets("商品データ") Set SearchArea = .Sheets("商品データ").Range(.Range("A1"), .Range("A1").End(xlDown)) End With と変更する > If~が機能してないようです。 10kg 10Kg 10KG 10kg など全て別の文字として扱われます。 Sheet中の表記を統一するのはもちろんのこと、万が一別表記が現れても対応するのであればStrConvを用いて同一表記に変換したのちIf文で評価という流れを取ります。 Weight = Sheets("シートA").Cells(lRow, "G").Value Weight = StrConv(Weight, vbNarrow) '半角化 Weight = StrConv(Weight, vbLowCase) '小文字化 If Weight = "10kg" Then txt重さ.Value = "0" ElseIf Weight = "20kg" Then txt重さ.Value = "1" ElseIf weight = "100kg" Then txt重さ.Value = "2" End If

fumfumponp
質問者

お礼

Masa2072さん、ありがとうございます。 しかし、 >商品データシートが表示されている状態であれば問題ありませんが、別シートが表示された状態ではエラーになります。 With Sheets("商品データ") Set SearchArea = .Sheets("商品データ").Range(.Range("A1"), .Range("A1").End(xlDown)) End With と変更する が変更させたのですが、どうしてもデバックエラーがまだ出てしまいます。なぜなのでしょうか? お手数お掛けしますが、よろしくお願いします。 ちなみにIf~はまだ確認取れていません。 すみません。上記エラーが前提になってしまうので・・・。

関連するQ&A

  • データ検索&セルの背景色変更

    ユーザーフォームを利用し、データの検索結果をユーザーフォームへ表示させ 一部の情報を変更・上書きした上で、その元データのセル背景色を変更したいのですが・・・どうもうまくできません。 ご助力お願いします。 ≪詳細≫ シートAは、データシートとしての表となっている。(商品データ) シートBは、廃棄商品のデータシート。(廃棄商品) 登録番号  商品名  型番  状況 11111   りんご  @@@  在庫 22222   みかん  !!!  在庫 33333   いちご  ###  在庫 検索ボタン   更新ボタン ※ユーザーフォームで、登録番号を入力+検索ボタンクリックすると、テキストボックス(ユーザーフォーム上)に登録番号・商品名・型番・状況が表示されるようになっている。 ※更新ボタンを押すと、廃棄商品シートへ入力される。 検索・表示後、状況を「在庫→廃棄」に変更し上書きする。 ※上書き・・・データのあった列・行に上書きする。 例 2列目にあるみかんの検索の場合、   「22222」を入力・検索し、ユーザーフォーム上に   「22222」「みかん」「!!!」「在庫」を表示させる。   「在庫」のみを「廃棄」に変更し、2列目の状況のみを変え   上書きする。 上書き後、この2列目の「22222」「みかん」「!!!」「廃棄」の セル背景色をグレーに変更する。 ちなみに上書き&背景色変更は、更新ボタンのワンクリックにて 動作させたいのですが、検索したデータを指定するコードがわかりません。 宜しくお願いします。 まだまだVBA初級者のため、具体的に教えて頂けると有難いです。 Private Sub cmd検索_Click() Dim SerchKey As String Dim SerchArea As Range Dim lRow As Long lRow = Sheets("商品データ").Cells(65536, "A").End(xlUp).Row + 1 SearchKey = Application.InputBox( _ Prompt:="登録番号を入力して下さい。", Type:=2) If SearchKey = "" Or SearchKey = "False" Then Exit Sub End If Set SearchArea = Sheets("商品データ").Range(Sheets("商品データ").Range("A1"), Sheets("商品データ").Range("A1").End(xlDown)) Set FoundCell = SearchArea.Find( _ What:=SearchKey, _ SearchOrder:=xlByRows, _ LookAt:=xlWhole, _ MatchCase:=False) If FoundCell Is Nothing Then MsgBox "見つかりません", vbCritical GoTo ExitHandler End If With FoundCell 商品登録.txt登録番号.Value = .Value 商品登録.txt商品名.Value = .Offset(0, 1).Value 商品登録.txt型番.Value = .Offset(0, 2).Value 商品登録.txt状況.Value = .Offset(0, 3).Value 商品登録.txt状況.SetFocus End With ExitHandler: Set SearchArea = Nothing Exit Sub End Sub Private Sub cmd更新_Click() Dim lRow As Long lRow = Sheets("廃棄商品").Cells(65536, "A").End(xlUp).Row + 1 With Sheets("廃棄商品") .Cells(lRow, "B").Value = 商品登録.txt登録番号.Value .Cells(lRow, "A").Value = 商品登録.txt商品名.Value .Cells(lRow, "C").Value = 商品登録.txt型番.Value .Cells(lRow, "D").Value = 商品登録.txt状況.Value   End With MsgBox "廃棄商品シートへ登録しました。", vbInformation End Sub

  • FIND関数について教えてください

    EXCEL VBAを使って、検索ツールを作成中です。 1,sheet1のセルA1に入力されたものをsheet2,3の特定の列から検索して、結果のすべてをsheet1 A2以下に表示する。 2,1の検索結果(A2以下)をそれぞれsheet2,3から更に検索する。  ※sheet2,3のA列からsheet1A1を検索し、同じ行のC,D列のデータをsheet1A2以下に持ってくる  ※A2以下の検索結果は複数。sheet2,3のA列からsheet1A2以下を検索し、C列から横に更なる検索結果があればそれを表示して行きたい。 まず書いたのは下記のようなもの Sub 検索() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells("A:A") .Find(What:=sh1.range("A1").value) If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell FoundCell.Resize(1, 2).Copy Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else FoundCell.Resize(1, 2).Copy Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Loop End Sub 検索1()として If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub を、 If FoundCell Is Nothing Then 検索2 と表記を変えて実行したのですが、見つからなかった場合、「見つかりません」のメッセージと共に「実行エラー5」で「 Set FoundCell = Cells.FindNext(FoundCell)」が示されます。 また、A2以下という曖昧な検索セルを指定する方法が分かりません。  set str=sheet1.Cells(i,1).value というようなこともしてみたのですが、エラーになってしまいました。 なにかアイディアを教えてください。

  • ExcelVBA データのコピー範囲について

    あけましておめでとうございます。今年もよろしくお願いします。 Sub Test() Dim myTarget As Range, r As Range, f Set myTarget = Sheets("Sheet1"). _    Range("B2", Sheets("Sheet1").Range("B65536").End(xlUp)) For Each r In myTarget  Set f = Sheets("Sheet2").Columns(1). _    Find(r.Value, Sheets("Sheet2").Range("A1"), Lookat:=xlWhole)  If Not f Is Nothing Then    If r.Offset(0, 3).Value <> f.Offset(0, 3).Value Then      f.Resize(1, 4).Copy Destination:= _      Sheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0)    End If  End If Next r End Sub 前回の質問で教えていただいたコードなのですが、現時点では、B列のデータを元にして二つのSheetのデータを比較して別Sheetへコピーしているのですが、そのときに、B列以降の(たとえば、B列からX列まで)データはコピーできますが、A列もコピーしたい時はどうすればよいのかで、悩んでいます。どの様に変更すればよいのでしょうか?

  • 【Excel VBA】ワークシートの表示(続き)

    すみません。 追記が出来なかったため、コードの続きをこちらに記載します。 For i = 1 To 12 If actsht = tmp(i) Then Flag = 1 Anser = MsgBox("翌月分シートを作成しますか?", vbYesNo + vbDefaultButton1, "確認") If Anser = vbYes Then ActiveSheet.Copy After:=ActiveSheet ActiveSheet.Name = tmp(i + 1) Sheets(actsht).Tab.ColorIndex = 2 Sheets(actsht).Range("B3").Value = Sheets("Sheet2").Range("A1").Value Sheets(actsht).Range("B4").Value = Sheets("Sheet2").Range("A2").Value ActiveSheet.Range("A2").Select Exit For ElseIf Anser = vbNo Then Exit For End If End If Next If Flag = O Then MsgBox ("新しいワークシートを作成出来ません。") End If If actsht = tmp(i) Then If Sheets(元データ).Visible = False Then Sheets(元データ).Visible = True End If End If End Sub

  • エクセルVBAでデータ検索の方法

    自分は技術者ではないのですがエクセルのVBAで質問があります。 エクセルで作ったデータをフォームから検索して一件ずつ表示するにはどうしたらよいでしょうか? 途中まで作ったのですが、自分の方法としては「シート1」にあるデータを変数に入れ、その変数をフォームに出力させるというものなんですが、もっと簡単な方法はないでしょうか? 変数a = 2 : 変数b = 1 For 変数a = 2 To 65536 If Sheets("シート1").Range("A" & 変数a) = Empty And 変数a = 2 Then MsgBox "データがありません" GoTo 終わり ElseIf Sheets("シート1").Range("A" & 変数a) <> Empty Then 項目1(変数b) = Sheets("シート1").Range("A" & 変数a) 項目2(変数b) = Sheets("シート1").Range("B" & 変数a) 項目3(変数b) = Sheets("シート1").Range("C" & 変数a) 変数b = 変数b + 1 ElseIf Sheets("シート1").Range("A" & 変数a) = Empty Then GoTo 終わり End If Next 終わり: こんな感じにしたいです。↓ ​http://hp1.cafesta.com/hp/album_photo_read.do?hpid=miya05&menu_...​

  • ユーザーフォームのデータ

    ユーザーファームを2つ作成しました。 そのユーザーフォームのデータを表の最終行に追加をしたいのです。 Range("A65536").End(xlUp).Offset(1,0).select を使おうと思っていますが、うまくいきません。 どなたか教えてください。 <ユーザーフォーム1> Private Sub CommandButton1_Click() Sheet2.Range("H7") = TextBox1 Sheet2.Range("I7") = TextBox2 Sheet2.Range("J7") = TextBox3 Sheet2.Range("K7") = TextBox4 Sheet2.Range("L7") = TextBox5 Sheet2.Range("P7") = TextBox6 If CheckBox1.Value = True Then Worksheets(2).Range("M7") = "0:30" Else Worksheets(2).Range("M7") = "0:00" End If If CheckBox2.Value = True Then Worksheets(2).Range("R7") = "1000" Else Worksheets(2).Range("R7") = "0" End If If CheckBox3.Value = True Then Worksheets(2).Range("S7") = "3000" Else Worksheets(2).Range("S7") = "0" End If If CheckBox4.Value = True Then Worksheets(2).Range("T7") = "1500" Else Worksheets(2).Range("T7") = "0" End If Unload Me End Sub <ユーザーフォーム2> Private Sub CommandButton1_Click() Sheet2.Range("V7") = TextBox1 Sheet2.Range("W7") = TextBox2 Sheet2.Range("X7") = TextBox3 Unload Me End Sub

  • 重複データーの上書き

    行き詰っています。 よろしくお願いします。 下の構文では、 エラー:オブジェクトは、このプロパティまたはメソッドをサポートしていません と、表示されます。 ”コンボボックス1のデーターと重複しているセル(B2:B50)を探してその行の データーを上書きしたいのです” Private Sub CommandButton1_Click() Dim Mynumber As String Dim FoundCell As Range Sheets("AA").Range("B2:B50").Select Mynumber = ユーザーフォーム.コンボボックス1.Value Set FoundCell = Cells.Find(What:=Mynumber, After:=ActiveCell, _ LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, _ MatchByte:=False) If FoundCell Is Nothing = False Then FoundCell.Select Sheets("AA").Offset(0, 0).Select = Me.コンボボックス1.Value Sheets("AA").Offset(0, 1).Select = Me.テキストボックス1.Value Sheets("AA").Offset(0, 2).Select = Me.テキストボックス2.Value Sheets("AA").Offset(0, 3).Select = Me.テキストボックス3.Value End If Exit Sub End Sub

  • エクセルVBA 双方向での書式のリンク方法

    エクセルVBAにて双方向での書式のリンクをさせたいと考えています。 具体的にはセルの背景色の双方向リンク方法について教えていただきたいです。ここで双方向での背景色のリンクとは別々のシート上のセルの背景色をどちら側の変更であっても、もう一方に変更を反映させることです。 【シート1】 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("Sheet2").Range("$A$1").Value = Sheets("Sheet1").Range("$A$1").Value Sheets("Sheet2").Range("$A$1").Interior.ColorIndex = Sheets("Sheet1").Range("$A$1").Interior.ColorIndex End If End Sub 【シート2】 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("Sheet1").Range("$A$1").Value = Sheets("Sheet2").Range("$A$1").Value Sheets("Sheet1").Range("$A$1").Interior.ColorIndex = Sheets("Sheet2").Range("$A$1").Interior.ColorIndex End If End Sub 上記のコードを記述しています。値のリンクはできているのですが背景色のリンクがどうしてもうまくできません。どちらかの変更と同時にもう一方の背景色も変更されるようにするにはどうすればよいでしょうか? どんな方法でもかまいませんのでお詳しい方よろしくお願いします。

  • Excel VBA テキストボックスを検索

    テキストボックス3に数値を入力し ExcelのA列にあるか検索をかける。 ある場合は、B列の同じ行に 「みーつけた!」と入力。 その設定で組んでみたのですが、 テキストボックス3にデータを6桁入力しようとすると 6桁目にオーバーフローエラーが出ます。 このプログラムの何処がおかしいのでしょうか? Private Sub TextBox3_Change() Dim Number As Integer If TextBox3.Value <> "" Then '空じゃない場合 Number = TextBox3.Value Call 検索(Number) MsgBox TextBox3.Value End If End Sub Sub 検索(ByVal Number As Variant) Dim FoundCell As Range Set FoundCell = Range("A:A").Cells.Find(What:=Number, lookat:=xlPart) If FoundCell Is Nothing Then Else FoundCell.Activate Range("O" & ActiveCell.Row).Value = "みーつけた!" End If End Sub

  • Excelのユーザーフォームで別のファイルに転記

    Excel2007です。 マクロを含んだデータファイルがあるのですが、マクロブックとデータブックは分割した方がよいと言われて今分割の方法を試しています。 「マクロブック.xlsm」にマクロを記述し、「商品在庫Data.xlsm」にデータが格納されています。 (まだ試験中で完全に分割できていないのでデータブックもxlsm形式ですが) マクロブックのユーザーフォームから「商品在庫Data.xlsm」ファイルの「商品マスタ」というシートに転記したいのですが、どうやっても「商品在庫Data.xlsm」で「商品マスタ」シートを指定して転記できません。 ユーザーフォームのコードは下記のような内容です。 「HinTouroku」コマンドボタンを押した時に商品マスタシートに内容が転記されるようになっています。 Option Explicit Private Sub HinTouroku_Click() '商品登録 Dim lRow As Long Dim s1 As String, s2 As String Dim Ctrl As Control With Workbooks("商品在庫Data.xlsm") Worksheets ("商品マスタ") lRow = .Range("A" & Rows.Count).End(xlUp).Row s1 = .Cells(lRow, "A").Value s2 = txtHinId.Text If s1 = s2 Then MsgBox "商品IDが重複しています" Exit Sub End If lRow = lRow + 1 .Cells(lRow, "a").Value = txtHinId.Text .Cells(lRow, "b").Value = txtSyohinmei.Text .Cells(lRow, "c").Value = txtHinRyaku.Text End With For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next End Sub Private Sub TourokuClr_Click() '入力フォームのクリア Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then _ myCtrl.Value = vbNullString Next End Sub Private Sub TourokuCls_Click() 'フォームを閉じる Unload Me End Sub http://vbaexcel.seesaa.net/category/7604114-2.html このサイトを参考にしながら書いてみたのですがどうしてもシートの指定ができず… どのように記述すればよいのでしょうか?