Excel - O macro pentru a găsi un anumit număr într-o listă
Problema
Încerc să scriu o macrocomandă în Excel, care trebuie să îndeplinească funcțiile de mai jos:- Când faceți clic pe butonul de comandă, ar trebui să solicitați introducerea numărului în caseta de introducere.
- După introducerea numărului, ar trebui să ne ducă la celula care are numărul.
- și celula corespunzătoare trebuie umplută cu timpul curent.
Șablonul este după cum urmează:
Când fac clic pe butonul de comandă și introdu numărul 307304 în caseta de introducere. ar trebui să mă ducă la celula specială și în cazul în care timpul de start ar trebui să fie capturat. Dacă dau din nou clic, timpul de terminare ar trebui capturat. (aceste momente ar trebui să fie ora curentă).
# Timp de începere a angajatului # Ora de începere a începerii307301
307302
307303
307304
307305
307306
307307
307308
307309
307310
Soluţie
Acest lucru. Rutina de utilizat este doTimeStampIdeea este că ați atașat această rutină butonului de comandă. Când faceți clic pe el, acesta va solicita emise și va completa data de începere (dacă este necompletată) sau data de încheiere (dacă este necompletată) și apoi vă va cere din nou id-ul următor. Va continua să vă ceară id până când veți introduce un gol și în acest punct va renunța.
Opțiune explicită
Public Sub doTimeStamp ()
Dim LRow As Long
Dim sSearchText Ca șir
Dim timp de lungă durată
Dim sTgtSheet ca șir
"numele fișei unde sunt identice
sTgtSheet = "Sheet1"
Do
sSearchText = InputBox ("Introduceți ID-ul angajatului", "Înregistrare timp")
sSearchText = Trim (sSearchText)
Dacă (sSearchText = vbNullString) _
Atunci
"nu au fost introduse date. apoi renunțați
GoTo Loop_Bottom
Terminați Dacă
Dacă nu (IsNumeric (sSearchText)) _
Atunci
"textul introdus nu a fost numeric.
MsgBox "ID-ul angajatului este invalid. ID-ul angajatului poate fi doar cifre. Încercați din nou", vbExclamation + vbOKOnly
GoTo Loop_Bottom
Terminați Dacă
Dacă (InStr (1, sSearchText, ".")> 0) _
Atunci
"textul introdus a avut o zecimală.
MsgBox "ID-ul angajatului este invalid. ID-ul angajatului poate fi doar cifre. Încercați din nou", vbExclamation + vbOKOnly
GoTo Loop_Bottom
Terminați Dacă
'localizați rândul din coloana 1
lRow = getItemLocation (sSearchText, Sheets (sTgtSheet) .Columns (1))
Dacă (lRow = 0) _
Atunci
căutarea nu a dat niciun rezultat
MsgBox "ID-ul angajatului nu a fost găsit. Încearcă din nou", vbInformation + vbOKOnly
GoTo Loop_Bottom
Terminați Dacă
Dacă (Sheets (sTgtSheet) .Cells (lRow, "B") = vbNullString) _
Atunci
"celula liniei găsite are coloana B goală
Foi (sTgtSheet) .Celuri (lRow, "B") = Acum
ElseIf (Sheets (sTgtSheet) .Celuri (lRow, "C") = vbNullString) _
Atunci
"celula din rândul găsit are coloana C goală
Foi (sTgtSheet) .Celuri (lRow, "C") = Acum
altfel
"celula din rândul găsit are coloanele B și C completate
MsgBox "Timpul de începere și de sfârșit a fost deja înregistrat pentru angajat" & sSearchText, vbInformation + vbOKOnly
Terminați Dacă
Loop_Bottom:
'până când sSearchText este necompletat
Buclă În timp ce (sSearchText vbNullString)
End Sub
Funcția publică getItemLocation (sLookFor As String, _
rngSearch As Range, _
Opțional bFullString Ca Boolean = Adevărat, _
Opțional bLastOccurance As Boolean = Adevărat, _
Opțional bFindRow ca Boolean = Adevărat) Atâta timp
'găsi primul / ultimul rând / coloană într-un interval pentru un șir specific
Dim celulă ca interval
Dim. ILookAt ca Integer
Dim iSearchDir ca intreg
Dim iSearchOdr ca intreg
Dacă (bFullString) _
Atunci
iLookAt = xlWhole
altfel
iLookAt = xlPart
Terminați Dacă
Dacă (bLastOccurance) _
Atunci
iSearchDir = xlPrevious
altfel
iSearchDir = xlNext
Terminați Dacă
Dacă nu (bFindRow) _
Atunci
iSearchOdr = xlByColumns
altfel
iSearchOdr = xlByRows
Terminați Dacă
Cu rngSearch
Dacă (bLastOccurance) _
Atunci
Setați celula = .Find (sLookFor, .Cells (1, 1), xlValues, iLookAt, iSearchOdr, iSearchDir)
altfel
Setați celula = .Find (sLookFor, .Cells (.Rows.Count, .Columns.Count), xlValues, iLookAt, iSearchOdr, iSearchDir)
Terminați Dacă
Se termina cu
Dacă celula nu este nimic atunci
getItemLocation = 0
ElseIf Nu (bFindRow) _
Atunci
getItemLocation = Cell.Column
altfel
getItemLocation = Cell.Row
Terminați Dacă
Setați celula = nimic
Terminați funcția