Excel - Намерете конкретен номер в списъка?
Проблем
Бих искал да създам макрос в Excel, както следва:- Когато щракнете върху командния бутон, трябва да въведете номера в полето за въвеждане.
- След като въведете номера, той трябва да ни отведе до клетката, която има номера, а последната трябва да бъде запълнена с текущото време.
Шаблонът е както следва:
Когато кликнете върху командата и въведете номера 307304 в полето за въвеждане. тя трябва да ме доведе до конкретната клетка и да бъде уловено началното време. Ако щракна отново, крайният час трябва да бъде заловен. (тези стойности ще се използват за изчисляване на текущото време).
Служител # Време за край на времето за стартиране307301
307302
307303
307304
307305
307306
307307
307308
307309
307310
Решение
Опитайте тази. Процедурата за използване е doTimeStamp- Идеята е да свържете тази процедура с командния бутон. Когато кликнете върху него, ще попитате за emp id и ще въведете началната дата (ако е празна) или крайната дата (ако е празна) и след това ще ви подкани отново за следващия идентификатор. Тя ще ви помоли за id, докато не въведете празно място и тази точка ще излезе.
Опция ИзричноПублично под doTimeStamp ()
Дим lRow As Long
Dim sSearchText As String
Dim lEmpID As Long
Dim sTgtSheet As String
'името на листа, където са идентификаторите
sTgtSheet = "Лист1"
правя
sSearchText = InputBox ("Моля, въведете ID на служителя", "Запис на време")
sSearchText = Отрязване (sSearchText)
Ако (sSearchText = vbNullString) _
Тогава
"не са въведени данни. след това се откажете
GoTo Loop_Bottom
Край Ако
Ако не е (IsNumeric (sSearchText)) _
Тогава
"въведеният текст не е числов.
MsgBox "Невалиден идентификатор на служител. Идентификаторът на служителя може да бъде само цифри. Опитайте отново", vbExclamation + vbOK
GoTo Loop_Bottom
Край Ако
Ако (InStr (1, sSearchText, ".")> 0) _
Тогава
"Въведеният текст имаше десетичен знак.
MsgBox "Невалиден идентификатор на служител. Идентификаторът на служителя може да бъде само цифри. Опитайте отново", vbExclamation + vbOK
GoTo Loop_Bottom
Край Ако
"Намерете реда в колона 1
lRow = getItemLocation (sSearchText, Sheets (sTgtSheet) .Колони (1))
Ако (lRow = 0) _
Тогава
"търсенето не върна никакъв удар
MsgBox "ID на служител не е намерен. Опитайте отново", vbInformation + vbOKOnly
GoTo Loop_Bottom
Край Ако
Ако (Листове (sTgtSheet) .Cells (lRow, "B") = vbNullString) _
Тогава
'клетката на намерения ред има празно поле B
Листове (sTgtSheet) .Клетки (lRow, "B") = Сега
ElseIf (Листове (sTgtSheet) .Калони (lRow, "C") = vbNullString) _
Тогава
'клетката на намерения ред има празна колона С
Листове (sTgtSheet) .Клетки (lRow, "C") = Сега
още
в клетката на намерения ред се попълват колони В и С
MsgBox "Начален и краен час вече е записан за служител" & sSearchText, vbInformation + vbOKOnly
Край Ако
Loop_Bottom:
'loop till sSearchText е празна
Цикъл докато (sSearchText vbNullString)
Край Под
Публична функция getItemLocation (sLookFor As String, _
rngSearch As Range, _
Незадължително bFullString As Boolean = True, _
Незадължително bLastOccurance As Boolean = True, _
Незадължително bFindRow Като булева = True) Долу
'За да намерите първия / последния ред / колона в диапазон за определен низ
Тънка област като обхват
Dim iLookAt As Integer
Dim iSearchDir As Integer
Dim iSearchOdr As Integer
Ако (bFullString) _
Тогава
iLookAt = xlWhole
още
iLookAt = xlPart
Край Ако
Ако (bLastOccurance) _
Тогава
iSearchDir = xlPпреди
още
iSearchDir = xlNext
Край Ако
Ако не е (bFindRow) _
Тогава
iSearchOdr = xlByColumns
още
iSearchOdr = xlByRows
Край Ако
С rngSearch
Ако (bLastOccurance) _
Тогава
Задаване на клетка = .Find (sLookFor, .Cells (1, 1), xlValues, iLookAt, iSearchOdr, iSearchDir)
още
Задаване на клетка = .Find (sLookFor, .Cells (.Rows.Count, .Columns.Count), xlValues, iLookAt, iSearchOdr, iSearchDir)
Край Ако
Край с
Ако тогава клетката е нищо
getItemLocation = 0
ElseIf Not (bFindRow) _
Тогава
getItemLocation = Cell.Column
още
getItemLocation = Cell.Row
Край Ако
Задаване на клетка = нищо
Крайна функция
Благодарение на rizvisa1 за този съвет.