Excel - Găsiți un număr special într-o listă?

Problema

Aș dori să creez macro în Excel ca mai jos:
  • Când faceți clic pe butonul de comandă, trebuie 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 acesta din urmă să fie umplută cu ora curentă.

Șablonul este după cum urmează:

Când fac clic pe Comandă și introdu numărul 307304 în caseta de introducere. ar trebui să mă aducă la celula respectivă și timpul de începere ar trebui capturat. Dacă dau un clic din nou, timpul de terminare ar trebui capturat. (aceste valori vor fi folosite pentru a calcula ora curentă).

 # Timp de începere a angajatului # Ora de începere a începerii

307301

307302

307303

307304

307305

307306

307307

307308

307309

307310

Soluţie

Incearca asta. Rutina de utilizat este doTimeStamp
  • Ideea este că ați conectat această rutină la butonul de comandă. Când dați clic pe el, acesta va solicita emp id și va introduce data de începere (dacă este necompletată) sau data de încheiere (dacă este necompletată) și apoi vă va solicita din nou id-ul următor. Va va cere 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

'Pentru a localiza primul / ultimul rând / coloană într-un interval pentru un anumit șir

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

Vă mulțumim pentru rizvisa1 pentru acest sfat.

Articolul Precedent Articolul Următor

Cele Mai Importante Sfaturi