三个问题。
使用我目前拥有的数据库,此代码在4-5分钟内运行。通常它将是一个包含100~列的数据库。我想让这更快。
我的另一个问题是我不断获得两个不同的弹出窗口:
"文件现在可用于编辑"
"用户当前正在编辑工作簿,您想以只读模式运行吗?"
非常烦人,但我无法忍受。
最后,我有时也会在这一行上出错:
pptSlide.Shapes.PasteSpecial DataType:= ppPasteHTML,Link:= msoFalse但我所要做的就是重新运行程序,它就会消失。
我正在寻找任何建议,以使此代码运行更快,更顺畅,欢迎任何建议。
谢谢!
Public Sub averageScoreRelay()
' 1.从PPT运行并打开Excel文件
' 2.从幻灯片1开始,找到一个包含单词" iq _"的框,如果它有这些单词,那么它后面会有数字" iq_43"或" iq_43,iq_56,iq_72"。
' 3.在拆分和重新格式化字符串后,在打开的Excel文件中找到这些单词和数字。
' 3.将列复制到新的表格中并重复所有" iq _' s"直到表2有一张桌子。
' 4.将表格从xl粘贴表复制到ppt
' 5.为每张幻灯片执行此操作
'定时器启动
Dim StartTime为Double
Dim SecondsElapsed With Double
StartTime =计时器
'创建变量
Dim xlApp作为Excel.Application
Dim xlWB作为Excel.Workbook
Dim pptSlide As Slide
昏暗的形状
Dim pptText As String
昏暗的pptPres作为对象
Dim iq_Array As Variant
Dim arrayLoop As Integer
Dim i As Integer
昏暗的myShape作为对象
Dim colNumb As Integer
昏暗的大小为整数
Dim k As Integer
Dim lRows As Long
Dim lCols As Long
'创建新的Excel实例并打开相关的工作簿
设置xlApp = New Excel.Application
' xlApp.Visible = True'使Excel可见
设置xlWB = xlApp.Workbooks.Open(" file.xlsx",True,False ,,,, True,Notify:= False)'打开相关工作簿
如果xlWB没什么,那么'可能不需要这个if语句。稍后检查。
MsgBox("检索平均分数报告时出错,检查文件路径")
退出子
万一
xlApp.DisplayAlerts = False
使用xlWB.Worksheets(" Sheet1")
colNumb = .Cells(1,.Columns.Count).End(xlToLeft).Column
结束
'在Excel中创建一个新的空白表,应该是" Sheet2"
xlWB.Worksheets.Add After:= xlWB.ActiveSheet
'让pptPres成为ppt活跃的
设置pptPres = PowerPoint.ActivePresentation
'遍历每个pptSlide并检查IQ文本框,获取avgScore值并创建pptTable
对于pptPres.Slides中的每个pptSlide
pptSlide.Select
'搜索幻灯片中的形状
对于每个Shpe在pptSlide.Shapes
k = 1
'确定是否有文本框架
如果Shpe.HasTextFrame那么
'确定文本框中是否有文字
如果Shpe.TextFrame.HasText那么
'将pptText设置为框中的文本,然后将其设为小写并修剪Spaces和Enters
pptText = Shpe.TextFrame.TextRange
pptText = LCase(替换(pptText,"",vbNullString))
pptText =替换(替换(替换(pptText,vbCrLf,vbNullString),vbCr,vbNullString),vbLf,vbNullString)
'确定文本中是否有" iq _"
如果是InStr(1,pptText," iq _")> 0然后
'将iq_Array设置为拆分iq的数组
iq_Array = Split(pptText,",")
'查找数组的大小
size = UBound(iq_Array) - LBound(iq_Array)
'循环播放数组中的每个iq_'
对于arrayLoop = 0 To size
'声明将采用iq _'形式" iq_9"或" iq_99"或" iq_999"
如果iq_Array(arrayLoop)喜欢" iq _#"或者iq_Array(arrayLoop)喜欢" iq _ ##"或者iq_Array(arrayLoop)喜欢" iq _ ###"然后
'循环用于检查每列
对于i = 1 to colNumb
'为需要它的每张幻灯片复制第一列(角色列)
如果i = 1且arrayLoop = 0那么
'复制专栏
xlWB.Worksheets("工作表Sheet&#34)。列(1).Copy
'粘贴新创建的Sheet2中的列
xlWB.Worksheets(" Sheet2")。粘贴目标:= xlWB.Worksheets(" Sheet2")。列(1)
'如果这不是角色列,那么检查iq _的匹配是否从ppt到xl
ElseIf xlWB.Worksheets(" Sheet1")。Cells(1,i)= iq_Array(arrayLoop)和i<> 1然后
'用于粘贴Sheet2的下一列,以便最终得到一个表格
k = k + 1
'与上述相同
xlWB.Worksheets("工作表Sheet&#34)。柱(ⅰ).Copy
xlWB.Worksheets(" Sheet2")。粘贴目标:= xlWB.Worksheets(" Sheet2")。列(k)
'转到下一个数组
GoTo Line2
万一
下一个我
'与上面相同,只有这个是iq _' s形式" iq_45,46,47"而不是" iq_45,iq_46,iq_47"
ElseIf(iq_Array(0)赞" iq _#"或iq_Array(0)赞" iq _ ##"或iq_Array(0)喜欢" iq _ ###&# 34;)和(IsNumeric(iq_Array(arrayLoop))和Len(iq_Array(arrayLoop))< = 3)然后
对于i = 1 to colNumb
如果i = 1且arrayLoop = 0那么
xlWB.Worksheets("工作表Sheet&#34)。列(1).Copy
xlWB.Worksheets(" Sheet2")。粘贴目标:= xlWB.Worksheets(" Sheet2")。列(1)
ElseIf xlWB.Worksheets(" Sheet1")。Cells(1,i)=(" iq _"& iq_Array(arrayLoop))和i<> 1然后'如果iq in ppt = iq in xl,如果不是第一个单元格则执行
k = k + 1
xlWB.Worksheets("工作表Sheet&#34)。柱(ⅰ).Copy
xlWB.Worksheets(" Sheet2")。粘贴目标:= xlWB.Worksheets(" Sheet2")。列(k)
GoTo Line2
万一
下一个我
万一
线路2:
下一个arrayLoop
万一
万一
万一
下一个Shpe
'计算sheet2上的最后一行和最后一列。又名。找表大小
使用xlWB.Worksheets(" Sheet2")
lRows = .Cells(.Rows.Count,1).End(xlUp).Row
lCols = .Cells(1,.Columns.Count).End(xlToLeft).Column
'如果只有一列,则转到下一张幻灯片
如果lRows = .Cells(1,1).End(xlUp).Row和lCols = .Cells(1,1).End(xlToLeft).Column Then
GoTo Line1
万一
'复制表
.Range(.Cells(1,1),. Cell(lRows,lCols))。复制
结束
'将表粘贴到ppt中
pptSlide.Shapes.PasteSpecial DataType:= ppPasteHTML,Link:= msoFalse
'最近粘贴的形状是幻灯片上的最后一个形状,因此它与幻灯片上的形状数相同
设置myShape = pptSlide.Shapes(pptSlide.Shapes.Count)
'设定位置:
myShape.Left = -200
myShape.Top = 200
' Clear Sheet2用于下一张幻灯片
xlWB.Worksheets(" Sheet2的")范围(" A1:P10&#34)。清除。
线路1:
下一个pptSlide
xlWB.Worksheets(" Sheet2的&#34)。删除
xlWB.Close
xlApp.Quit
xlApp.DisplayAlerts = True
'结束计时器
SecondsElapsed = Round(Timer - StartTime,2)
MsgBox"此代码在"中成功运行&安培; SecondsElapsed& "秒",vbInformation
结束子