私はA1のユーザーのシリーズを持っているエクセルVBAの検索セル
列で検索し、「名前のリスト」に対して、セルA1内のすべてのユーザ を確認したいです。可能?、それが可能なExcelは、文字列を検索し、例えば、別の列
上の文字列の別の配列に対してそれを比較するためです。私はこのようになり、結果何かを見たい
C.
よろしく、 テリー
私はA1のユーザーのシリーズを持っているエクセルVBAの検索セル
列で検索し、「名前のリスト」に対して、セルA1内のすべてのユーザ を確認したいです。可能?、それが可能なExcelは、文字列を検索し、例えば、別の列
上の文字列の別の配列に対してそれを比較するためです。私はこのようになり、結果何かを見たい
C.
よろしく、 テリー
私は自分の答えを出してきたし、そのビット長いけれどもそれが働きました。
Sub search()
Dim users As Variant
Dim search As Boolean
Dim j As Integer
Dim found As Integer
Dim ArraySize As Integer
Dim listSize As Integer
Dim listOfUsers As Integer
listSize = 2
search = False
'Count number of teachers in List Of Users column
listOfUsers = Range("C2:C1000").Cells.SpecialCells(xlCellTypeConstants).Count
While Cells(listSize, 1).Value <> ""
found = 0
users = Split(Cells(listSize, 1).Value, ",")
ArraySize = UBound(users, 1) ' Find array size
'Loop until each cell string is done
For i = 0 To ArraySize
j = 2
While search = False
If Trim(users(i)) = Cells(j, 3).Value Then
Cells(listSize, 2).Value = Trim(users(i))
found = found + 1
search = True
ElseIf j > listOfUsers Then
search = True
Else
j = j + 1
End If
Wend
search = False
Next i
If found <> ArraySize + 1 Then
Cells(listSize, 2).Value = "Users not found"
Else
Cells(listSize, 2).Value = "All users found"
End If
listSize = listSize + 1
Wend
End Sub
よろしく、 テリー
あなたはDictionary
オブジェクト
Option Explicit
Sub search()
Dim usersRng As Range, cell As Range
Dim elem As Variant
Dim SearchResults As String
Dim searchResultsArray As Variant
Dim iCell As Long
Set usersRng = Range("A2", Cells(Rows.COUNT, "A").End(xlUp)) '<-- set usersRng in column "A" from row 2 down to last not empty row
ReDim searchResultsArray(1 To usersRng.COUNT) '<--| size the search result array to the actual number of cells to be processed
With CreateObject("Scripting.Dictionary") 'create and reference a 'dictionary'
'store all values from "list of users" column in reference dictionary
For Each cell In Range("C2", Cells(Rows.COUNT, "C").End(xlUp))
.Add cell.Value, Null
Next cell
For Each cell In usersRng '<--| loop through "users" column cells
SearchResults = "" '<--| initialize search results
For Each elem In Split(Replace(cell.Value, " ", ""), ",") '<--| loop through current cell users
If Not .Exists(elem) Then SearchResults = SearchResults & elem & "," '<--| if current user is not in the dictionary then update 'searchResults' string
Next elem
If SearchResults = "" Then '<--| if all users have been found...
SearchResults = "All users found" '<--| ... then set 'searchResults' accordingly
Else '<--| otherwise...
SearchResults = Left(SearchResults, Len(SearchResults) - 1) & " not found" '<--| ... add " not found" to the already built list of not found users
End If
iCell = iCell + 1 '<--| update 'searchResultsArray' index
searchResultsArray(iCell) = SearchResults '<--| update 'searchResultsArray'
Next cell
Range("B2").Resize(usersRng.COUNT).Value = Application.Transpose(searchResultsArray) '<--| write down 'searchResultsArray' from cell "B2" downwards
End With
End Sub
助けを求めるtks。 :) – xingtan
あなたは大歓迎です。辞書を使用すると、セルをループするよりもはるかに高速なコードを使用できます。配列を使用してセルに書き込む場合も同様です。最後に、私の答えがあなたの質問を解決したら、それを受け入れることができます。ありがとうございました! – user3598756
@ xingtan、私はあなたに依頼し続け、良い回答を得ているが、受け入れられたとしてマークすることはない。このサイトのルール(「誰かが私の質問に答えるとどうすればいいですか?」(http://stackoverflow.com/help/someone-answers)を参照)を表示するには、答えの横にあるチェックマークをクリックして、塗りつぶされたin_にグレー表示されます。ありがとうございました! – user3598756
はい、間違いなく可能性を使用することができます。 –