Как заставить Excel автоматически обновляться из запроса рабочего элемента TFS 2010
Автор вопроса: kroonwijkОтветов: 4
Мы используем предоставленный по умолчанию шаблон процесса MSF Agile 5.0 от Microsoft для запуска наших проектов. В частности, лист Excel для журнала невыполненных итераций очень полезен для управления проектом.
Однако мы столкнулись с ситуациями, когда невыполненная работа по итерации на листе номер 1 не была актуальной. После открытия книги Excel пользователь должен явно нажать кнопку "Обновить" на вкладке "Команда", чтобы отобразить самые последние данные.
Вопрос: как мы можем заставить Excel (2007) обновлять журнал невыполненных итераций при открытии книги и синхронизировать его с запросом рабочего элемента TFS 2010, к которому он подключен?
Предложение других записать макрос для нажатия кнопки "Обновить" не работает, потому что записанный макрос не способен обновить запрос с древовидной иерархией (по крайней мере, при выполнении макроса возникает ошибка). Записанный макрос делает что-то еще, кроме нажатия кнопки :-)
Теперь перейдем к рассматриваемой проблеме. Как сказал предыдущий ответчик, вам нужен код, который запускается из события открытия книги. Думаю, эту часть вы уже знаете. Метод обновления является универсальным и работает только для подключений к данным, формул и обычных списков точек доступа. Вам нужно использовать меню "Команда" на ленте. Следующий фрагмент кода показано, как, а также метод получения объекта списка, представляющего таблицу, содержащую данные рабочего элемента. Синхронизация TFS и Excel через VBA
В случае разрыва ссылки следует частичное воспроизведение кода (просто активация меню Team). Ссылка MSDN в их статье уже выглядит неработающей (а может и нет).
Private Function FindTeamControl(tagName As String) As CommandBarControl
Dim commandBar As commandBar
Dim teamCommandBar As commandBar
Dim control As CommandBarControl
For Each commandBar In Application.CommandBars
If commandBar.Name = "Team" Then
Set teamCommandBar = commandBar
Exit For
End If
Next
If Not teamCommandBar Is Nothing Then
For Each control In teamCommandBar.Controls
If InStr(1, control.Tag, tagName) Then
Set FindTeamControl = control
Exit Function
End If
Next
End If
End Function
Sub RefreshTeamQuery(shtTFSExcel_Name As String) '(rangeName As String)
Dim activeSheet As Worksheet
Dim teamQueryRange As Range
Dim refreshControl As CommandBarControl
Set refreshControl = FindTeamControl("IDC_REFRESH")
If refreshControl Is Nothing Then
MsgBox "Could not find Team Foundation commands in Ribbon. Please make sure that the Team Foundation Excel plugin is installed.", vbCritical
Exit Sub
End If
End Sub
Ответ 2 · рейтинг 3 · Warren Parks
Я попытался просто отредактировать ответ Anonymous Type, но мое редактирование было отклонено, поэтому я сделал новый ответ. У него отсутствовала часть кода из метода RefreshTeamQuery, как показано в связанной статье (здесь более прямая ссылка на исходный код).
У меня также все еще возникают проблемы с вызовом этого из события открытия книги, потому что я не думаю, что эти кнопки создаются на панели инструментов или каким-то образом связаны с рабочим листом при открытии книги. Однако использование кода на кнопке работает нормально.
Private Function FindTeamControl(tagName As String) As CommandBarControl
Dim commandBar As commandBar
Dim teamCommandBar As commandBar
Dim control As CommandBarControl
For Each commandBar In Application.CommandBars
If commandBar.Name = "Team" Then
Set teamCommandBar = commandBar
Exit For
End If
Next
If Not teamCommandBar Is Nothing Then
For Each control In teamCommandBar.Controls
If InStr(1, control.Tag, tagName) Then
Set FindTeamControl = control
Exit Function
End If
Next
End If
End Function
Sub RefreshTeamQuery(shtTFSExcel_Name As String) '(rangeName As String)
Dim activeSheet As Worksheet
Dim teamQueryRange As Range
Dim refreshControl As CommandBarControl
Set refreshControl = FindTeamControl("IDC_REFRESH")
If refreshControl Is Nothing Then
MsgBox "Could not find Team Foundation commands in Ribbon. Please make sure that the Team Foundation Excel plugin is installed.", vbCritical
Exit Sub
End If
'Disable screen updating temporarily so that the user doesn’t see us selecting a range
Application.ScreenUpdating = False
'Capture the currently active sheet, we will need it later
Set activeSheet = ActiveWorkbook.activeSheet
Set teamQueryRange = Worksheets(shtTFSExcel_Name).ListObjects(1).Range
teamQueryRange.Worksheet.Select
teamQueryRange.Select
refreshControl.Execute
activeSheet.Select
Application.ScreenUpdating = True
End Sub
Ответ 3 · zumalifeguard
Эта версия аналогична, но в ней есть вариант, при котором вам не нужно передавать диапазон, а просто предполагается, что таблица TFS была нажата (выбрана) пользователем.
Оригинальный функционал тоже есть:
Sub RefreshTeamQuery()
Dim sel As Range: Set sel = Application.Selection: If sel Is Nothing Then Exit Sub
Dim lo As ListObject: Set lo = sel.ListObject: If lo Is Nothing Then Exit Sub
RefreshTeamQueryWithList lo
End Sub
Sub RefreshTeamQueryWithList(lo As ListObject)
Dim activeSheet As Worksheet
Dim teamQueryRange As Range
Dim refreshControl As CommandBarControl
Set refreshControl = FindTeamControl("IDC_REFRESH")
If refreshControl Is Nothing Then
MsgBox "Could not find Team Foundation commands in Ribbon. Please make sure that the Team Foundation Excel plugin is installed.", vbCritical
Exit Sub
End If
On Error GoTo errorHandler
'Disable screen updating temporarily so that the user doesn’t see us selecting a range
Application.ScreenUpdating = False
'Capture the currently active sheet, we will need it later
Set activeSheet = ActiveWorkbook.activeSheet
Set teamQueryRange = lo.Range
teamQueryRange.Worksheet.Select
teamQueryRange.Select
refreshControl.Execute
activeSheet.Select
Application.ScreenUpdating = True
errorHandler:
If Not activeSheet Is Nothing Then activeSheet.Select
Application.ScreenUpdating = True
End Sub
Private Function FindTeamControl(tagName As String) As CommandBarControl
Dim commandBar As commandBar
Dim teamCommandBar As commandBar
Dim control As CommandBarControl
For Each commandBar In Application.CommandBars
If commandBar.Name = "Team" Then
Set teamCommandBar = commandBar
Exit For
End If
Next
If Not teamCommandBar Is Nothing Then
For Each control In teamCommandBar.Controls
If InStr(1, control.Tag, tagName) Then
Set FindTeamControl = control
Exit Function
End If
Next
End If
End Function
Ответ 4 · рейтинг -1 · LevaR
Насколько я знаю, есть функция VB, которая обновляет все источники данных xls-файла: ActiveWorkbook.RefreshAll
Вам нужно только подключить его к событию открытия рабочей книги.