PowerPoint中的宏,链接到Excel电子表格中存储的数据

PowerPoint中的宏,链接到Excel电子表格中存储的数据,excel,vba,powerpoint,Excel,Vba,Powerpoint,我有一个Excel电子表格(比如objectdata.xls),用于设置不同矩形的宽度/长度。因此,电子表格有3列: 对象名 对象宽度 对象长度 电子表格中定义了大约100个矩形 我试图做的是在PowerPoint(PP)中运行一个宏,该宏将从电子表格中读取数据(理想情况下,该信息应存储在PP文件外部,但如果需要,它可以是PP中的链接或嵌入文件),然后更新我在PP文件中包含的矩形形状的大小 例如,在幻灯片1上,宏读取spreadhseet中的第1行,并看到对象宽度为5,长度为10,因此更新PP中

我有一个Excel电子表格(比如objectdata.xls),用于设置不同矩形的宽度/长度。因此,电子表格有3列:

对象名 对象宽度 对象长度

电子表格中定义了大约100个矩形

我试图做的是在PowerPoint(PP)中运行一个宏,该宏将从电子表格中读取数据(理想情况下,该信息应存储在PP文件外部,但如果需要,它可以是PP中的链接或嵌入文件),然后更新我在PP文件中包含的矩形形状的大小

例如,在幻灯片1上,宏读取spreadhseet中的第1行,并看到对象宽度为5,长度为10,因此更新PP中矩形形状的大小

有人能告诉我这是否可以做到吗


谢谢。

是的,这当然可以做到。它需要比我手边的代码多一点的代码,你需要修改我发布的任何内容。但是,看看这里的例子,你可以开始。这些指向我维护的PowerPoint常见问题解答网站。不收任何费用

从PowerPoint控制Office应用程序(由Naresh Nichani和Brian Reilly编写)

从PowerPoint自动化Excel。从Excel自动化PowerPoint。等等

我可能会打开excel文件,将内容读入数组,然后使用数组中的数据在PPT中进行实际工作

如果您需要PPT部分的帮助,请告诉我们。主要是编写一个函数,比如[aircode]:

Sub SetRectangleSize ( sRectangleName as string, sngWidth as Single, sngHeight as Single)
  Dim oShp as Shape
  Set oShp = GetShapeNamed(sRectangleName, lSlideIndex)
  If Not oShp is Nothing Then
    With oShp
        .Width = sngWidth
        .Height = sngHeight
    End With
  End If
End Sub

函数getShapeName(sName为字符串,lSlideIndex为长)为形状
出错时继续下一步
设置getShapeName=ActivePresentation.Slides(lSlideIndex).Shapes(sName)
如果错误号为0,则
“幻灯片上没有这个名字的形状;返回空
设置GetShapeName=Nothing
如果结束
端函数

顺便说一下,我会考虑使用标签来识别矩形而不是形状名称(这往往是不可靠的)。p> 使用GetExcelData完成工作;它调用GetExcel

Function GetExcel() As Object
'---------------------------------------------------------------------------------------
' Procedure : GetExcel
' Author    : Naresh Nichani / Steve Rindsberg
' Purpose   :
'               Check if an instance of Excel is running. If so obtain a reference to the running Excel application
'               Otherwise Create a new instance of Excel and assign the XL application reference to oXLApp object
' SR        :   Modified 2010-02-23 to ALWAYS create a new instance rather than using an existing one, so when we
'           :   close the one we open, we don't wack the user's other instances of Excel if any
' Params    :   None
' Returns   :   An Excel Application object on success, Nothing on failure
'---------------------------------------------------------------------------------------

   On Error GoTo GetExcel_ErrorHandler

    On Error Resume Next
    Err.Number = 0

    Dim oXLAPP As Object

' Comment out the following bits to force a new instance of Excel
' and leave any existing instances alone
'    Set oXLApp = GetObject(, "Excel.Application")
'    If Err.Number <> 0 Then
'        Err.Number = 0
        Set oXLAPP = CreateObject("Excel.Application")
        If Err.Number <> 0 Then
            'MsgBox "Unable to start Excel.", vbInformation, "Start Excel"
            Exit Function
        End If
