注册 登录
编程论坛 VFP论坛

求助:vfp控制PPT按键链接跳转指定页无反应是何原因?

cqycyhb 发布于 7 天前 08:58, 284 次点击
*以下VFP9.0编程控制PPT代码,从第2页跳转到第30页测试,.Action的值从1-10都试过,Hyperlink.SubAddresse值用cID值、cTitle值,或者2者结合都试过,均未成功,不知问题出在哪里?但如果用.Hyperlink.Address ="D:\XwJ.pptx"测试(需屏蔽Hyperlink.SubAddress,二都不能同时有),可以打开新的文件链接.
 
oPPT = CREATEOBJECT("PowerPoint.Application") && 适用微软OFFice
 * oPPT = CREATEOBJECT("KWPP.Application")     && 适用WPS office版
oPres = oPPT.Presentations.Add()
LOCAL cID, cTitle

* 创建幻灯片并设置标题
FOR i = 1 TO 50
    oSlide = oPres.Slides.Add(i, 1)  && 使用标题布局
    oSlide.Shapes(1).TextFrame.TextRange.Text = "第" + ALLTRIM(STR(i)) + "页"

    IF i = 30
        cID = ALLTRIM(STR(oSlide.SlideID))
        cTitle = oSlide.Shapes(1).TextFrame.TextRange.Text
    ENDIF

ENDFOR

* 在第2页添加跳转按钮
oSlide2 = oPres.Slides(2)
oShape = oSlide2.Shapes.AddShape(1, 100, 100, 200, 50)
oShape.TextFrame.TextRange.Text = "跳转到第30页"

WITH oShape.ActionSettings(1)
    .Action = 7
     .Hyperlink.SubAddress = cID  &&  或cID,cTitle
*    .Hyperlink.Address ="D:\cs.pptx"  &&  不与上句一起单独用可以

ENDWITH
oPres.SaveAs("D:\cs.pptx")

With oPres.SlideShowSettings
.ShowType =1   && 放映类型 1-演讲者放映 2-观众自行浏览 3-在展台浏览(全屏)
.LoopUntilStopped=0  && 循环显示各幻灯片 0-不循环 1-循环放映
.RangeType = 1  && 放映范围 1-全部 2\3-从XX开始到XX结束
.AdvanceMode=2  && 换片方式 1-手动 2-如果排练时间存在,则使用它
.Run   && 运行
ENDWiTH
INKEY(0)
oPres.Close()
oPPT.Quit()
RELEASE ALL
17 回复
#2
cqycyhb6 天前 09:42
Hyperlink.SubAddress
有哪个大神知道这句该怎么赋值才行
#3
schtg5 天前 06:27
我也试了,
.Hyperlink.SubAddress = cID  &&  或cID,cTitle
就是这个未添加上超链接,不起作用。
#4
cqycyhb5 天前 10:51

查看了一下VBA示例文档,是这样说明的.如果转换成VFP语言,应该怎样写

Hyperlink.SubAddress
返回或设置与指定超链接相关联的文档中的位置,例如 WPS 文档中的书签、ET 工作表中的区域或WPP 演示文稿中的幻灯片。可读/写 String 类型。
语法
express.SubAddress
express   一个代表 Hyperlink 对象的变量。
示例
示例代码复制
/*本示例设置在幻灯片放映过程中,单击当前演示文稿第一张幻灯片第一个形状时,跳转到 Latest Figures.ppt 中名为“Last Quarter”的幻灯片。*/
function test(){    
Application.ActivePresentation.Slides.Item(1).Shapes.Item(1).ActionSettings.Item(ppMouseClick).Action = ppActionHyperlink    
let h = Application.ActivePresentation.Slides.Item(1).Shapes.Item(1).ActionSettings.Item(ppMouseClick).Hyperlink
    h.Address = "c:\\sales\\latest figures.ppt"
    h.SubAddress = "last quarter"
}

示例代码复制
/*本示例设置在幻灯片放映过程中,单击当前演示文稿第一张幻灯片第一个形状时,跳转到 Latest.xls 中 A1:B10 单元格区域。*/
function test(){    
ActivePresentation.Slides.Item(1).Shapes.Item(1).ActionSettings.Item(ppMouseClick).Action = ppActionHyperlink    
let h = ActivePresentation.Slides.Item(1).Shapes.Item(1).ActionSettings.Item(ppMouseClick).Hyperlink
    h.Address = "c:\\sales\\latest.xls"
    h.SubAddress = "A1:B10"
}


