Один из способов заключается в использовании класс для хранения каждого набора значений:
Создать модуль класса и имя его clsCallDetails
.
Добавьте этот код в модуль:
Option Explicit
'Class module named 'ClsCallDetails'
Private pLogged As String
Private pName As String
Private pSite As String
Private pCallType As String
Private pOwner As String
Private pResponder As String
Private pReference As String
Public Property Get Logged() As String
Logged = pLogged
End Property
Public Property Let Logged(Value As String)
pLogged = Value
End Property
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Name(Value As String)
pName = Value
End Property
Public Property Get Site() As String
Site = pSite
End Property
Public Property Let Site(Value As String)
pSite = Value
End Property
Public Property Get CallType() As String
CallType = pCallType
End Property
Public Property Let CallType(Value As String)
pCallType = Value
End Property
Public Property Get Owner() As String
Owner = pOwner
End Property
Public Property Let Owner(Value As String)
pOwner = Value
End Property
Public Property Get Responder() As String
Responder = pResponder
End Property
Public Property Let Responder(Value As String)
pResponder = Value
End Property
Public Property Get Reference() As String
Reference = pReference
End Property
Public Property Let Reference(Value As String)
pReference = Value
End Property
Создайте обычный модуль и добавьте этот код к нему:
Edit: Первоначально был Find_CallNumbers
как функцию; изменили его на суб.
Option Explicit
'Normal Module
Public CallDetails As Collection
Public Sub Find_CallNumbers(NumberToFind As String)
Dim rng_to_search As Range
Dim rFound As Range
Dim FirstAddress As String
Dim FoundItem As clsCallDetails
Set CallDetails = New Collection
With ThisWorkbook.Worksheets("Database")
Set rng_to_search = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
With rng_to_search
'Look for the first instance.
Set rFound = .Find(What:=NumberToFind, _
After:=.Cells(1, 1), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchDirection:=xlNext)
If Not rFound Is Nothing Then
FirstAddress = rFound.Address
Do
Set FoundItem = New clsCallDetails 'Create a new instance of the class to hold the details.
With FoundItem
.Logged = rFound.Offset(, 1) 'Offset from column A by 1 column, so column B.
.Name = rFound.Offset(, 2)
.Site = rFound.Offset(, 3)
.CallType = rFound.Offset(, 4)
.Owner = rFound.Offset(, 5)
.Responder = rFound.Offset(, 6)
.Reference = rFound.Offset(, 7)
End With
CallDetails.Add FoundItem 'Add the class instance to our collection.
Set rFound = .FindNext(rFound) 'Look for the next value.
'Continue searching until we reach the top again.
Loop While Not rFound Is Nothing And rFound.Address <> FirstAddress
End If
End With
End Sub
Создайте форму, содержащую эти элементы управления (я поместил имена контроля над управлением):
Добавьте этот код в форме:
Option Explicit
Private Sub cmdFind_Click()
Find_CallNumbers Me.txtSearchNumber
Me.txtCurrentIndex = 1
PlaceValues (Me.txtCurrentIndex)
End Sub
Private Sub PlaceValues(Index As Long)
With Me
.txtLogged.Value = Format(CallDetails(Index).Logged, "HH:MM:SS")
.txtName.Value = CallDetails(Index).Name
'...
'...
End With
End Sub
Private Sub cmdNext_Click()
Me.txtCurrentIndex = Me.txtCurrentIndex + 1
PlaceValues (Me.txtCurrentIndex)
End Sub
Private Sub cmdPrevious_Click()
Me.txtCurrentIndex = Me.txtCurrentIndex - 1
PlaceValues (Me.txtCurrentIndex)
End Sub
При поиске для номера он найдет и отобразит детали первого найденного элемента. При нажатии кнопки Next/Previous вы перейдете к следующему экземпляру.
Вам нужно будет добавить проверку ошибок - например, когда она достигнет конца или начала коллекции или если искомый номер не найден.
Используйте 'Найти' и' FindNext', а не перебирайте данные. https://msdn.microsoft.com/en-us/library/office/ff839746.aspx –
Как мне написать код? Можешь ли ты показать мне? – user3528873
В этом случае у вас есть «UserForm», чтобы показать значения записи, но проблема в том, что вы только когда-либо видите * последнюю запись за 389905? Полагаю, вы хотите иметь возможность просматривать значения для нескольких записей 389905? –