VBA - Как вывести данные в соответствующую ячейку, проверив имя и пустую ячейку? - PullRequest
0 голосов
/ 11 ноября 2010

Добрый день,

здесь действительно нужна помощь, мне плохо в VBA.

Создал электронную таблицу и записал макрос для записи регистрации сотрудников.Тем не менее, я испытываю трудности с проверкой соответствующих пользователей на основе имени.

Может ли кто-нибудь помочь мне здесь?

Спасибо.Приложил электронную таблицу для вашей ссылки.

http://www.etechnopia.com/vish/Book1ss.xlsm

После долгих поисков, Это то, что я сделал на основе решения Майкса

Dim name As String
Dim id As Integer
Dim checkin As Date
Dim checkout As Date

name = Range("d6").Value
id = Range("d7").Value

checkin = Now
Range("d10") = checkin

Помогите кому-нибудь?я мой самый лучший здесь.

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

во-первых, я рекомендую использовать имена диапазонов для важных ячеек вашего листа

D6         EmpName
D7         EmpNo
D10        ClockInTime
D11        ClockOutTime
H5..H11    DataTable

Это позволит вам ссылаться на них по имени вместо жесткого кодирования их адресов (плохое плохое жесткое кодирование: - /)

Во-вторых, ваша [Кнопка] должна служить двойному назначению ... она должна решить, будет ли пользователь включен или выключен и делать разные вещи

высокоуровневый МЕТА-код, выполняемый при нажатии[Button4] может быть

if user clocked in
   write current time into ClockOutTime   ' remark: this may be superfluous 
   find DataTable record (EmpName, ClockInTime)
   write ClockOutTime into record (EmpName, ClockInTime)
   erase EmpName, EmpID, ClockInTime, ClockOutTime
else
   write current time into ClockInTime
   find first blank record in DataTable
   write EmpName, EmpID, ClockInTime into DataTable record
endif

Как определить, включен ли пользователь?Если многие пользователи используют один и тот же лист в одно и то же время (то есть туда входят 5 emp, напишите их имена и часы), вам нужно проверить DataTable для первой записи EmpNane без ClockOutTime - если он найден, он / она находится инужно отключить.

позже ...

ОК ... извините, что был прерван концертом Lady Gaga в Вене / AT

, так что вот полный кодкнопка

Sub ButtonPressed()
Dim DB As Range, Idx As Integer

    Set DB = Range("DataTable")

    If Range("EmpName") = "" Or Range("EmpNo") = "" Then
        MsgBox "Enter your name and ID before pressing the button", vbCritical + vbOKOnly, "missing input"
        Exit Sub
    End If

    Idx = UserClockedIn()
    If Idx <> 0 Then
        DB(Idx, 4) = Date + Time()

        DB(Idx, 5).Formula = "=" & DB(Idx, 4).Address(RowAbsolute:=False, ColumnAbsolute:=False) & "-" & DB(Idx, 3).Address(RowAbsolute:=False, ColumnAbsolute:=False)
        DB(Idx, 5).NumberFormat = "[hh]:mm"

        Range("EmpName") = ""
        Range("EmpNo") = ""
    Else
        Idx = 2
        Do While DB(Idx, 1) <> ""
            Idx = Idx + 1
        Loop
        DB(Idx, 1) = Range("EmpName")
        DB(Idx, 2) = Range("EmpNo")
        DB(Idx, 3) = Date + Time()
    End If


End Sub

Private Function UserClockedIn() As Integer
Dim DB As Range, Idx As Integer

    Set DB = Range("DataTable")
    UserClockedIn = 0

    Idx = 2

    Do While DB(Idx, 1) <> ""
        If DB(Idx, 1) = Range("EmpName") And DB(Idx, 2) = Range("EmpNo") And DB(Idx, 4) = "" Then
            UserClockedIn = Idx
            Exit Function
        End If
        Idx = Idx + 1
    Loop
End Function

@ user502908: Я не задокументировал это, потому что хочу, чтобы вы точно выяснили, что он делает, и тем самым быстро приступил к работе с Excel-VBA :-) Это тоже не сработаетмного и есть некоторые основные приемы, которые вы будете применять снова и снова, если зайдете в VBA ... попробуйте заполнить диапазоны "ClockInTime" и "ClockOutTime": -)))

Book1ssNew.xlsm

веселиться

0 голосов
/ 11 ноября 2010

Я попробовал другой более простой метод, с которым я мог бы справиться

Sub yes()

Dim findId As Integer
Dim FirstAddress As String

Dim FindString As Integer
    Dim Rng As Range
    FindString = Range("d7").Value
    If Trim(FindString) <> "" Then
        With Sheets("Sheet1").Range("F1:J100")
            Set Rng = .find(What:=FindString, _
                            After:=.Cells(1), _
                            LookIn:=xlValues, _
                            LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False)
            If Not Rng Is Nothing Then
                Application.Goto Rng, True
                FirstAddress = Rng.Address
                Rng.Offset(0, 2).Value = Now()


            Else
                MsgBox "Nothing found"
            End If
        End With
    End If


End Sub

Поиск во всей электронной таблице по указанному идентификатору, когда идентификатор найден, для динамического указания времени регистрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...