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ńczenia307301
307302
307303
307304
307305
307306
307307
307308
307309
307310
Rozwiązanie
to wszystko. Procedura do użycia to doTimeStampChodzi 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ę