2017-07-16 5 views
0

範囲(この場合は使用範囲)内のキーワード(例:数量、数量、数量、...など)を検索しようとしていますが、問題を経験する。UsedRange - VBA(Excel)でキーワードを検索

Private Function GetQtyColFromBOQ(thisBOQ As Worksheet) As Range 
    Dim QtyWord(5), QtyWordG, Delim As String 
    Dim cl As Range 

    If thisBOQ Is Nothing Then Set thisBOQ = ActiveSheet 

    Delim = "|#|" 

    QtyWord(0) = "Quantity" 
    QtyWord(1) = "Qty" 
    QtyWord(2) = "Qty." 
    QtyWord(3) = "Qnty" 
    QtyWord(4) = "Qnty." 

    QtyWordG = Delim & Join(QtyWord, Delim) 

    For Each cl In thisBOQ.UsedRange 
     If InStr(1, QtyWordG, Delim & cl.Value & Delim, vbTextCompare) Then 
      Set GetQtyColumnFromBOQ = cl ' function return 
      Exit For 
     End If 
    Next 
End Function 

方法2(動作しない)::いいえ試合はおそらく間違っている可能性が何

Private Function GetQtyColFromBOQ(thisBOQ As Worksheet) As Range 
    Dim QtyWord(5) As String 

    If thisBOQ Is Nothing Then Set thisBOQ = ActiveSheet 

    QtyWord(0) = "Quantity" 
    QtyWord(1) = "Qty" 
    QtyWord(2) = "Qty." 
    QtyWord(3) = "Qnty" 
    QtyWord(4) = "Qnty." 


    Dim i As Integer 
    For i = 0 To 4 
     Set GetQtyColumnFromBOQ = thisBOQ.UsedRange.Find(QtyWord(i), LookAt:=xlWhole) 
    Next i 
End Function 

を発見した私はInStrFor each cell in UsedRange

方法1(スロー)を使用していますので、検索が遅いです?

答えて

4

2番目の場合は、いくつかの問題があります。まず、Findの結果を代入すると関数名のスペルが間違っています。文字列内で一致するものを探すときは、LookAt引数にxlPartを使用する必要があります。次に、一致が見つかったら関数を終了する必要があります。また、引き数をオプションにすることができるように、引き数の前にキーワードOptionalを付ける必要があります。配列QtyWordと検索語の数の大きさの両方がYowE3Kのコメント通り、調整されていることを次のよう...

Private Function GetQtyColFromBOQ(Optional thisBOQ As Worksheet) As Range 
    Dim QtyWord(2) As String 

    If thisBOQ Is Nothing Then Set thisBOQ = ActiveSheet 

    QtyWord(0) = "Quantity" 
    QtyWord(1) = "Qty" 
    QtyWord(2) = "Qnty" 


    Dim i As Integer 
    For i = LBound(QtyWord) To UBound(QtyWord) 
     Set GetQtyColFromBOQ = thisBOQ.UsedRange.Find(QtyWord(i), LookAt:=xlPart, MatchCase:=False) 
     If Not GetQtyColFromBOQ Is Nothing Then 
     Exit Function 
     End If 
    Next i 

    Set GetQtyColFromBOQ = Nothing 
End Function 

注意してみてください。

+0

ループのこのフォーム(このスニペットには示されていないループのコードの一部)を使用することができます。私が間違ったことを確認しようとします。 – Tima

+0

(@Tima - これがうまくいけば、ポストの左にあるチェックマークをクリックして、答えとしてフラグを立てることができます) – BruceWayne

+0

'Dim QtyWord(5)As String'は' Dim QtyWord (4)As String' - インデックス5を使用しない場合は、インデックス5の位置を割り当てることはありません。 'xlPart'を検索すると、' 'Qty" 'が見つからなかった場合は' 'Qty。' 'を検索し、' 'Qnty ''が見つからなかった場合は '' Qnty。 。 – YowE3K

1

あなたも、おかげでそれが働いた

Dim wrd As Variant 

For Each wrd In Array("Quantity", "Qty", "Qty.", "Qnty", "Qnty.") 

    Set GetQtyColFromBOQ = thisBOQ.UsedRange.Find(wrd, LookAt:=xlPart, MatchCase:=False) 
    . 
    . 
Next wrd 
関連する問題