背景:我的团队希望使用共享的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”按钮,这是所需的行为:
以下内容非常简化,无论如何都不起作用。但是要提出一个想法:
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失败了:对象必需。
答案 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