Excel VBA – 使用现有值+用户表单input更新单元格

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

链接到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 

我们要根据popup窗体中的条目来更新“已完成的工作”字段。 (或者,更好的办法是直接在工作表上填写表格。)

表单部分很简单。 它将只有两个文本框:票证ID和时间花费。 以及更新控制button。 当同时input两个文本框并单击更新时,它应该为所提供的故障单ID添加已完成的工作时间字段。 我们无法做到的正是实现这一目标的代码。 我期望它会是If / Then / Else和循环的组合。

具体来说,我们需要帮助以下…

1)一旦input票号和时间消耗,并点击“更新”button,这是所需的行为:

  • search工作表以查找ID列(ID列的位置可能会更改)
  • 在此列中search由用户提供的票证ID
  • 如果find匹配项,则search相邻的单元格以查找“已完成的工作”列(“已完成的工作”的位置列也可能会更改)。 否则触发错误消息并closures
  • 获取“已完成的工作”列中的现有值,并从“花费时间”文本框中添加值
  • 在“已完成的工作”列中更新新值

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

 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 

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

一旦find了,我们如何通过同一行的单元格来查看另一个单元格的值(基于列名)?

2)如果用户有一个突出显示的ID(活动单元格),我们想要自动填充表单中的票证ID文本框。 我们怎样才能做到这一点? 我觉得这将会像在初始化时将其设置为活动单元格一样简单:

 Private Sub UserForm_Initialize() IDTextBox.Value = ActiveCell.Value End Sub 

但是,运行时错误424:Object Required失败。

关于如何设置工作簿的几个问题。 桌子是否设置为桌子? 这样可以更容易地find“已完成的工作”列。 如果没有,有多种方式来find列号。 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 

你只需要更新你想要的variables。 另外TFS只是我使用的表的名称。 它需要匹配工作簿中的表格。

这是我们想出的最终结果(虽然histerical看起来像一个更简单的方式)。 稍后我们可能会添加更多的error handling,但现在这个工作。 再次感谢histerical!

对于那些可能希望用TFS做同样事情的人来说,一个简短的提示是:表的名字是随机生成的,不能更新。 名称“TFS”实际上不工作。 这意味着,您将需要单独的代码为每个TFS查询要应用此。 因此,对大型团体来说不是一个好的解决scheme 也许有人可以推荐一个方法呢?

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