use*_*325 5 excel vba excel-vba
我在powerpoint模块中成功使用了这个代码,但是当我在excel模块中移动它时,它给我带来了一些问题.我将Powerpoint应用程序嵌入到Excel的第1页.目标是从excel生成powerpoint,并在具有excel范围内新公司名称的powerpoint幻灯片上显示时替换公司名称.我得到错误429 ActiveX组件无法创建对象"For Each osld在ActivePresentation.Slides.我的Powerpoint演示文稿是否未激活?任何帮助将不胜感激.使用excel/Powerpoint 2010.
Sub changeme(sFindMe As String, sSwapme As String)
Dim osld As Slide
Dim oshp As Shape
Dim otemp As TextRange
Dim otext As TextRange
Dim Inewstart As Integer
For Each osld In ActivePresentation.Slides
For Each oshp In osld.Shapes
If oshp.HasTextFrame Then
If oshp.TextFrame.HasText Then
Set otext = oshp.TextFrame.TextRange
Set otemp = otext.Replace(sFindMe, sSwapme, , msoFalse, msoFalse)
Do While Not otemp Is Nothing
Inewstart = otemp.Start + otemp.Length
Set otemp = otext.Replace(sFindMe, sSwapme, Inewstart, msoFalse, msoFalse)
Loop
End If
End If
Next oshp
Next osld
End Sub
'-------------------------------------------------------------------------
Sub swap()
Dim sFindMe As String
Dim sSwapme As String
Dim ppApp As PowerPoint.Application
Dim ppPreso As PowerPoint.Presentation
'Start Powerpoint
'Look for existing instance
On Error Resume Next
Set ppApp = GetObject(, "PowerPoint.Application")
On Error Goto 0
'Create new instance if no instance exists
Set ppApp = CreateObject("Powerpoint.Application")
'Open Template in word
With Sheets("Sheet1").Shapes("Object 1").OLEFormat.Verb(Verb:=xlVerbOpen)
End With
'Make it visible
ppApp.Visible = True
sFindMe = "Name To Find"
'change this to suit
sSwapme = "New Name"
Call changeme(sFindMe, sSwapme)
'sFindMe = "<find2>"
'sSwapme = ActivePresentation.Slides(1).Shapes(2).TextFrame.TextRange
'Call changeme(sFindMe, sSwapme)
End Sub
Run Code Online (Sandbox Code Playgroud)
ActivePresentation是一个Powerpoint对象.它对Excel没有任何意义.当您打开演示文稿时,您必须设置与它的连接,以便Excel与之关联.我建议使用以下代码.此外,我使用了Late Binding,因此您无需从Excel添加对MS Powerpoint的任何引用.
逻辑:
经过试验和测试
Private Declare Function GetTempPath Lib "kernel32" _
Alias "GetTempPathA" (ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long
Dim ppApp As Object, ppPreso As Object, ppPresTemp As Object
Sub swap()
Dim sFindMe As String, sSwapme As String, FlName As String
Dim objOLE As OLEObject
Dim sh As Shape
'~~> Decide on a temporary file name which will be saved in the
'~~> users temporary folder. You might want to change the extention
'~~> from pptx to ppt if you are using earlier versions of MS Office
FlName = GetTempDirectory & "\Temp.pptx"
Set sh = Sheets("Sheet1").Shapes("Object 1")
sh.OLEFormat.Activate
Set objOLE = sh.OLEFormat.Object
Set ppPresTemp = objOLE.Object
'~~> Save the file to the relevant temp folder
ppPresTemp.SaveAs Filename:=FlName
'~~> Close the temp presentation that opened
ppPresTemp.Close
'~~> Establish an Powerpoint application object
On Error Resume Next
Set ppApp = GetObject(, "PowerPoint.Application")
If Err.Number <> 0 Then
Set ppApp = CreateObject("PowerPoint.Application")
End If
Err.Clear
On Error GoTo 0
ppApp.Visible = True
Set ppPreso = ppApp.Presentations.Open(Filename:=FlName)
sFindMe = "Name To Find"
sSwapme = "New Name"
changeme sFindMe, sSwapme
'~~> In the end Clean Up (Delete the temp file saved in the temp directory)
'Kill FlName
End Sub
Sub changeme(sFindMe As String, sSwapme As String)
Dim osld As Object, oshp As Object
Dim otemp As TextRange, otext As TextRange
Dim Inewstart As Integer
For Each osld In ppPreso.Slides
For Each oshp In osld.Shapes
If oshp.HasTextFrame Then
If oshp.TextFrame.HasText Then
Set otext = oshp.TextFrame.TextRange
Set otemp = otext.Replace(sFindMe, sSwapme, , _
msoFalse, msoFalse)
Do While Not otemp Is Nothing
Inewstart = otemp.Start + otemp.Length
Set otemp = otext.Replace(sFindMe, sSwapme, _
Inewstart, msoFalse, msoFalse)
Loop
End If
End If
Next oshp
Next osld
End Sub
'~~> Function to get the user's temp directory
Function GetTempDirectory() As String
Dim buffer As String
Dim bufferLen As Long
buffer = Space$(256)
bufferLen = GetTempPath(Len(buffer), buffer)
If bufferLen > 0 And bufferLen < 256 Then
buffer = Left$(buffer, bufferLen)
End If
If InStr(buffer, Chr$(0)) <> 0 Then
GetTempDirectory = Left$(buffer, InStr(buffer, Chr$(0)) - 1)
Else
GetTempDirectory = buffer
End If
End Function
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 :)
希德
| 归档时间: |
|
| 查看次数: |
10356 次 |
| 最近记录: |