Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-如何通过检查name和emptycell将数据输出到相应的单元格?_Excel_Vba - Fatal编程技术网

Excel VBA-如何通过检查name和emptycell将数据输出到相应的单元格?

Excel VBA-如何通过检查name和emptycell将数据输出到相应的单元格?,excel,vba,Excel,Vba,你好 这里真的需要一些帮助,我不擅长VBA 创建了一个电子表格并记录了一个宏来记录员工的签入。但是,我很难根据姓名与相应的用户进行签出 有人能帮我吗 谢谢。已附上电子表格供您参考 在谷歌搜索了很多之后,这就是我基于mikes解决方案所做的 Dim name As String Dim id As Integer Dim checkin As Date Dim checkout As Date name = Range("d6").Value id = Range("d7").Value c

你好

这里真的需要一些帮助,我不擅长VBA

创建了一个电子表格并记录了一个宏来记录员工的签入。但是,我很难根据姓名与相应的用户进行签出

有人能帮我吗

谢谢。已附上电子表格供您参考

在谷歌搜索了很多之后,这就是我基于mikes解决方案所做的

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

有人帮忙吗?首先,我建议对工作表中的重要单元格使用区域名称

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的第一条记录-如果发现他/她在并且需要打卡

以后再看

好的。。。抱歉被维也纳的Lady Gaga协奏曲打断了

这是按钮的完整代码

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
Sub按钮按下()
Dim DB作为范围,Idx作为整数
设置DB=范围(“数据表”)
如果范围(“EmpName”)为“”,或范围(“EmpNo”)为“”,则
MsgBox“在按下按钮之前输入您的姓名和ID”,vbCritical+vbOKOnly,“缺少输入”
出口接头
如果结束
Idx=UserClockedIn()
如果Idx为0,则
DB(Idx,4)=日期+时间()
DB(Idx,5).Formula=“=”&DB(Idx,4).地址(RowAbsolute:=False,ColumnAbsolute:=False)&“-”和DB(Idx,3).地址(RowAbsolute:=False,ColumnAbsolute:=False)
DB(Idx,5).NumberFormat=“[hh]:mm”
范围(“EmpName”)=“”
范围(“EmpNo”)=“”
其他的
Idx=2
在DB(Idx,1)时执行此操作“
Idx=Idx+1
环
DB(Idx,1)=范围(“EmpName”)
DB(Idx,2)=范围(“EmpNo”)
DB(Idx,3)=日期+时间()
如果结束
端接头
私有函数UserClockedIn()为整数
Dim DB作为范围,Idx作为整数
设置DB=范围(“数据表”)
UserClockedIn=0
Idx=2
在DB(Idx,1)时执行此操作“
如果DB(Idx,1)=范围(“EmpName”)和DB(Idx,2)=范围(“EmpNo”)和DB(Idx,4)=“”,则
UserClockedIn=Idx
退出功能
如果结束
Idx=Idx+1
环
端函数
@user502908:我没有记录它,因为我想让你确切地了解它的功能,然后快速进入Excel VBA:-)它不会做太多,并且有一些基本的技术,你会再次应用&如果你进入VBA。。。尝试填充范围“ClockInTime”和“ClockOutTime”:-)


玩得开心

我尝试了另一种我能应付的更简单的方法

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
Sub yes()
Dim findId作为整数
将第一个地址设置为字符串
Dim FindString作为整数
变暗Rng As范围
FindString=范围(“d7”).值
如果修剪(FindString)“,则
带有板材(“板材1”)。范围(“F1:J100”)
Set Rng=.find(What:=FindString_
之后:=.个单元格(1)_
LookIn:=xlValues_
看:=xlother_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
匹配案例:=假)
如果不是,那么Rng什么都不是
应用程序。转到Rng,对
FirstAddress=Rng.Address
Rng.Offset(0,2).Value=Now()
其他的
MsgBox“未找到任何内容”
如果结束
以
如果结束
端接头

找到id后,搜索给定id的整个电子表格,以动态指示签入时间。

我看不到电子表格。对不起,该链接现在应该可以工作。您似乎正在尝试像编写独立程序一样驱动输入,您最好使用excel。如果我错了,请发布一个更详细的描述,说明你想做什么。你可以在我的电子表格上看到,我现在可以查到用户名、序列号和时间。我现在要做的下一件事是签出他的插槽。发生的情况是,“check out”上的宏能够检查单元格的范围,并在相应的“name”上输出timecheck out。在此之前,检查单元格是否为空,以指示用户已签出。这个系统的目的是模仿工资系统。哇,迈克,这正是我所设想的解决方案。然而,我在vba方面的能力非常低。你是否有一个在线的例子或某种关于如何做到这一点的例子?目前,我所做的只是录制一个宏来做这些简单的事情。非常感谢您的帮助。@user502908为什么不试着记录这些步骤,然后将它们组合在一起呢?我相信,当您有一些示例代码时,您会得到更多帮助。除了使用datatable之外,还有其他方法吗?还有一些更简单的方法?录制宏有助于了解底层技术(我也这么做),但我总是重新编码,因为宏总是使用绝对或相对单元格地址录制的,而一个好的VBA程序应该没有这种硬编码地址