'    End If

   On Error GoTo GetExcel_ErrorHandler

    If Not oXLAPP Is Nothing Then
        Set GetExcel = oXLAPP
    Else
        [MASTTBAR].rnrErrLog "modExcel:GetExcel - unable to invoke Excel instance"
    End If

    Set oXLAPP = Nothing

    Exit Function

NormalExit:
   On Error GoTo 0
   Exit Function

GetExcel_ErrorHandler:
    Resume NormalExit
End Function

Function GetExcelData(sFilename As String, _
    Optional lWorksheetIndex As Long = 1, _
    Optional sWorksheetName As String = "") As Variant
'---------------------------------------------------------------------------------------
' Purpose   : Gets the "active" data from the file/worksheet specified

    Dim oXLAPP As Object
    Dim oxlWB As Object
    Dim oxlRange As Object

    Dim x As Long
    Dim y As Long
    Dim sMsg As String

    Dim lVisibleRowCount As Long
    Dim lVisibleColCount As Long

    Dim aData() As String

   On Error GoTo GetExcelData_ErrorHandler

    Set oXLAPP = GetExcel()
    If oXLAPP Is Nothing Then
        Exit Function
    End If

    ' open the workbook read-only
    Set oxlWB = oXLAPP.Workbooks.Open(sFilename, , True)
    If oxlWB Is Nothing Then
        Exit Function
    End If

    If Len(sWorksheetName) > 0 Then
        Set oxlRange = GetUsedRange(oxlWB.Worksheets(sWorksheetName))
    Else
        Set oxlRange = GetUsedRange(oxlWB.Worksheets(lWorksheetIndex))
    End If

    If oxlRange Is Nothing Then
        Exit Function
    End If

    ' Get a count of visible rows/columns (ignore hidden rows/cols)
    For x = 1 To oxlRange.Rows.Count
        If Not oxlRange.Rows(x).Hidden Then
            lVisibleRowCount = lVisibleRowCount + 1
        End If
    Next    ' row

    For y = 1 To oxlRange.Columns.Count
        If Not oxlRange.Columns(y).Hidden Then
            lVisibleColCount = lVisibleColCount + 1
        End If
    Next

    ReDim aData(1 To lVisibleRowCount, 1 To lVisibleColCount)

    lVisibleRowCount = 0
    For x = 1 To oxlRange.Rows.Count
        If Not oxlRange.Rows(x).Hidden Then
            lVisibleRowCount = lVisibleRowCount + 1
            lVisibleColCount = 0
            For y = 1 To oxlRange.Columns.Count
                If Not oxlRange.Columns(y).Hidden Then
                    lVisibleColCount = lVisibleColCount + 1
                    aData(lVisibleRowCount, lVisibleColCount) = oxlRange.Cells(x, y).Text
                End If
            Next
        End If
    Next

    ' return data in array
    GetExcelData = aData

NormalExit:
    On Error GoTo 0

    ' Close the workbook
    If Not oxlWB Is Nothing Then
        oXLAPP.DisplayAlerts = False
        oxlWB.Close
        oXLAPP.DisplayAlerts = True
    End If

    'To Close XL application
    If Not oXLAPP Is Nothing Then
        oXLAPP.Quit
    End If

    'Set the XL Application and XL Workbook objects to Nothing
    Set oxlRange = Nothing
    Set oxlWB = Nothing
    Set oXLAPP = Nothing

    Exit Function

GetExcelData_ErrorHandler:
    Resume NormalExit

