gpt4 book ai didi

excel - 关闭 Powerpoint 的屏幕更新

转载 作者:行者123 更新时间:2023-12-02 01:58:53 25 4
gpt4 key购买 nike

我正在编写一个脚本,该脚本循环遍历文件夹并根据某些条件创建图形,然后将它们导出到 powerpoint。目前,创建 130 个图表需要 290 秒,其中 286 个用于 powerpoint。我怀疑造成这种情况的一个主要原因是无法关闭 powerpoint 的屏幕更新。我尝试使用这里的代码 http://skp.mvps.org/ppt00033.htm来解决这个问题。但是,我没有注意到任何影响。虽然我可以按 alt-tab 并将 powerpoint 保留在后台,但当切换到 Powerpoint 时,所有更改都会显示出来,您基本上可以看到它如何减慢程序速度。有人知道我如何使用这个代码吗?它应该在类模块中,我应该做其他事情还是我做错了什么?下面是我借用的代码片段以及我如何尝试调用它的示例:

Option Explicit
' UserDefined Error codes
Const ERR_NO_WINDOW_HANDLE As Long = 1000
Const ERR_WINDOW_LOCK_FAIL As Long = 1001
Const ERR_VERSION_NOT_SUPPORTED As Long = 1002

' API declarations for FindWindow() & LockWindowUpdate()
' Use FindWindow API to locate the PowerPoint handle.
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) As Long

' Use LockWindowUpdate to prevent/enable window refresh
Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long

' Use UpdateWindow to force a refresh of the PowerPoint window
Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long

Property Let ScreenUpdating(State As Boolean)

Static hwnd As Long
Dim VersionNo As String
' Get Version Number
If State = False Then
VersionNo = Left(Application.Version, InStr(1, Application.Version, ".") - 1)
'Get handle to the main application window using ClassName
Select Case VersionNo
Case "8"
' For PPT97:
hwnd = FindWindow("PP97FrameClass", 0&)
Case "9"
' For PPT2K:
hwnd = FindWindow("PP9FrameClass", 0&)
Case "10"
' For XP:
hwnd = FindWindow("PP10FrameClass", 0&)
Case "11"
' For 2003:
hwnd = FindWindow("PP11FrameClass", 0&)
Case "12"
' For 2007:
hwnd = FindWindow("PP12FrameClass", 0&)
Case "14"
' For 2010:
hwnd = FindWindow("PPTFrameClass", 0&)
Case Else
Err.Raise Number:=vbObjectError + ERR_VERSION_NOT_SUPPORTED, _
Description:="Newer version."
Exit Property
End Select

If hwnd = 0 Then
Err.Raise Number:=vbObjectError + ERR_NO_WINDOW_HANDLE, _
Description:="Unable to get the PowerPoint Window handle"
Exit Property
End If

If LockWindowUpdate(hwnd) = 0 Then
Err.Raise Number:=vbObjectError + ERR_WINDOW_LOCK_FAIL, _
Description:="Unable to set a PowerPoint window lock"
Exit Property
Else
LockWindowUpdate (hwnd)
End If

Else
'Unlock the Window to refresh
LockWindowUpdate (0&)
UpdateWindow (hwnd)
hwnd = 0
End If
End Property


Sub TestSub()
' Lock screen redraw
If ScreenUpdatingOff = True Then ScreenUpdating = False

' --- Loop through charts in Excel and export them to Powerpoint
' Redraw screen again
ScreenUpdating = True

End Sub

提前非常感谢。很奇怪,这个功能并不容易使用,现在我需要你的帮助!

最佳答案

假设您将代码放入名为 Class1 的类模块中,您将在主代码中创建一个实例,如下所示...

Dim myClass1 as Class1

Set myClass1 = New Class1

Class1.ScreenUpdating = False

编辑:只需使用最初编写的代码:无需添加任何内容。坏消息是,它对我在 PPT 2013 中的测试速度没有任何影响。您可以通过将其设置为 False 来验证其是否正常工作。

类模块cScreenUpdating...

Option Explicit
' UserDefined Error codes
Const ERR_NO_WINDOW_HANDLE As Long = 1000
Const ERR_WINDOW_LOCK_FAIL As Long = 1001
Const ERR_VERSION_NOT_SUPPORTED As Long = 1002

' API declarations for FindWindow() & LockWindowUpdate()
' Use FindWindow API to locate the PowerPoint handle.
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As Long) As Long

' Use LockWindowUpdate to prevent/enable window refresh
Private Declare Function LockWindowUpdate Lib "user32" _
(ByVal hwndLock As Long) As Long

' Use UpdateWindow to force a refresh of the PowerPoint window

Private Declare Function UpdateWindow Lib "user32" (ByVal hWnd As Long) As Long

Property Let ScreenUpdating(State As Boolean)

Static hWnd As Long
Dim VersionNo As String

' Get Version Number

If State = False Then
VersionNo = Left(Application.Version, _
InStr(1, Application.Version, ".") - 1)

'Get handle to the main application window using ClassName

Select Case VersionNo

Case "8"
' For PPT97:
hWnd = FindWindow("PP97FrameClass", 0&)
Case "9"
' For PPT2K:
hWnd = FindWindow("PP9FrameClass", 0&)
Case "10"
' For XP:
hWnd = FindWindow("PP10FrameClass", 0&)
Case "11"
' For 2003:
hWnd = FindWindow("PP11FrameClass", 0&)
Case "12"
' For 2007:
hWnd = FindWindow("PP12FrameClass", 0&)
Case "14", "15"
' For 2010:
hWnd = FindWindow("PPTFrameClass", 0&)
Case Else
Err.Raise Number:=vbObjectError + ERR_VERSION_NOT_SUPPORTED, _
Description:="Newer version."
Exit Property

End Select

If hWnd = 0 Then
' window was not found...
Err.Raise Number:=vbObjectError + ERR_NO_WINDOW_HANDLE, _
Description:="Unable to get the PowerPoint Window handle"
Exit Property
End If

'Attempt to lock the window
If LockWindowUpdate(hWnd) = 0 Then
' attempt failed...
Err.Raise Number:=vbObjectError + ERR_WINDOW_LOCK_FAIL, _
Description:="Unable to set a PowerPoint window lock"
Exit Property

End If

Else 'State = True
'Unlock the Window to refresh
LockWindowUpdate (0&)
UpdateWindow (hWnd)
hWnd = 0
End If

End Property

使用示例...

  Set appObject = New cScreenUpdating
appObject.ScreenUpdating = False
' code here
appObject.ScreenUpdating = True

关于excel - 关闭 Powerpoint 的屏幕更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com