Excel - makro, aby znaleźć konkretny numer na liście

Kwestia

Próbuję napisać makro w programie Excel, które musi wykonać poniższe funkcje:
  • Po kliknięciu przycisku polecenia powinien pojawić się monit o wprowadzenie numeru w polu wprowadzania.
  • Po wprowadzeniu numeru, powinien zabrać nas do komórki, która ma numer.
  • i odpowiednia komórka powinna być wypełniona aktualnym czasem.

Szablon jest następujący:

Po kliknięciu przycisku polecenia i wprowadzeniu numeru 307304 w polu wprowadzania. powinien zabrać mnie do konkretnej komórki i gdzie powinien zostać przechwycony czas rozpoczęcia. Jeśli kliknę ponownie, należy przechwycić czas zakończenia. (te czasy powinny być czasem bieżącym).

 Pracownik # Czas rozpoczęcia Czas zakończenia

307301

307302

307303

307304

307305

307306

307307

307308

307309

307310

Rozwiązanie

to wszystko. Procedura do użycia to doTimeStamp

Chodzi o to, aby dołączyć tę procedurę do przycisku polecenia. Kiedy go klikniesz, poprosi o identyfikator emp i wypełni datę początkową (jeśli jest pusta) lub datę końcową (jeśli jest pusta), a następnie ponownie zapyta o następny identyfikator. Będzie nadal pytać o identyfikator, dopóki nie wpiszesz pustego miejsca i nie wyjdzie z niego.

Opcja Wyraźna

Public Sub doTimeStamp ()

Dim LRow As Long

Dim sSearchText As String

Dim lEmpID As Long

Dim sTgtSheet As String

„nazwa arkusza, w którym znajdują się identyfikatory

sTgtSheet = "Sheet1"

Robić

sSearchText = InputBox („Proszę podać identyfikator pracownika”, „Nagrywanie czasu”)

sSearchText = Przytnij (sSearchText)

If (sSearchText = vbNullString) _

Następnie

„nie wprowadzono danych. następnie zamknij

GoTo Loop_Bottom

Zakończ jeśli

If Not (IsNumeric (sSearchText)) _

Następnie

„wpisany tekst nie był numeryczny.

MsgBox "Nieprawidłowy identyfikator pracownika. Identyfikator pracownika może być tylko cyfrą. Spróbuj ponownie", vbExclamation + vbOKOnly

GoTo Loop_Bottom

Zakończ jeśli

If (InStr (1, sSearchText, ".")> 0) _

Następnie

„wprowadzony tekst ma wartość dziesiętną.

MsgBox "Nieprawidłowy identyfikator pracownika. Identyfikator pracownika może być tylko cyfrą. Spróbuj ponownie", vbExclamation + vbOKOnly

GoTo Loop_Bottom

Zakończ jeśli

„znajdź wiersz w kolumnie 1

lRow = getItemLocation (sSearchText, Sheets (sTgtSheet) .Columns (1))

Jeśli (lRow = 0) _

Następnie

„wyszukiwanie nie zwróciło trafienia

MsgBox „Nie znaleziono identyfikatora pracownika. Spróbuj ponownie”, vbInformation + vbOKOnly

GoTo Loop_Bottom

Zakończ jeśli

Jeśli (arkusze (sTgtSheet) .Cell (lRow, „B”) = vbNullString) _

Następnie

'komórka znalezionego wiersza ma pustą kolumnę B

Arkusze (sTgtSheet). Komórki (lRow, „B”) = Teraz

ElseIf (Arkusze (sTgtSheet). Komórki (lRow, „C”) = vbNullString) _

Następnie

'komórka znalezionego wiersza ma kolumnę C pustą

Arkusze (sTgtSheet). Komórki (lRow, „C”) = Teraz

Jeszcze

'komórka znalezionego wiersza ma wypełnioną kolumnę B i C

MsgBox "Czas rozpoczęcia i zakończenia został już nagrany dla pracownika" & sSearchText, vbInformation + vbOKOnly

Zakończ jeśli

Loop_Bottom:

'loop aż sSearchText jest pusty

Pętla podczas (sSearchText vbNullString)

Napis końcowy

Funkcja publiczna getItemLocation (sLookFor As String, _

rngSearch As Range, _

Opcjonalne bFullString As Boolean = True, _

Opcjonalne bLastOccurance As Boolean = True, _

Opcjonalne bFindRow As Boolean = True) Tak długo

„znajdź pierwszy / ostatni wiersz / kolumnę w zakresie dla określonego ciągu

Dim Cell As Range

Dim iLookAt As Integer

Dim iSearchDir As Integer

Dim iSearchOdr As Integer

Jeśli (bFullString) _

Następnie

iLookAt = cały

Jeszcze

iLookAt = xlPart

Zakończ jeśli

Jeśli (bLastOccurance) _

Następnie

iSearchDir = xlPrevious

Jeszcze

iSearchDir = xlNext

Zakończ jeśli

Jeśli nie (bFindRow) _

Następnie

iSearchOdr = xlByColumns

Jeszcze

iSearchOdr = xlByRows

Zakończ jeśli

Z rngSearch

Jeśli (bLastOccurance) _

Następnie

Ustaw komórkę = .Find (sLookFor, .Cells (1, 1), xlValues, iLookAt, iSearchOdr, iSearchDir)

Jeszcze

Ustaw komórkę = .Find (sLookFor, .Cells (.Rows.Count, .Columns.Count), xlValues, iLookAt, iSearchOdr, iSearchDir)

Zakończ jeśli

Kończyć z

Jeśli Cell Is Nothing Then

getItemLocation = 0

ElseIf Not (bFindRow) _

Następnie

getItemLocation = Cell.Column

Jeszcze

getItemLocation = Cell.Row

Zakończ jeśli

Set Cell = Nic

Zakończ funkcję

Zauważ, że

Dzięki rizvisa1 za tę poradę.
Poprzedni Artykuł Następny Artykuł

Najważniejsze Wskazówki