End Function
函数GetExcel()作为对象 '--------------------------------------------------------------------------------------- '过程:GetExcel 作者:Naresh Nichani/Steve Rindsberg “目的: '检查Excel实例是否正在运行。如果是,请获取对正在运行的Excel应用程序的引用 '否则,创建一个新的Excel实例,并将XL应用程序引用分配给oXLApp对象 'SR:修改了2010-02-23以始终创建新实例,而不是使用现有实例,因此当我们 “:关闭我们打开的一个,我们不会破坏用户的其他Excel实例(如果有的话) ”“没有 '返回:成功时为Excel应用程序对象,失败时为空 '--------------------------------------------------------------------------------------- 错误转到GetExcel\u ErrorHandler时出错 出错时继续下一步 错误号=0 作为对象的Dim-oXLAPP '注释掉以下位以强制创建新的Excel实例 '并保留任何现有实例 'Set-oXLApp=GetObject(,“Excel.Application”) '如果错误号为0,则 'Err.Number=0 设置oXLAPP=CreateObject(“Excel.Application”) 如果错误号为0,则 “MsgBox”无法启动Excel“。vbInformation,“启动Excel” 退出功能 如果结束 "完" 错误转到GetExcel\u ErrorHandler时出错 如果不是,那么oXLAPP什么都不是 设置GetExcel=oXLAPP 其他的 [MASTTBAR].rnrErrLog“modExcel:GetExcel-无法调用Excel实例” 如果结束 设置oXLAPP=Nothing 退出功能 正常退出: 错误转到0 退出功能 GetExcel\u错误处理程序: 恢复正常退出 端函数 函数GetExcelData(sFilename为字符串_ 可选的lWorksheetIndex,长度为1_ 可选的sWorksheetName As String=“”)作为变量 '--------------------------------------------------------------------------------------- '用途:从指定的文件/工作表中获取“活动”数据 作为对象的Dim-oXLAPP 作为对象的Dim-oxlWB 作为对象的Dim oxlRange 暗x等长 长得一样暗 将sMsg设置为字符串 昏暗的lVisibleRowCount尽可能长 暗淡的lVisibleColCount尽可能长 Dim aData()作为字符串 错误转到GetExcelData\u ErrorHandler时出错 设置oXLAPP=GetExcel() 如果oXLAPP什么都不是 退出功能 如果结束 '以只读方式打开工作簿 设置oxlWB=oXLAPP.Workbooks.Open(sFilename,True) 如果oxlWB什么都不是,那么 退出功能 如果结束 如果Len(sWorksheetName)>0,则 设置oxlRange=GetUsedRange(oxlWB.Worksheets(sWorksheetName)) 其他的 设置oxlRange=GetUsedRange(oxlWB.工作表(lWorksheetIndex)) 如果结束 如果oxlRange不算什么,那么 退出功能 如果结束 '获取可见行/列的计数(忽略隐藏行/列) 对于x=1到oxlRange.Rows.Count 如果不是oxlRange.Rows(x).隐藏,则 lVisibleRowCount=lVisibleRowCount+1 如果结束 下一排 对于y=1到oxlRange.Columns.Count 如果不是oxlRange.Columns(y).Hidden,则 lVisibleColCount=lVisibleColCount+1 如果结束 下一个 ReDim aData(1到lVisibleRowCount,1到lVisibleColCount) lVisibleRowCount=0 对于x=1到oxlRange.Rows.Count 如果不是oxlRange.Rows(x).隐藏,则 lVisibleRowCount=lVisibleRowCount+1 lVisibleColCount=0 对于y=1到oxlRange.Columns.Count 如果不是oxlRange.Columns(y).Hidden,则 lVisibleColCount=lVisibleColCount+1 数据(lVisibleRowCount,lVisibleColCount)=oxlRange.Cells(x,y).Text 如果结束 下一个 如果结束 下一个 '返回数组中的数据 GetExcelData=aData 正常退出:
Function GetExcel() As Object
'---------------------------------------------------------------------------------------
' Procedure : GetExcel
' Author    : Naresh Nichani / Steve Rindsberg
' Purpose   :
'               Check if an instance of Excel is running. If so obtain a reference to the running Excel application
'               Otherwise Create a new instance of Excel and assign the XL application reference to oXLApp object
' SR        :   Modified 2010-02-23 to ALWAYS create a new instance rather than using an existing one, so when we
'           :   close the one we open, we don't wack the user's other instances of Excel if any
' Params    :   None
' Returns   :   An Excel Application object on success, Nothing on failure
'---------------------------------------------------------------------------------------

   On Error GoTo GetExcel_ErrorHandler

    On Error Resume Next
    Err.Number = 0

    Dim oXLAPP As Object

