Страницы: 1
RSS
Изменение связей источник Excel
 
Уважаемые коллеги, подскажите, как можно изменить источник данных для связей одним нажатием.
Данные из excel передаются связями в PowerPoint 2016. Изменен путь нахождения источника Excel.
У меня получается изменить источник, только выбирая для каждой связи отдельно, это очень долго и слишком много презентаций нужно обновить. Все презентации на одном источнике.
Изменено: Zenkina - 11.01.2018 20:51:44
 
Одно из решений - макросом в PP заменить описание всех источников по списку.
Неизлечимых болезней нет, есть неизлечимые люди.
 
Нет опыта написания макроса в PP
 
Коллеги спасайте, в офисе ни один сотрудник помочь не смог. Нас покинул сотрудник, который почистил за собой все, чудом нашли источник, очень нужно восстановить обновление презентаций.
 
Тогда Вам нужен сотрудник, который это умеет делать.
Неизлечимых болезней нет, есть неизлечимые люди.
 
Где же его взять((. Возможно вы знаете еще  какие-нибудь способы?
 
Zenkina, в зависимости от того что вы хотите получить это перебор файлов PPTx , перебор объектов в найденных файлах, коррекция связи . Вроде все просто, но требует проверки, отладки, тем более что там объектная модель имеет свои особенности. Тянет на раздел работа, хоть и малобюджетная.
По вопросам из тем форума, личку не читаю.
 
А вы не согласитесь помочь?
 
Поможем, шлите файлы на почту.
Неизлечимых болезней нет, есть неизлечимые люди.
 
TheBestOfTheBest,  на всякий случай, вдруг в новинку и
https://stackoverflow.com/questions/47463441/change-link-excel-sheet-graph-object-powerpoint-vba
По вопросам из тем форума, личку не читаю.
 
Доброе утро! Дорогой БМВ, благодаря вашей подсказке у меня все получилось. Спасибо вам большое за помощь. TheBestOfTheBest вам большое спасибо за отзывчивость и готовность выручить. Всем хорошего дня.
 
Zenkina, Я очень рад что помогло  и в ответ могу только сказать, что вы молодец и относитесь к той категории , кто не сидит сложа руки со своей проблемой и ждет что кто-то сделает все за них. Так держать.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Я очень рад что помогло
мне не помогло :( делаю модель оценки и вяжу отчеты в презентацию. но при отправке файла заказчику, меняется путь. как макросом заменить все пути для всех отчетов?
Спасибо
 
Цитата
Zenkina написал:
Изменен путь нахождения источника Excel.У меня получается изменить источник, только выбирая для каждой связи отдельно, это очень долго и слишком много презентаций нужно обновить. Все презентации на одном источнике.
Цитата
karcevgo написал:
вяжу отчеты в презентацию. но при отправке файла заказчику, меняется путь
karcevgo, добрый день! А не думали о варианте, что и презентации и источник можно разместить в одной папке? И указывать путь через Path? (типа sPath = ActiveWorkBook.Path & "\Источник.xlsx")? И заказчикам сказать, чтобы экселевский источник просто копировали в папку с презентацией?
 
а вот нашел
https://exceloffthegrid.com/edit-links-in-powerpoint-using-vba/
Код
Sub EditPowerPointLinks()

Dim oldFilePath As String
Dim newFilePath As String
Dim pptPresentation As Presentation
Dim pptSlide As Slide
Dim pptShape As Shape

'The old file path as a string (the text to be replaced)
oldFilePath = "String of\File Path\To Be Replaced\Excel File.xlsx"

'The new file path as a string (the text to replace with)
newFilePath = "String of\New File Path\Excel File 2.xlsx"

'Set the variable to the PowerPoint Presentation
Set pptPresentation = ActivePresentation

'Loop through each slide in the presentation
For Each pptSlide In pptPresentation.Slides

    'Loop through each shape in each slide
    For Each pptShape In pptSlide.Shapes
   
        'Find out if the shape is a linked object or a linked picture
        If pptShape.Type = msoLinkedPicture Or pptShape.Type _ 
        = msoLinkedOLEObject Or pptShape.Type = msoLinkedChart Then

            'Use Replace to change the oldFilePath to the newFilePath
            pptShape.LinkFormat.SourceFullName = Replace(LCase _
            (pptShape.LinkFormat.SourceFullName), LCase(oldFilePath), newFilePath)
            
        End If
    Next
Next

'Update the links
pptPresentation.UpdateLinks


End Sub
Изменено: karcevgo - 09.03.2021 14:26:36
 
Цитата
_Igor_61 написал:
можно разместить в одной папке
они обычно так и размещаются.

то есть, как-то тут поменять? я, к сожалению, не силен в VBA...
Код
'The old file path as a string (the text to be replaced)
oldFilePath = "String of\File Path\To Be Replaced\Excel File.xlsx"
 
'The new file path as a string (the text to replace with)
newFilePath = "String of\New File Path\Excel File 2.xlsx"
Изменено: karcevgo - 09.03.2021 14:32:26
 
В двойных кавычках - текст как он есть, т.е.в данном случае прямое и однозначное указание на местонахождение файла .  Я так понимаю (возможно и не прав - с VBA в презентациях не знаком), но "String of\File Path\To Be Replaced" - это названия трех папок.. И в Вашем примере " Path" будет восприниматься как текст, а не как функция.
Цитата
karcevgo написал:
а вот нашел
И?  Пробовали применить к своей задаче? Результат в файле покажете?
Изменено: _Igor_61 - 09.03.2021 17:29:39
 

Есть дополнительное готовое решение для замены связи в Pptm, запускаете макрос, выдает диалоговое окно со связью, которую будете менять, далее попросить выбрать файл, на который вы произведете замену и так для всех связей в презентации. Работает при условии, что все связи возможно заменить из указанных файлов, а также, желательно переименовать новые файлы, на которые будет ссылаться презентация.

P.S.: Если кто-то знает, как ускорить работу этого кода (работает на 200 слайдах) или как избежать ошибки при связях на не существующие книги, буду благодарен!

Код
Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    Dim i
    For i = LBound(arr) To UBound(arr)
        If arr(i) = stringToBeFound Then
            IsInArray = True
            Exit Function
        End If
    Next i
    IsInArray = False
    
End Function

Sub changeLinkTargets()
Application.DisplayAlerts = False


Dim pptSlide As Slide
Dim pptShape As Shape
Dim oldlinks(10) As String
Dim newlinks(10) As String
Dim temp As String
Dim counter As Integer
counter = 0



For Each pptSlide In ActivePresentation.Slides
    For Each pptShape In pptSlide.Shapes
        If pptShape.Type = msoLinkedOLEObject Or pptShape.Type = msoLinkedPicture Then
            With pptShape.LinkFormat
                 
                        temp = Left(.SourceFullName, InStr(.SourceFullName, "!") - 1)
                   
                  If Not IsInArray(temp, oldlinks) Then
                    oldlinks(counter) = temp
                    counter = counter + 1
                End If
            End With
        End If
    'DoEvents
    Next pptShape
'DoEvents
Next pptSlide


Dim fd As FileDialog
Dim fullpath As String
Dim fileselected As Variant




Set fd = Application.FileDialog(msoFileDialogOpen)




For i = 0 To counter - 1
    MsgBox (oldlinks(i))
    With fd

    .AllowMultiSelect = False
    .Show
        
    newlinks(i) = .SelectedItems.Item(1)

    End With
    


    
    For Each pptSlide In ActivePresentation.Slides
        For Each pptShape In pptSlide.Shapes
            If pptShape.Type = msoLinkedOLEObject Or pptShape.Type = msoLinkedPicture Then
                With pptShape.LinkFormat
                
                    If InStr(1, UCase(.SourceFullName), UCase(oldlinks(i))) Then
                        .SourceFullName = Replace(.SourceFullName, oldlinks(i), newlinks(i))
                    End If
                End With
            End If
        'DoEvents
        Next pptShape
    'DoEvents
    Next pptSlide
Next i

MsgBox ("Ура, сработало!")

End Sub


'Эта часть кода обновляет данные на слайдах после замены связей
Sub UpdateLinkTargets()
Dim pptSlide As Slide
Dim pptShape As Shape

For Each pptSlide In ActivePresentation.Slides
    For Each pptShape In pptSlide.Shapes
        If pptShape.Type = msoLinkedOLEObject Or pptShape.Type = msoLinkedPicture Then
            With pptShape.LinkFormat
               .Update
            End With
        End If

    'DoEvents
    Next pptShape
'DoEvents
Next pptSlide

MsgBox ("Ура, сработало!")
End Sub
Страницы: 1
Наверх