Excel VBA - 使用现有值+用户表单输入

时间:2016-01-28 17:25:14

标签: excel vba excel-vba

背景:我的团队希望使用共享的Excel工作簿来跟踪在TFS工作项上花费的时间。我们认为这可以使用VBA轻松完成,但我们是VBA的新手,并且无法找到有效的组合。

在链接到TFS之后,我们有一个表格可能如下所示:

ID |Title | Description | Category | State             | Completed Work
===========================================================================
140 Test 1  VBA is fun    Testing    Programming         0
141 Test 2  VBA is great  Testing    Programming         0
142 Test 3  Testing VBA   Testing    Programming         0
143 Test 4  Need help     Testing    Programming         0
144 Test 5  Questions     Testing    Programming         0

我们希望根据弹出窗体中的条目更新“已完成的工作”字段。 (或者,更好的是,将表单直接放在工作表上。)

表单部分很简单。它只有两个文本框:Ticket ID和Time Spent。以及更新控制按钮。输入两个文本框并单击“更新”后,它应该为所提供的故障单ID添加“已用完工作时间”字段。我们无法做到的是实现这一目标的代码。我希望它将是If / Then / Else和循环的一些组合。

具体而言,我们需要以下帮助...

1)输入Ticket ID和Time Spent后,单击“Update”按钮,这是所需的行为:

  • 搜索工作表以查找ID列(ID列的位置可能会更改)
  • 在此列中搜索用户
  • 提供的故障单ID
  • 如果找到匹配项,请搜索相邻单元格以查找“已完成工作”列(“已完成工作”列的位置也可能会更改)。否则触发错误消息并关闭
  • 在“已完成的工作”列中获取现有值,并从“时间用尽”文本框中添加值
  • 使用新总计
  • 更新已完成工时列中的值

以下内容非常简化,无论如何都不起作用。但是要提出一个想法:

Private Sub UpdateCompletedWork_Click()

   Dim ExistingCompletedWork AS Integer

   If Sheet1.Range("A1:G100").Value = IDTextBox.Value
   Then ExistingCompletedWork.Value = Sheet1.Range([Completed Work field in same row])

   [Completed Work field] = ExistingCompletedWork.Value + TimeSpentTextBox.Value 

   Else MsgBox("ID Not Found")

End Sub 

我们如何根据用户表单上文本框的列名和值找到单元格的位置?

一旦发现,我们如何根据列名来查看同一行上的单元格以获取另一个单元格的值?

2)如果用户突出显示了ID(活动单元格),我们希望自动填充表单中的“票证ID”文本框。我们怎样才能做到这一点?我认为这就像在初始化时将其设置为活动单元格值一样简单:

Private Sub UserForm_Initialize()

    IDTextBox.Value = ActiveCell.Value

End Sub

但是运行时错误424失败了:对象必需。

2 个答案:

答案 0 :(得分:0)

有关如何设置工作簿的几个问题。该表实际上是否设置为表格?因为这样可以更容易地找到"完成的工作"柱。如果没有,有多种方法可以找到列号。 ID列是否会发生变化?完成的工作栏是否总是最后一列?

如果activecell不是ID怎么办?你应该为此内置一张支票。

编辑:

Private Sub UpdateCompletedWork_Click()
Dim IDrow as Range
idColumn = Range("TFS[ID]").Column
workColumn = Range("TFS[Completed Work]").Column
If Len(IDTextBox.Value) > 0 And Len(TimeSpentTextBox.Value) > 0 Then
ID = IDTextBox.Value
timeSpent = TimeSpentTextBox.Value
set IDrow = Columns(idColumn).Find(ID)
If Not IDrow is Nothing then
Cells(IDrow.row, workColumn).Value = Cells(IDrow.row, workColumn).Value + timeSpent
Else
MsgBox "Not a valid ID."
End If
End If
End Sub

Private Sub UserForm_Initialize()
idColumn = Range("TFS[ID]").Column
If idColumn = ActiveCell.Column Then
IDTextBox.Value = ActiveCell.Value
End If
End Sub

您只需更新所需的变量即可。 TFS也只是我用过的表的名称。它需要匹配工作簿中的表。

答案 1 :(得分:0)

这是我们提出的最终结果(尽管histerical看起来更简单)。我们稍后可能会为错误处理添加更多内容,但现在可以使用。再次感谢histerical!

对于那些可能希望使用TFS执行相同操作的人的快速说明:表的名称是随机生成的,无法更新。名称“TFS”实际上不起作用。这意味着您需要为要应用此功能的每个TFS查询单独设置代码。因此,对较大的群体来说,这不是一个好的解也许有人可以推荐一个方法吗?

Private Sub UserForm_Initialize() IDColumn = Range("TFS").Column If IDColumn = ActiveCell.Column Then IDTextBox.Value = ActiveCell.Value End If End Sub

Private Sub EnterTime_Click()
    'Find columns
    IDColumn = Range("TFS"[ID]").Column
    WorkColumn = Range("TFS"[Completed Work]").Column
    'Error if ID or Time not entered
    If Len(IDTextBox.Value) > 0 And Len(TimeSpentTextBox.Value) < 1 Then
        MsgBox "Enter Hours"
    End If
    IF Len(TimeSpentTextBox.Value) > 0 And Len(IDTextBox.Value) < 1 Then
        MsgBox "Enter ID"
    End If

FieldChecks:
    If Len(IDTextBox.Value) > 0 And Len(TimeSpentTextBox.Value) > 0 Then
        ID = IDTextBox.Value
        TimeSpent = TimeSpentTextBox.Value
        On Error GoTo IDError
        IDRow = Columns(IDColumn).Find(ID, lookat:=xlWhole).Row
        If IsNumeric(IDTextBox) = False Then
            MsgBox ("Invalid ID")
        End If
        Cells(IDRow, WorkColumn).Value = Cells(IDRow, WorkColumn).Value + TimeSpent
    End If

IDError:
    If Err.Number <> 0 Then
        MsgBox "ID Not Found. Enter Valid ID."
        IDTextBox.Value = ""
        Resume FieldChecks
    End If

End Sub