混跡職場多年剃执,你一定和國內(nèi)頂級的咨詢公司打過交道忌穿。你是否曾經(jīng)驚嘆:他們究竟是如何做到在短時間內(nèi)完成海量的交付件伶椿,并且PPT里面的文字和圖表對得整整齊齊咽扇,甚至于一個像素都不差闺阱,在翻頁的時候盛正,除了局部的內(nèi)容不一樣隧熙,你竟然感覺不到其他部分有任何變化灶似。
曾己何時荠卷,我也有此感嘆模庐。直到后來,我知道了有PPT編程這件事油宜。原來這一切都是提前準(zhǔn)備好素材掂碱,寫好VBA程序怜姿,點(diǎn)擊按鈕便可完成。無論是效率還是質(zhì)量疼燥,都比人工復(fù)制粘貼好得多社牲。閑言少敘,先上效果圖:
那么悴了,如此省時省力的一鍵自動生成PPT報(bào)告究竟是如何實(shí)現(xiàn)的呢搏恤?
通常來講,VBA編程實(shí)現(xiàn)如上效果有兩種途徑:
其一湃交,代碼寫在PPT中熟空;
其二,代碼寫在Excel中搞莺;
我個人比較喜歡第二種方式息罗,本文介紹了如何在Excel中編寫VBA代碼,實(shí)現(xiàn)一鍵自動生成PPT報(bào)告的酷炫效果才沧。
01—按報(bào)告內(nèi)容準(zhǔn)備對應(yīng)Excel文件
1.以本例為例:我分別準(zhǔn)備了五張工作表作為PPT中素材的來源迈喉;
2.設(shè)置好格式,調(diào)整好高度温圆,寬度挨摸,字體,居中岁歉,顏色等得运,避免后期再用VBA代碼進(jìn)行設(shè)置;
3.數(shù)據(jù)要有明確的按需篩選的字段锅移,便于VBA自動篩選熔掺,然后將篩選結(jié)果粘貼進(jìn)PPT中指定位置;
4.PPT中粘貼的圖片非剃,來自于“各省矢量圖”這張工作表置逻,這里面有個難點(diǎn)。
我們之前在Excel VS Tableau省市交叉銷售地圖一文中曾經(jīng)講過定義名稱動態(tài)引用圖片的知識备绽。不過券坞,當(dāng)時用到的是一維的,比較簡單疯坤。本例中用到的是二維的圖片存儲區(qū)域报慕,稍微復(fù)雜些。
4.1:定義名稱轄區(qū)地圖=INDEX(各省矢量圖!$B$2:$C$5,MATCH(待分析列表!$P$2,各省矢量圖!$A$1:$A$5,0),MATCH(待分析列表!$S$2,各省矢量圖!$B$1:$C$1,0))压怠,這里INDEX嵌套了MATCH函數(shù)眠冈;
4.2:“各省矢量圖”中設(shè)置A列為輔助列,A1=待分析列表!$S$2,A2=IFERROR(HLOOKUP($A$1,$B$1:$C$5,ROW(A2),0),"")蜗顽,即將A1值設(shè)置為當(dāng)前省份布卡,A2及以下通過Hlookup函數(shù),將該省份對應(yīng)的數(shù)據(jù)查詢出來雇盖,用于定義名稱時計(jì)算MATCH(待分析列表!$P$2,各省矢量圖!$A$1:$A$5,0)忿等,即Index查詢區(qū)域的行值;MATCH(待分析列表!$S$2,各省矢量圖!$B$1:$C$1,0))用于返回Index查詢區(qū)域的列值崔挖。
關(guān)于這個二維表中通過定義名稱動態(tài)引用圖片的方法贸街,用到了輔助列思維,很經(jīng)典狸相,需要仔細(xì)體味和掌握薛匪。
02—準(zhǔn)備所需的PPT模板
這里我準(zhǔn)備好了如下模板,
注意:
1)需要在一個PPT中放兩張完全一樣的空白模板脓鹃,便于后續(xù)使用以此為基礎(chǔ)反復(fù)進(jìn)行Duplicate操作逸尖,直至所有的頁面都已自動生成為止。然后瘸右,刪除冗余的首尾模板頁即可娇跟。
2)本例中的PPT內(nèi)容小標(biāo)題,有一些是固定的并且每頁都相同的太颤。這樣的話就只需將其固化到PPT模板中苞俘,調(diào)整好格式和位置即可,避免反復(fù)用VBA代碼粘貼栋齿,提高代碼運(yùn)行效率苗胀。
03—VBA設(shè)置引用
按住ALT+F11,進(jìn)入VBE編輯環(huán)境瓦堵,點(diǎn)擊菜單欄中的引用,添加Microsoft Powerpoint 14.0 Object Library引用歌亲。這一步必不可少菇用,這是VBA能夠創(chuàng)建PPT的關(guān)鍵所在。
否則會報(bào)錯陷揪,無法定義activeSlide變量惋鸥,即以下代碼會運(yùn)行錯誤,
"Dim activeSlide as PowerPoint.Slide"會彈出編譯錯誤的對話框悍缠。
04—構(gòu)建待分析列表
接下來卦绣,我們根據(jù)PPT內(nèi)每頁要呈現(xiàn)的內(nèi)容,制作待分析列表飞蚓,本例中主要字段為K至M列滤港,這里通過VBA代碼的for循環(huán)語句,將各行值粘貼到P1:P2及S2位置趴拧,用于生成標(biāo)題及確定省份溅漾。
05—編寫VBA代碼
5.1定義相關(guān)變量及對象
5.2設(shè)置For循環(huán)語句山叮,復(fù)制模板為新頁,設(shè)置當(dāng)前活動PPT頁為倒數(shù)第二頁添履;
此外切記設(shè)置容錯處理語句On error resume next屁倔!因?yàn)楸纠兴玫腃opypicture方法,會發(fā)生隨機(jī)性的不可避免的錯誤暮胧。但實(shí)際上锐借,發(fā)生這個錯誤時VBA所有的語句都已經(jīng)正式執(zhí)行過,這個錯誤純粹就是來搗亂的往衷,可能是微軟Office的bug吧瞎饲。網(wǎng)上關(guān)于這個錯誤有很多解決方法,但我親測無效炼绘!
其實(shí)解決起來非常簡單嗅战,只需一句容錯處理語句On error resume next便可!
5.3完成PPT每頁內(nèi)容的粘貼俺亮,本例中先通過自動篩選驮捍,然后將篩選結(jié)果粘貼到指定位置。
5.4刪除冗余的頭部和尾部幻燈片脚曾,只保留有效的內(nèi)容頁东且。清除對象變量activeSlide和newPowerPoint
注:這個方法有點(diǎn)笨,暫時沒想到更好的方法本讥。
注:
1)Range("XXX").CopyPicture方法廣泛地應(yīng)用于本例中珊泳,將相應(yīng)信息粘貼到PPT。這意味著將以圖片形式粘貼而無法在PPT中再編輯拷沸。
但這里標(biāo)題其實(shí)是可以做成可編的色查,方法是在PPT模板中,插入一個文本框撞芍,將其用ALT+F10鍵將其命名為"Title",然后通過以下VBA代碼為該文本框賦值秧了。activeSlide.Shapes("Title").TextFrame.TextRange.Text= Worksheets("待分析列表").Range("P4")。這樣生成的PPT報(bào)告中序无,標(biāo)題則不再是圖片验毡,而是可編輯的文本框。
此外帝嗡,本例中沒有提到Chart的粘貼晶通。其實(shí)Chart也是可以粘貼成可編輯模式的,只是其粘貼成鏈接格式后哟玷,需要通過For循環(huán)生成多個Chart并且分別為每個Chart準(zhǔn)備數(shù)據(jù)源狮辽,在用以下代碼調(diào)用及粘貼時,也需在For循環(huán)中不斷修改"chart"名字,使之調(diào)用正確的圖表完成粘貼進(jìn)PPT的動作隘竭。ActiveSheet.ChartObjects("chart").ChartArea.Copy
activeSlide.Shapes.PasteSpecial(Link = True)
以上的方法過于復(fù)雜塘秦,這里不展開討論。關(guān)于Chart加入PPT報(bào)告的最簡單方法动看,是將Chart所在區(qū)域用同樣的Copypicture方法粘貼到PPT中尊剔,這樣的代碼最簡潔有效。
2)這里還用到了Range("轄區(qū)地圖").Copypicture方法菱皆,這個發(fā)現(xiàn)讓我感到欣喜须误。"轄區(qū)地圖"是之前定義的名稱:
轄區(qū)地圖=INDEX(各省矢量圖!$B$2:$C$5,MATCH(待分析列表!$P$2,各省矢量圖!$A$1:$A$5,0),MATCH(待分析列表!$S$2,各省矢量圖!$B$1:$C$1,0))
本例中,Copypicture方法用到了定義的名稱中仇轻,繼而使動態(tài)查詢引用二維表中的圖片京痢,并將其粘貼進(jìn)PPT中成為可能。
3)本例中的需求比較特殊:
需要用指定的模板篷店,不能再使用newPowerPoint.Presentations.Add來創(chuàng)建一個創(chuàng)建默認(rèn)PPT模板祭椰,而是需打開指定的PPT模板文件;
因需要創(chuàng)建的頁數(shù)不固定疲陕,需要按需進(jìn)行PPT模板頁的復(fù)制(Duplicate)方淤,直到For循環(huán)結(jié)束為止。
需要按指定字段和條件篩選蹄殃,然后將篩選結(jié)果的列表粘貼進(jìn)PPT中携茂;
06—錯誤檢查及格式調(diào)整
運(yùn)行代碼,檢查是否有異常和錯誤诅岩,對于頁面布局不滿意的地方讳苦,需在Excel源文件中對相應(yīng)工作表的格式進(jìn)行調(diào)整;對于粘貼位置吩谦,需在VBA代碼中通過以下語句進(jìn)行調(diào)整:
newPowerPoint.ActiveWindow.Selection.ShapeRange.Left = 5
newPowerPoint.ActiveWindow.Selection.ShapeRange.Top = 60
這個環(huán)節(jié)必不可少鸳谜!檢查無誤后,點(diǎn)擊宏按鈕逮京,完成PPT報(bào)告的制作卿堂。不足之處是,本程序只生成了報(bào)告的主體部分懒棉,對于封面和結(jié)尾頁還是需要手動添加。不管怎樣览绿,總數(shù)躲過無數(shù)的坑策严,得到了想要的結(jié)果。
至此饿敲,大功告成妻导。
如果有朋友想要Excel源文件,可關(guān)注本文作者個人微信公眾號,發(fā)送關(guān)鍵詞“打包下載”倔韭。
這是我的第二篇原創(chuàng)文章术浪,如果閣下覺得還有一點(diǎn)點(diǎn)收獲,請不要吝嗇給我“好看”哦寿酌!那將是我繼續(xù)發(fā)布原創(chuàng)作品的最大鼓勵胰苏。