#5
schtg4 天前 06:27
回复 4楼 cqycyhb
改成下面的,试一试:
程序代码:
oPPT = CREATEOBJECT("PowerPoint.Application") && 适用微软OFFice

 * oPPT = CREATEOBJECT("KWPP.Application")     && 适用WPS office版
oPres = oPPT.Presentations.Add()
LOCAL cID, cTitle

* 创建幻灯片并设置标题
FOR i = 1 TO 50
    oSlide = oPres.Slides.Add(i, 1)  && 使用标题布局
    oSlide.Shapes(1).TextFrame.TextRange.Text = "第" + ALLTRIM(STR(i)) + "页"

    IF i = 30
        cID = ALLTRIM(STR(oSlide.SlideID))
        cTitle = oSlide.Shapes(1).TextFrame.TextRange.Text
    ENDIF

ENDFOR

* 在第2页添加跳转按钮
oSlide2 = oPres.Slides(2)
oShape = oSlide2.Shapes.AddShape(1, 100, 100, 200, 50)
oShape.TextFrame.TextRange.Text = "跳转到第30页"

WITH oShape.ActionSettings(1)
    .Action = 7
    .Hyperlink.Address =""
    .Hyperlink.SubAddress = "第30页"
ENDWITH
oPres.SaveAs(SYS(5)+CURDIR()+"cs.pptx")

With oPres.SlideShowSettings
    .ShowType =1   && 放映类型 1-演讲者放映 2-观众自行浏览 3-在展台浏览(全屏)
    .LoopUntilStopped=0  && 循环显示各幻灯片 0-不循环 1-循环放映
    .RangeType = 1  && 放映范围 1-全部 2\3-从XX开始到XX结束
    .AdvanceMode=2  && 换片方式 1-手动 2-如果排练时间存在,则使用它
    .Run   && 运行
ENDWiTH
INKEY(0)
oPres.Close()
oPPT.Quit()
RELEASE ALL
#6
cqycyhb4 天前 11:10
回复 5楼 schtg
我是用的WPS版本,测试了一下,只是跳到下一页,还是没成功。不知微软PPT测试能否成功
#7
csyx4 天前 12:46
感觉就把赋值顺序颠倒一下就行,先赋值 Address 再赋值 SubAddress。我这电脑上没 PowerPoint 验证不了

.Hyperlink.Address ="D:\cs.pptx"  &&  不与上句一起单独用可以
.Hyperlink.SubAddress = cID  &&  或cID,cTitle

#8
cqycyhb4 天前 13:15
回复 7楼 csyx
测试了,交换位置还是不行。
#9
cqycyhb4 天前 14:58
以下是网上查到的ActionSettings(1).Action  在VBA中常量对应的VFP值,
经测试,1-6这几个数值测试成功(需屏蔽Address和SubAddress语句),1-下一页 2-上一页 3-第一页 4-最后一页 5-最近观看那一页 6-结束放映 .其余数值没测试成功

ppActionMixed    -2    执行混合动作。
ppActionNone    0    不执行任何动作。
ppActionNextSlide    1    转到下一张幻灯片。
ppActionPreviousSlide    2    转到上一张幻灯片。
ppActionFirstSlide    3    返回第一张幻灯片。
ppActionLastSlide    4    移动到最后一张幻灯片。
ppActionLastSlideViewed    5    移动到最近观看的幻灯片。
ppActionEndShow    6    幻灯片放映结束。
ppActionHyperlink    7    超链接。
ppActionRunMacro    8    运行一个宏。
ppActionRunProgram    9    运行一个程序。
ppActionNamedSlideShow    10    运行幻灯片。
ppActionOLEVerb    11    OLE 动作。
ppActionPlay    12    从幻灯片开始。

#10
schtg4 天前 15:23
回复 6楼 cqycyhb
正好空闲,测试了一下,应该可以的哈。
第一步,生成PPTX。
程序代码:

oPPT = CREATEOBJECT("PowerPoint.Application") && 适用微软OFFice

 * oPPT = CREATEOBJECT("KWPP.Application")     && 适用WPS office版
oPres = oPPT.Presentations.Add()
LOCAL cID, cTitle

* 创建幻灯片并设置标题
FOR i = 1 TO 50
    oSlide = oPres.Slides.Add(i, 1)  && 使用标题布局
    oSlide.Shapes(1).TextFrame.TextRange.Text = "第" + ALLTRIM(STR(i)) + "页"

    IF i = 30
        cID = ALLTRIM(STR(oSlide.SlideID))
        cTitle = oSlide.Shapes(1).TextFrame.TextRange.Text
    ENDIF

ENDFOR