' Comment out the following bits to force a new instance of Excel
' and leave any existing instances alone
'    Set oXLApp = GetObject(, "Excel.Application")
'    If Err.Number <> 0 Then
'        Err.Number = 0
        Set oXLAPP = CreateObject("Excel.Application")
        If Err.Number <> 0 Then
            'MsgBox "Unable to start Excel.", vbInformation, "Start Excel"
            Exit Function
        End If
'    End If

   On Error GoTo GetExcel_ErrorHandler

    If Not oXLAPP Is Nothing Then
        Set GetExcel = oXLAPP
    Else
        [MASTTBAR].rnrErrLog "modExcel:GetExcel - unable to invoke Excel instance"
    End If

    Set oXLAPP = Nothing

    Exit Function

NormalExit:
   On Error GoTo 0
   Exit Function

GetExcel_ErrorHandler:
    Resume NormalExit
End Function

Function GetExcelData(sFilename As String, _
    Optional lWorksheetIndex As Long = 1, _
    Optional sWorksheetName As String = "") As Variant
'---------------------------------------------------------------------------------------
' Purpose   : Gets the "active" data from the file/worksheet specified

    Dim oXLAPP As Object
    Dim oxlWB As Object
    Dim oxlRange As Object

    Dim x As Long
    Dim y As Long
    Dim sMsg As String

    Dim lVisibleRowCount As Long
    Dim lVisibleColCount As Long

    Dim aData() As String

   On Error GoTo GetExcelData_ErrorHandler

    Set oXLAPP = GetExcel()
    If oXLAPP Is Nothing Then
        Exit Function
    End If

    ' open the workbook read-only
    Set oxlWB = oXLAPP.Workbooks.Open(sFilename, , True)
    If oxlWB Is Nothing Then
        Exit Function
    End If

    If Len(sWorksheetName) > 0 Then
        Set oxlRange = GetUsedRange(oxlWB.Worksheets(sWorksheetName))
    Else
        Set oxlRange = GetUsedRange(oxlWB.Worksheets(lWorksheetIndex))
    End If

    If oxlRange Is Nothing Then
        Exit Function
    End If

    ' Get a count of visible rows/columns (ignore hidden rows/cols)
    For x = 1 To oxlRange.Rows.Count
        If Not oxlRange.Rows(x).Hidden Then
            lVisibleRowCount = lVisibleRowCount + 1
        End If
    Next    ' row

    For y = 1 To oxlRange.Columns.Count
        If Not oxlRange.Columns(y).Hidden Then
            lVisibleColCount = lVisibleColCount + 1
        End If
    Next

    ReDim aData(1 To lVisibleRowCount, 1 To lVisibleColCount)

    lVisibleRowCount = 0
    For x = 1 To oxlRange.Rows.Count
        If Not oxlRange.Rows(x).Hidden Then
            lVisibleRowCount = lVisibleRowCount + 1
            lVisibleColCount = 0
            For y = 1 To oxlRange.Columns.Count
                If Not oxlRange.Columns(y).Hidden Then
                    lVisibleColCount = lVisibleColCount + 1
                    aData(lVisibleRowCount, lVisibleColCount) = oxlRange.Cells(x, y).Text
                End If
            Next
        End If
    Next

    ' return data in array
    GetExcelData = aData

NormalExit:
    On Error GoTo 0

    ' Close the workbook
    If Not oxlWB Is Nothing Then
        oXLAPP.DisplayAlerts = False
        oxlWB.Close
        oXLAPP.DisplayAlerts = True
    End If

    'To Close XL application
    If Not oXLAPP Is Nothing Then
        oXLAPP.Quit
    End If

    'Set the XL Application and XL Workbook objects to Nothing
    Set oxlRange = Nothing
    Set oxlWB = Nothing
    Set oXLAPP = Nothing

    Exit Function

GetExcelData_ErrorHandler:
    Resume NormalExit

End Function