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 începerii

307301

307302

307303

307304

307305

307306

307307

307308

307309

307310

Soluţie

Acest lucru. Rutina de utilizat este doTimeStamp

Ideea 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

Rețineți că

Vă mulțumim pentru rizvisa1 pentru acest sfat.
Articolul Precedent Articolul Următor

Cele Mai Importante Sfaturi