* 在第2页添加跳转按钮
oSlide2 = oPres.Slides(2)
oShape = oSlide2.Shapes.AddShape(1, 100, 100, 200, 50)
oShape.TextFrame.TextRange.Text = "跳转到第30页"

WITH oShape.ActionSettings(1)
    .Action = 7
    .Hyperlink.Address =""
    .Hyperlink.SubAddress = "第30页"
ENDWITH
oPres.SaveAs(SYS(5)+CURDIR()+"cs.pptx")

oPres.Close()
oPPT.Quit()
RELEASE ALL
quit

第二步,用WPS打开生成的cs.PPTX文件,可以达到效果。

#11
cqycyhb4 天前 15:50
回复 10楼 schtg
我的电脑是用WPS生成的PPT文件,经测试,还是不能跳转到第30页.

#12
cqycyhb4 天前 15:52
回复 11楼 cqycyhb
这个是生成的PPT文件
只有本站会员才能查看附件,请 登录
#13
schtg4 天前 16:53
回复 12楼 cqycyhb
超连接没有写入到指定的页框哈,当然不会跳转的。可能是软件不同造成的哈。
这个是微软的生成的哈
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2025-2-18 16:55编辑过]

#14
csyx4 天前 17:28
恶心的wps!找了台电脑,手工修改 ppt 的超链接设置,却找不到录制 ppt 宏的按钮,只好手工读出来,结果是个奇怪的字符串,用它作为 SubAddress 的值,确实可以跳转到第三十页 恶心的是第一个参数的数值不知道代表什么?

WITH oShape.ActionSettings(1)
    .Action = 7
    .Hyperlink.Address = ''
    .Hyperlink.SubAddress = '150995229,30,第30页'
ENDWITH

#15
cqycyhb4 天前 20:26
回复 14楼 csyx
非常感谢,在WPS测试成功了.
#16
cqycyhb4 天前 21:17
回复 14楼 csyx
老师,经测试,如果要跳转到第5页,用那串数字则不行。
另外,.Hyperlink.SubAddress = "150995229,30,第30页",后面的两个参数只需1个即可,但没有又不行.还可以省略为
Hyperlink.SubAddress = "150995229,,"
或 Hyperlink.SubAddress = "150995229,0"
Hyperlink.SubAddress = "150995229,A"
甚至Hyperlink.SubAddress = "150995229,"
都可以转到30页,说明150995229是第30页转换成的代码

问题是,如果转到其他页,那代码又是多少呢,转换规则是怎样的呢?
#17
csyx4 天前 21:29
大致推测了一下
150995229 > Transform(150995229, '@0') > 0x0900011D > 0x09000000 + 0x100 + 0x1D
而 0x1D == 29 == 30-1
因此这个数可能是这样的公式:0x09000000 + (255 + 要跳转的页号),要调到第五页就是 0x09000000 + (255 + 5) = 150995204
按这个公式我试了一下是对的,因纯粹是猜测,没官方资料来证实,所以无法知道是否适合其他版本的 wps
我这测试用的版本
只有本站会员才能查看附件,请 登录




[此贴子已经被作者于2025-2-18 21:46编辑过]

#18
cqycyhb4 天前 22:45
回复 17楼 csyx
谢谢老师.我测试了一下300页以内,运行没问题.那串数字为 150995199+n ,n为要跳转的页码
.代码修改如下:
* oPPT = CREATEOBJECT("PowerPoint.Application") && 适用微软OFFice

  oPPT = CREATEOBJECT("KWPP.Application")     && 适用WPS office版
oPres = oPPT.Presentations.Add()
LOCAL cID, cTitle
n=210  && 跳转到第210页
* 创建幻灯片并设置标题
FOR i = 1 TO 300
    oSlide = oPres.Slides.Add(i, 1)  && 使用标题布局
    oSlide.Shapes(1).TextFrame.TextRange.Text = "第" + ALLTRIM(STR(i)) + "页"
ENDFOR

* 在第2页添加跳转按钮

oSlide2 = oPres.Slides(2)
oShape = oSlide2.Shapes.AddShape(1, 100, 100, 200, 50)
oShape.TextFrame.TextRange.Text = "跳转到第"+ALLTRIM(STR(n))+"页"

WITH oShape.ActionSettings(1)
    .Action = 7
    .Hyperlink.Address = ''
    .Hyperlink.SubAddress = ALLTRIM(STR(150995199+n))+",0"

ENDWITH
oPres.SaveAs("D:\cs.pptx")

oPres.Close()
oPPT.Quit()
RELEASE ALL
=MESSAGEBOX('文件保存在D盘')
* QUIT
1