Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: kroonwijkОтветов: 4

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

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

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

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

excelvbaexcel-2007

Ответы

Ответ 1 · рейтинг 5 · Anonymous Type

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

Теперь перейдем к рассматриваемой проблеме.
Как сказал предыдущий ответчик, вам нужен код, который запускается из события открытия книги. Думаю, эту часть вы уже знаете.
Метод обновления является универсальным и работает только для подключений к данным, формул и обычных списков точек доступа.
Вам нужно использовать меню "Команда" на ленте.
Следующий фрагмент кода показано, как, а также метод получения объекта списка, представляющего таблицу, содержащую данные рабочего элемента.
Синхронизация 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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы