Как заставить Excel автоматически обновляться из запроса рабочего элемента TFS 2010

Мы используем предоставленный по умолчанию шаблон процесса MSF Agile 5.0 от Microsoft для запуска наших проектов. В частности, лист Excel для журнала невыполненных итераций очень полезен для управления проектом.

Однако мы столкнулись с ситуациями, когда невыполненная работа по итерации на листе номер 1 не была актуальной. После открытия книги Excel пользователь должен явно нажать кнопку «Обновить» на вкладке «Команда», чтобы отобразить самые последние данные.

Вопрос: как мы можем заставить Excel (2007) обновлять журнал невыполненных итераций при открытии книги и синхронизировать его с запросом рабочего элемента TFS 2010, к которому он подключен?

Предложение других записать макрос для нажатия кнопки «Обновить» не работает, потому что записанный макрос не способен обновить запрос с древовидной иерархией (по крайней мере, при выполнении макроса возникает ошибка). Записанный макрос делает что-то еще, кроме нажатия кнопки :-)


person kroonwijk    schedule 15.09.2011    source источник


Ответы (4)


Некоторые примеры из библиотеки MSDN по типам списков
Типы списков< br> Преобразование списка ввода в список запросов

Теперь перейдем к рассматриваемой проблеме.
Как сказал предыдущий ответчик, вам нужен код, который запускается из события открытия книги. Думаю, эту часть вы уже знаете.
Метод обновления является универсальным и работает только для подключений к данным, формул и обычных списков точек доступа.
Вам нужно использовать меню "Команда" на ленте.
Следующий фрагмент кода показано, как, а также метод получения объекта списка, представляющего таблицу, содержащую данные рабочего элемента.
Синхронизация 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
person Anonymous Type    schedule 21.09.2011
comment
Это определенно правильный ответ. Работает как шарм! Спасибо, анонимный тип. - person kroonwijk; 21.09.2011
comment
Часть кода отсутствует в методе RefreshTeamQuery. Я пытался отредактировать ответ, но был отклонен, поэтому сделал новый ответ с полным кодом ниже. - person Warren Parks; 05.09.2014

Я попытался просто отредактировать ответ 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
person Warren Parks    schedule 04.09.2014

Эта версия аналогична, но в ней есть вариант, при котором вам не нужно передавать диапазон, а просто предполагается, что таблица 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
person zumalifeguard    schedule 22.05.2015

Насколько я знаю, есть функция VB, которая обновляет все источники данных xls-файла: ActiveWorkbook.RefreshAll

Вам нужно только подключить его к событию открытия рабочей книги.

person LevaR    schedule 16.09.2011
comment
Я только что попробовал это. Но он не обновляет и не обновляет элементы моего рабочего списка TFS. Я думаю, что есть что-то особенное в интеграции между Excel и TFS. Думаю, это не просто обычное подключение к данным или внешний источник данных. - person kroonwijk; 16.09.2011
comment
Событие Open Workbook решает первую часть, метод RefreshAll не поможет со вторым требованием. - person Anonymous Type; 22.09.2011
comment
По моему опыту, RefreshAll никогда не работал у меня, по крайней мере, для Access 2003. Я всегда перебирал все, что можно обновить, и просто выполнял стандартное обновление. - person PowerUser; 12.10.2011