在考勤表中根据某些标准插入一个值

时间:2015-03-30 15:50:10

标签: vba excel-vba excel

我正在为我的工作场所准备一份考勤表。它将部分自动化,当用户在输入框中输入他的电话号码时,他的出勤被标记为当天,还有一个日期输入框,即日期不是月份和年份。 excel表的结构:2列分别有姓名和电话号码,其余为1月31日。 因此,当用户输入电话号码和日期时,P(当前)出现在与电话号码相同的行中的日期列下。 问题:代码选择的单元格是日期为1-31的标题 我哪里错了? 请帮忙。 谢谢

Sub Find_mobilenumber()
Dim FindString As String
Dim FindString1 As String
Dim Rng As Range
FindString = InputBox("Enter Your Mobile Number")
FindString1 = InputBox("Enter todays Date - e.g 21  for 21/03/2015")
If Trim(FindString) <> "" Then
If Trim(FindString1) <> "" Then
With Sheets("Sheet1").Range("D:D") 'searches all of column D
With Sheets("Sheet1").Range("7:7") 'searches all of column 7
    Set Rng = .Find(What:=FindString1, _
                    After:=.Cells(.Cells.Count), _
                    LookIn:=xlValues, _
                    LookAt:=xlWhole, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlNext, _
                    MatchCase:=False)
    If Not Rng Is Nothing Then
        Application.Goto Rng, True 'value found
        If Cell.Value = FindString Goto

        MsgBox "Client Checked In"
    Else
        MsgBox "Client Not Registered" 'value not found
    End If
End With
 End With
 End If
      End If
        End Sub

2 个答案:

答案 0 :(得分:1)

您可以将搜索分成两个更容易描述的步骤,而不是嵌套With...End With语句:(1)查找适当的行,以及(2)查找相应的列。假设您的设计如下:

an example layout

您可以调整脚本以填充“Present”表,如下所示:

Option Explicit
Public Sub Find_mobilenumber()

Dim strMobileNumber As String, strDayOfMonth As String
Dim rngMobileNumbers As Range, rngDaysOfMonth As Range, rng As Range
Dim lngTargetRow As Long, lngTargetCol As Long
Dim wks As Worksheet

'Set references
Set wks = ThisWorkbook.Worksheets("Sheet1")

'Collect mobile number and day of month from user
strMobileNumber = CStr(InputBox("Enter Your Mobile Number"))
strDayOfMonth = CStr(InputBox("Enter todays Date - e.g 21  for 21/03/2015"))

'Stop the script if input is blank
If Trim(strMobileNumber) = "" Or Trim(strDayOfMonth) = "" Then
    Call ClientNotRegistered
    Exit Sub
End If

'Find the appropriate row by matching mobile number
Set rngMobileNumbers = wks.Range("D:D")
Set rng = rngMobileNumbers.Find(What:=strMobileNumber, LookAt:=xlWhole)
If rng Is Nothing Then
    Call ClientNotRegistered
    Exit Sub
End If
lngTargetRow = rng.Row

'Find the appropriate column by matching day of month number
Set rngDaysOfMonth = wks.Range("7:7")
Set rng = rngDaysOfMonth.Find(What:=strDayOfMonth, LookAt:=xlWhole)
If rng Is Nothing Then
    Call ClientNotRegistered
    Exit Sub
End If
lngTargetCol = rng.Column

'Write a "P" in the resulting cell
wks.Cells(lngTargetRow, lngTargetCol) = "P"
MsgBox "Client Checked In"

End Sub

'DRY solution for not found
Public Sub ClientNotRegistered()
    MsgBox "Client Not Registered"
End Sub

答案 1 :(得分:0)

你在这里开始使用With块,但不执行任何操作

With Sheets("Sheet1").Range("D:D")

我认为您打算在D栏中查看手机号码?

这次修订怎么样?

Sub Find_mobilenumber()

Dim FindString As String
Dim FindString1 As String
Dim PhoneRng As Range
Dim Rng As Range

FindString = InputBox("Enter Your Mobile Number")
FindString1 = InputBox("Enter todays Date - e.g 21  for 21/03/2015")

If Trim(FindString) <> "" Then

    If Trim(FindString1) <> "" Then

        With Sheets("Sheet1").Range("D:D") 'searches for phone no in column D

                Set PhoneRng = .Find(What:=FindString, _
                              After:=.Cells(.Cells.Count), _
                              LookIn:=xlValues, _
                              LookAt:=xlWhole, _
                              SearchOrder:=xlByRows, _
                              SearchDirection:=xlNext, _
                              MatchCase:=False)

        End With

        With Sheets("Sheet1").Range("7:7") 'searches all of column 7

            Set Rng = .Find(What:=FindString1, _
                          After:=.Cells(.Cells.Count), _
                          LookIn:=xlValues, _
                          LookAt:=xlWhole, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlNext, _
                          MatchCase:=False)
        End With


        On Error GoTo ErrorHandler

            Intersect(Rng.EntireColumn, PhoneRng.EntireRow).Value = "P"
            MsgBox ("Client Checked In")

    End If

End If

Exit Sub

ErrorHandler:

MsgBox ("Client Not Registered")

End Sub