Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
InputBoxで検索する方法
投稿日時: 18/02/24 14:04:52
投稿者: hisayanxp

いつもお世話になります。
以下のような表があります。
セルには数字が入力されています。
  A   B   C  D  
1 氏名 国語 算数 理科
2 佐藤
3 鈴木
4 田中
5 井上
 
この中から「鈴木」さんのデータ行を選択する記述で、以下の式はできました。
________________________________________
Sub sample1()
    Dim i As Long
        For i = 2 To 5
            If Cells(i, 1) = "鈴木" Then
            Range(Cells(i, 1), Cells(i, 4)).Select
        Exit For
            End If
        Next i
End Sub
________________________________________
 
このとき記述の中に「鈴木」と入力せずにinputboxで聞いてくれるようにするにはどうしたらよいでしょうか?
ご教示ください。
見よう見まねで作ったのが下記です。もちろん動作しませんが。
Sub sample2()
    Dim i As Long
    Dim x As Integer
        x = "氏名を入力"
        InputBox = x
        For i = 2 To 5
         
            If Cells(i, 1) = x Then
            Range(Cells(i, 1), Cells(i, 4)).Select
        Exit For
            End If
        Next i
End Sub

回答
投稿日時: 18/02/24 14:33:41
投稿者: WinArrow
投稿者のウェブサイトに移動

●質問に対する回答
InputBoxからの入力値を受取るための変数を用意します。
Dim 氏名 As String
      氏名 = InputBox("氏名を入力して下さい")
        
※変数「x」をIntegerで宣言していますが、間違いです。
 InputBoxは、文字列を返しますから、たとえ、数字でもStringを使いましょう。
  
※InputBoxでは、「キャンセル」をクリックしたときの対応が必要です。
    If 氏名 = "" Then  ・・・・これが、「キャンセル」をクリックした判定です。
   最もボックスに何も入力せず、「OK」をクリックしても同じですが・・・
  
   
●For〜Nextのループで探すのは、無駄が多いし、レスポンスも悪いです。
  ワークシート関数が使えますので利用する方法を紹介します。
   
Dim RowX As Long
     
  If WorksheetFunction.Columns("A:A"),氏名) > 0 Then
          RowX = WorksheetFunction.Match(氏名, Columns("A:A"), 0)
          Cells(Rowx, "A").Resize(,4).Select
      End If
     
  ※「Select」せずに、何かしたいのでしたらそのメソッドを記述しましょう
 たとえば、Copy
だったら
        Cells(Rowx, "A").Resize(,4).Copy
のように!・・・・
  

回答
投稿日時: 18/02/24 14:39:56
投稿者: WinArrow
投稿者のウェブサイトに移動

コードが動かないのは、もちろんですが、
> Dim x As Integer
> x = "氏名を入力"
「型が違います」って、Excel君が怒っていませんか?
動かない以前の問題です。
 
それから
OS、Excelのバージョンは必ず書いてくださいね・・・

回答
投稿日時: 18/02/24 17:16:19
投稿者: WinArrow
投稿者のウェブサイトに移動

紹介のコードに間違いがあり、訂正します。
 
Dim RowX As Long
       
  If WorksheetFunction.Countif(Columns("A:A"),氏名) > 0 Then
       RowX = WorksheetFunction.Match(氏名, Columns("A:A"), 0)
       Cells(Rowx, "A").Resize(,4).Select
   End If
      

回答
投稿日時: 18/02/25 11:49:43
投稿者: i-brown

いつまでも他人に頼らず、自分で調べましょう。
 
以下、Rangeオブジェクトを使った回答例です。
同じ名字の人が2名以上居る場合は、そちらで工夫してください。

' シートモジュールに記載してください。
Option Explicit

Public Sub Test()
    Dim whom As String
    whom = InputBox("誰を探しますか?", "検索氏名")
    If whom = "" Then Exit Sub  ' キャンセル
    
    Dim rng As Range
    Set rng = Range(Cells(2, 1), Cells(UsedRange.Rows.Count, 1)).Find(whom)
    If rng Is Nothing Then
        MsgBox "居ません!"
        Exit Sub
    End If
    
    ' Ragneオブジェクトが返ってきたら、好きな処理をする。
    Debug.Print rng.Row
End Sub

 
最終的にはMSDNに書いてある内容が理解できなければ、いつまで経っても「教えて君」のままです。
 
InputBox
https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/inputbox-function
 
Rangeオブジェクト
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/range-object-excel

投稿日時: 18/02/25 13:59:24
投稿者: hisayanxp

WinArroeさん、r-brownさん
ありがとうございました。
投稿する前にもっと自分で苦闘するべきでした。

投稿日時: 18/02/25 14:00:33
投稿者: hisayanxp

すみません。解決済みです。