2017-02-20 14 views
1

私は、手動で入力して検索ループを実行し、見つかった項目のすぐ右の列の情報を選択しています。検索結果を保存してアドレスのリストを返します

すぐに結果を表示するのではなく、検索の最後にテーブルとしてMessageboxに表示します。

したがって、私は何らかの種類のメモリスタックやアレイを必要としますが、これを実装する方法はわかりません。

私はこれまでにコードを書くことができました。検索はうまくいきました。情報収集はできません。誰かが助けることができますか?

Sub Find_Tag() 

Dim lr&, i& 
Dim myTag As String 
lr = Range("E" & Rows.Count).End(xlUp).Row 

myTag = InputBox("Enter Tag. " & Chr(10) & "Use the syntax bellow:" & Chr(10) & "" & Chr(10) & " J-XXXX") 

For i = 1 To lr 
    If Cells(i, "E").Value = myTag Then 
     Cells(i, "E").Select 
     Cells(i, "G").Select 
     Cells(i, "P").Select 

     MsgBox Cells(i, "E").Value & " " & Cells(i, "G").Value & " " & Cells(i,"P").Value 
    End If 
Next i 

End Sub 
+1

リストボックスを持つuserformを作成し、それにアイテムを追加することができます(@Vityataの答えで@Shaiで述べた最大文字列の長さは避けてください)。私は 'Find'と' FindNext'も使用します。これは、すべての行をループするよりも高速です。 –

+0

ダレンと同意する。または、オートフィルタで再作成範囲 – brettdj

答えて

0

私はあなたが使用している役に立たない.Select除き、あなたのコードに問題がありません。

Sub Find_Tag() 
Dim lr&, i& 
Dim myTag As String 
Dim result As String 
lr = Range("E" & Rows.Count).End(xlUp).Row 

myTag = InputBox("Enter Tag. " & Chr(10) & "Use the syntax below:" & Chr(10) & "" & Chr(10) & " J-XXXX") 

For i = 1 To lr 
If Cells(i, "E").Value = myTag Then 
    result = Cells(i, "E").value & " " & Cells(i, "G").value & " " & Cells(i, "P").value 
    MsgBox result 
End If 
Next i 

End Sub 

これはあなたの投稿と同じですが、空でない値をターゲティングしていますか?

0

以下のコードは、列 "E"の値がmyTagStringArr配列にある列 "E"、 "G"、 "P"の値を読み取ります。

ループの終わりには、占有されている各配列要素をMsgBoxに表示します。

Sub Find_Tag() 

Dim lr&, i&, j& 
Dim myTag As String 
Dim StringArr() As Variant 

lr = Range("E" & Rows.Count).End(xlUp).Row 

myTag = InputBox("Enter Tag. " & Chr(10) & "Use the syntax bellow:" & Chr(10) & "" & Chr(10) & " J-XXXX") 

ReDim StringArr(1 To 1000) '<-- init to large size , optimize the size later 
j = 1 
For i = 1 To lr 
    If range("E" & i).Value = myTag Then 
     StringArr(j) = Range("E" & i).Value & " " & Range("G" & i).Value & " " & Range("P" & i).Value 
     j = j + 1 
    End If 
Next i 

ReDim Preserve StringArr(1 To j - 1) '<-- optimize array size 

For i = 1 To UBound(StringArr) ' display all array elements in message box 
    MsgBox StringArr(i) 
Next i 

End Sub 
1

メッセージを増分してMessageBoxに表示できます。このような 何か:

dim strMessage as string 
dim strSpace as string 
strSpace = " " 

For i = 1 To lr 
    If Cells(i, "E").Value = myTag Then 
     strMessage = strMessage & strSpace & Cells(i, "E").value 
     strMessage = strMessage & strSpace & Cells(i, "G").value 
     strMessage = strMessage & strSpace & Cells(i, "P").value 

    End If 
Next i 

MsgBox strMessage 
+0

と思っていましたが、100を超える一致があった場合にはどうなりますか?結果的に 'String'が大きすぎますか? –

+0

@Shai Rado - OPは答えを1行で求めます。 30以上あればすでに醜いでしょう。 – Vityata

+0

こんにちは、入力いただきありがとうございます、それはすでにかなりよく見えます。私は最後のstrMessageの最後に "&vbNewLine"を追加しました。私はあまりにも多くの結果を数えていないので、stringlengthは問題ではありません。 – user36510

0
  • Findを使用すると、あなたも成功した試合が行われたE,G and Pの3列の範囲をactivitatingで見つかったアドレス(rng2
  • コードが終了するので動作するように範囲を持っていることを意味しますEにおいて(rng3

コード

Sub PlanB() 
    Dim rng1 As range 
    Dim rng2 As range 
    Dim rng3 As range 
    Dim strMyTag As String 
    Dim strAdd As String 

    strMyTag = InputBox("Enter Tag. " & Chr(10) & "Use the syntax below:" & Chr(10) & "" & Chr(10) & " J-XXXX") 

    Set rng1 = Columns("E:E").Find(strMyTag, , xlFormulas, xlWhole) 

    If Not rng1 Is Nothing Then 
     strAdd = rng1.Address 
     Set rng2 = rng1 
     Do 
      Set rng1 = Columns("E:E").FindNext(rng1) 
       If Not rng1 Is Nothing Then 
       If rng1.Address = strAdd Then Exit Do 
       Set rng2 = Union(rng2, rng1) 
      Else 
       Exit Do 
      End If 
     Loop 
    Else 
     MsgBox strMyTag & " not Found" 
     Exit Sub 
    End If 

    MsgBox strMyTag & " has been found these locations: " & rng2.Address 

Set rng3 = Union(rng2, rng2.Offset(0, 2), rng2.Offset(0, 11)) 
Application.Goto rng3 

End Sub 
関連する問題