国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Office VBA 入門 | Microsoft Learn

Office VBA 入門

  • 文章

你是否面臨著重復(fù)清理 Word 中五十個(gè)表格的工作? 你是否希望有一個(gè)特殊的文檔能夠在打開時(shí)提示用戶進(jìn)行輸入? 你是否感覺(jué)難以弄明白如何將 Microsoft Outlook 中獲取的聯(lián)系人有效地導(dǎo)入 Microsoft Excel 電子表格?

可以使用 Visual Basic for Applications (VBA) for Office 來(lái)執(zhí)行這些任務(wù)并完成更多任務(wù),這是一種簡(jiǎn)單但功能強(qiáng)大的編程語(yǔ)言,可用于擴(kuò)展 Office 應(yīng)用程序。

本文適用于希望了解 VBA 和希望深入了解編程如何幫助他們自定義 Office 的有經(jīng)驗(yàn)的 Office 用戶。

Office 應(yīng)用程序套件具有一組豐富的功能。 可通過(guò)多種不同的方法對(duì)文檔、電子郵件、數(shù)據(jù)庫(kù)、表單、電子表格和演示文稿進(jìn)行創(chuàng)作、格式設(shè)置和操縱。 Office VBA 編程的杰出之處在于,你可以使用鼠標(biāo)、鍵盤或?qū)υ捒驁?zhí)行的幾乎每一個(gè)操作也都可以使用 VBA 完成。 此外,若某個(gè)操作可以使用 VBA 執(zhí)行一次,則可以同樣輕松地執(zhí)行該操作一百次。 (實(shí)際上,自動(dòng)執(zhí)行重復(fù)任務(wù)是 Office VBA 最常見的用途之一。)

除了可通過(guò)編寫 VBA 腳本來(lái)加速執(zhí)行日常任務(wù)外,還可以使用 VBA 為 Office 應(yīng)用程序添加新功能,或以特定于業(yè)務(wù)需要的方式來(lái)提示文檔用戶并與之交互。 例如,可以編寫一些 VBA 代碼,使其在用戶首次嘗試保存文檔時(shí)顯示一個(gè)彈出消息,提醒用戶將文檔保存到特定網(wǎng)絡(luò)驅(qū)動(dòng)器上。

本文探討了一些利用 VBA 編程強(qiáng)大功能的主要原因。 它探討了 VBA 語(yǔ)言和可用于處理你的解決方案的開箱即用工具。 最后,它包括一些提示和方法以避免一些常見編程錯(cuò)誤。

備注

有興趣開發(fā)跨多個(gè)平臺(tái)擴(kuò)展 Office 體驗(yàn)的解決方案嗎? 查看新的 Office 外接程序模型。 與VSTO外接程序和解決方案相比,Office外接程序占用的空間較小,您可以使用幾乎任何Web編程技術(shù)(例如HTML5,JavaScript,CSS3和XML)來(lái)構(gòu)建它們。

何時(shí)使用 VBA 及使用原因

考慮使用 Office 中的 VBA 編程功能有若干主要原因。

自動(dòng)化和重復(fù)

當(dāng)應(yīng)用到用于設(shè)置格式或糾正問(wèn)題的重復(fù)性解決方案時(shí),VBA 非常高效。 舉例來(lái)說(shuō),你是否曾經(jīng)在 Word 中更改過(guò)每一頁(yè)頂部的段落樣式? 你是否曾經(jīng)不得不對(duì)從 Excel 粘貼到 Word 文檔或 Outlook 電子郵件中的多個(gè)表格重新設(shè)置格式? 你是否曾經(jīng)必須對(duì)多個(gè) Outlook 聯(lián)系人進(jìn)行相同的更改?

如果你有必須進(jìn)行十多二十次的更改,則可能值得使用 VBA 來(lái)自動(dòng)進(jìn)行該更改。 如果是必須進(jìn)行數(shù)百次的更改,那么當(dāng)然值得考慮。 你可手動(dòng)完成的幾乎任何格式設(shè)置或編輯更改都可用 VBA 完成。

用戶交互的擴(kuò)展

有時(shí),你希望鼓勵(lì)或強(qiáng)迫用戶以不屬于標(biāo)準(zhǔn)應(yīng)用程序的特定方式與 Office 應(yīng)用程序或文檔進(jìn)行交互。 例如,你可能希望在用戶打開、保存或打印文檔時(shí),提示他們執(zhí)行一些特定操作。

Office 應(yīng)用程序之間的交互

你是否需要將所有聯(lián)系人從 Outlook 復(fù)制到 Word,然后以特定方式其進(jìn)行格式設(shè)置? 或者,你是否需要將數(shù)據(jù)從 Excel 移到一組 PowerPoint 幻燈片? 有時(shí),簡(jiǎn)單的復(fù)制和粘貼不能達(dá)到你的目的,或者速度太慢。 使用 VBA 編程同時(shí)與兩個(gè)或更多 Office 應(yīng)用程序的詳細(xì)信息交互,然后根據(jù)一個(gè)應(yīng)用程序中的內(nèi)容修改另一個(gè)應(yīng)用程序中的內(nèi)容。

換另一種方式執(zhí)行任務(wù)

VBA 編程是一種功能強(qiáng)大的解決方案,但并不總是最佳方法。 有時(shí),有必要使用其他方式來(lái)實(shí)現(xiàn)你的目標(biāo)。

關(guān)鍵問(wèn)題是,是否有更簡(jiǎn)單的方法。 開始 VBA 工程之前,請(qǐng)考慮內(nèi)置的工具和標(biāo)準(zhǔn)功能。 舉例來(lái)說(shuō),如果你有非常耗時(shí)的編輯或布局任務(wù),請(qǐng)考慮使用樣式或加速鍵來(lái)解決問(wèn)題。 你是否能執(zhí)行一次任務(wù),然后使用 CTRL+Y(重做)來(lái)重復(fù)操作? 你是否能使用正確的格式或模板創(chuàng)建新文檔,然后將內(nèi)容復(fù)制到該新文檔中?

Office 應(yīng)用程序功能強(qiáng)大;你需要的解決方案可能已經(jīng)存在。 在開始編程之前,請(qǐng)花一些時(shí)間來(lái)詳細(xì)了解 Office。

在開始 VBA 工程之前,請(qǐng)確保你有時(shí)間來(lái)使用 VBA。 編程需要專注,并且不可預(yù)測(cè)。 特別是作為初學(xué)者,除非你有時(shí)間來(lái)仔細(xì)認(rèn)真地工作,否則絕不要轉(zhuǎn)向編程。 如果迫在眉睫的最后期限可能會(huì)造成非常緊張的情況,請(qǐng)嘗試編寫“快速腳本”來(lái)解決問(wèn)題。 如果你的時(shí)間很緊,則可能需要使用傳統(tǒng)方法,即使這些方法單調(diào)又重復(fù)。

VBA 編程 101

通過(guò)代碼使應(yīng)用程序執(zhí)行操作

你可能認(rèn)為編寫代碼既神秘又困難,但是基本原則使用日常推理且完全可以訪問(wèn)。 Microsoft Office 應(yīng)用程序以這樣的方式創(chuàng)建:它們公開能夠接收指令的事物(稱為對(duì)象),這與將電話設(shè)計(jì)為包含按鍵以用于和電話交互的方式相同。 按下按鍵時(shí),電話會(huì)識(shí)別指令,并按照撥號(hào)順序包含對(duì)應(yīng)的號(hào)碼。 在編程時(shí),你通過(guò)向應(yīng)用程序中的各種對(duì)象發(fā)送指令與應(yīng)用程序進(jìn)行交互。 這些對(duì)象是可擴(kuò)展的,但各有各的限制。 這些對(duì)象只能執(zhí)行為其設(shè)計(jì)的操作,并且只能按照你的指令執(zhí)行操作。

例如,假設(shè)用戶在 Word 中打開一個(gè)文檔,進(jìn)行一些更改,保存文檔,然后將其關(guān)閉。 在 VBA 編程領(lǐng)域,Word 會(huì)公開 Document 對(duì)象。 通過(guò)使用 VBA 代碼,你可以指示 Document 對(duì)象執(zhí)行諸如打開、保存或關(guān)閉等操作。

下面一節(jié)討論如何組織和描述對(duì)象。

對(duì)象模型

開發(fā)人員在層次結(jié)構(gòu)中組織編程對(duì)象,該層次結(jié)構(gòu)被稱為應(yīng)用程序的對(duì)象模型。 例如,Word 具有包含 Document 對(duì)象的頂級(jí)應(yīng)用程序?qū)ο蟆?Document 對(duì)象包含 Paragraph 對(duì)象等。 對(duì)象模型大致反映你在用戶界面中看到的內(nèi)容。 它們是應(yīng)用程序及其功能的概念圖。

對(duì)象的定義被稱為類,因此,你可能看到這兩個(gè)術(shù)語(yǔ)互換使用。 從技術(shù)上來(lái)講,類是用于創(chuàng)建或?qū)嵗瘜?duì)象的說(shuō)明或模板。

對(duì)象一旦存在,你就可以通過(guò)設(shè)置其屬性和調(diào)用其方法來(lái)進(jìn)行操控。 如果將對(duì)象視為一個(gè)名詞,則屬性是描述該名詞的形容詞,而方法是使該名詞活動(dòng)起來(lái)的動(dòng)詞。 更改某個(gè)屬性將更改對(duì)象外觀或行為的某些品質(zhì)。 調(diào)用任一對(duì)象方法將導(dǎo)致對(duì)象執(zhí)行某些操作。

本文中的 VBA 代碼針對(duì)打開的 Office 應(yīng)用程序運(yùn)行,在該應(yīng)用程序中,代碼操控的許多對(duì)象已經(jīng)打開并正在運(yùn)行;例如,Application 本身、Excel 中的 Worksheet、Word 中的 Document、PowerPoint 中的 Presentation、Outlook 中的 Explorer 和 Folder 對(duì)象。 在了解對(duì)象模型的基本布局以及 Application 的一些關(guān)鍵屬性(允許您訪問(wèn)當(dāng)前狀態(tài))后,便可以開始使用 Office VBA 擴(kuò)展和操控 Office 應(yīng)用程序了。

方法

例如,在 Word 中,你可以通過(guò)使用 Application 對(duì)象的 ActiveDocument 屬性更改屬性,并調(diào)用當(dāng)前 Word 文檔的方法。 此 ActiveDocument 屬性將返回對(duì)當(dāng)前在 Word 應(yīng)用程序中處于活動(dòng)狀態(tài)的 Document 對(duì)象的引用。 “返回引用”意思是“可以訪問(wèn)?!?/p>

下面的代碼完全按照它所表達(dá)的含義運(yùn)行;即,保存應(yīng)用程序中的活動(dòng)文檔。

VB
Application.ActiveDocument.Save

從左到右閱讀代碼,“在此應(yīng)用程序中,使用 ActiveDocument 引用的文檔調(diào)用 Save 方法。請(qǐng)注意, Save 是最簡(jiǎn)單的方法形式;它不需要你提供任何詳細(xì)說(shuō)明。 你指示 Document 對(duì)象執(zhí)行 Save 指令,它不需要你輸入更多的信息。

如果某個(gè)方法需要更多信息,則這些詳細(xì)信息被稱為參數(shù)。 下面的代碼運(yùn)行 SaveAs 方法,該方法需要文件的新名稱。

VB
Application.ActiveDocument.SaveAs ("New Document Name.docx")

方法名稱后的括號(hào)中列出的值是參數(shù)。 此處,文件的新名稱是 SaveAs 方法的參數(shù)。

屬性

可以使用相同的語(yǔ)法來(lái)設(shè)置用于讀取屬性的屬性。 下面的代碼執(zhí)行一種方法以選擇 Excel 中的單元格 A1,然后設(shè)置屬性以在該單元格中放置內(nèi)容。

VB
    Application.ActiveSheet.Range("A1").Select
    Application.Selection.Value = "Hello World"

VBA 編程的第一個(gè)挑戰(zhàn)是了解每個(gè) Office 應(yīng)用程序的對(duì)象模型以及閱讀對(duì)象、方法和屬性語(yǔ)法。 對(duì)象模型在所有 Office 應(yīng)用程序中都類似,但每個(gè)對(duì)象模型都特定于它所操控的文檔和對(duì)象的種類。

代碼段的第一行中有 Application 對(duì)象(這次是 Excel),然后是 ActiveSheet,它提供對(duì)活動(dòng)工作表的訪問(wèn)。 之后是一個(gè)不太熟悉的術(shù)語(yǔ) Range,這意味著“以這種方式定義單元格區(qū)域”。代碼指示 Range 創(chuàng)建自身,僅使用 A1 作為其定義的單元格集。 也就是說(shuō),代碼的第一行定義對(duì)象“Range”,并對(duì)其運(yùn)行方法以選擇它。 結(jié)果會(huì)自動(dòng)存儲(chǔ)在名為 SelectionApplication 的另一個(gè)屬性中。

代碼的第二行將 SelectionValue 屬性設(shè)置為文本“Hello World”,并且該值出現(xiàn)在單元格 A1 中。

你編寫的最簡(jiǎn)單的 VBA 代碼可能只是獲取對(duì) Office 應(yīng)用程序中你要處理的對(duì)象的訪問(wèn)權(quán)限并設(shè)置屬性。 例如,你可以在 VBA 腳本中獲取對(duì) Word 中表中各行的訪問(wèn)權(quán)限并更改其格式。

這聽起來(lái)簡(jiǎn)單,但可能非常有用;一旦編寫了代碼,你就可以利用編程的所有強(qiáng)大功能在多個(gè)表或文檔中進(jìn)行相同更改,或者依據(jù)某種邏輯或條件來(lái)進(jìn)行更改。 對(duì)于計(jì)算機(jī)而言,進(jìn)行 1000 項(xiàng)更改與進(jìn)行 10 項(xiàng)更改并無(wú)不同,因此這里對(duì)于較大的文檔和問(wèn)題而言就有了規(guī)模效應(yīng),而這正是 VBA 能夠真正出彩和節(jié)省時(shí)間的原因。

宏和 Visual Basic 編輯器

既然對(duì) Office 應(yīng)用程序公開其對(duì)象模型的方式有了一定了解,你可能會(huì)渴望嘗試調(diào)用對(duì)象方法、設(shè)置對(duì)象屬性,以及響應(yīng)對(duì)象事件。 為此,你必須在 Office 可以理解的位置以 Office 可以理解的方式編寫代碼;通常使用 Visual Basic 編輯器進(jìn)行。 盡管默認(rèn)情況下已安裝該編輯器,但在功能區(qū)上將其啟用之前,許多用戶都不知道有該編輯器。

所有 Office 應(yīng)用程序都使用該功能區(qū)。 功能區(qū)上的一個(gè)選項(xiàng)卡是“開發(fā)工具”選項(xiàng)卡,在此可以訪問(wèn) Visual Basic 編輯器和其他開發(fā)人員工具。 由于 Office 在默認(rèn)情況下并不顯示“開發(fā)工具”選項(xiàng)卡,因此你必須使用以下過(guò)程啟用它:

啟用“開發(fā)工具”選項(xiàng)卡

  1. “文件”選項(xiàng)卡上,選擇“選項(xiàng)”以打開“選項(xiàng)”對(duì)話框。

  2. 選擇該對(duì)話框左側(cè)的“自定義功能區(qū)”。

  3. 在該對(duì)話框左側(cè)的“從下列位置選擇命令”下,選擇“常用命令”。

  4. 在該對(duì)話框右側(cè)的“自定義功能區(qū)”下,從下拉列表框中選擇“主選項(xiàng)卡”,然后選中“開發(fā)工具”復(fù)選框。

  5. 選擇“確定”。

備注

在 Office 2007 中,顯示“開發(fā)工具”選項(xiàng)卡的方法是選擇 Office 按鈕,選擇“選項(xiàng)”,然后在“選項(xiàng)”對(duì)話框的“常用”類別中選中“在功能區(qū)顯示'開發(fā)工具’選項(xiàng)卡”復(fù)選框。

啟用“開發(fā)工具”選項(xiàng)卡后,可以輕松找到“Visual Basic”“宏”按鈕。

圖 1. “開發(fā)工具”選項(xiàng)卡上的按鈕

安全問(wèn)題

為了保護(hù) Office 用戶免受病毒和危險(xiǎn)宏代碼的影響,你無(wú)法在使用標(biāo)準(zhǔn)文件擴(kuò)展名的標(biāo)準(zhǔn) Office 文檔中保存宏代碼, 而是必須將代碼保存在帶有特殊擴(kuò)展名的文件中。 例如,你無(wú)法將宏保存在帶有 .docx 擴(kuò)展名的標(biāo)準(zhǔn) Word 文檔中;而是必須使用帶有 .docm 擴(kuò)展名的特殊 Word 啟用宏的文檔。

打開 .docm 文件時(shí),Office 安全功能可能仍會(huì)在通知或不通知你的情況下阻止文檔中的宏運(yùn)行。 在所有 Office 應(yīng)用程序的信任中心中檢查設(shè)置和選項(xiàng)。 默認(rèn)設(shè)置禁止宏運(yùn)行,但會(huì)提示你宏已禁用,并為你提供用于為該文檔重新啟用宏的選項(xiàng)。

通過(guò)創(chuàng)建可信位置、受信任的文檔或受信任的發(fā)布者,可以指定運(yùn)行宏的特定文件夾。 最便攜的選項(xiàng)是使用受信任的發(fā)布者,它使用分發(fā)的數(shù)字簽名文檔。 有關(guān)特定 Office 應(yīng)用程序中的安全設(shè)置的詳細(xì)信息,請(qǐng)打開“選項(xiàng)”對(duì)話框,然后依次選擇“信任中心”“信任中心設(shè)置”

備注

某些 Office 應(yīng)用程序(如 Outlook)默認(rèn)情況下會(huì)將宏保存在你本地計(jì)算機(jī)上的主模板中。 雖然在運(yùn)行自己的宏時(shí),該策略會(huì)減少自己的計(jì)算機(jī)上的本地安全問(wèn)題,但如果你要分發(fā)自己的宏,則需要部署策略。

錄制宏

選擇“開發(fā)工具”選項(xiàng)卡上的“宏”按鈕時(shí),會(huì)打開“宏”對(duì)話框,該對(duì)話框允許訪問(wèn)可從特定文檔或應(yīng)用程序訪問(wèn)的 VBA 子例程或宏。 “Visual Basic”按鈕可打開 Visual Basic 編輯器,可使用該編輯器創(chuàng)建和編輯 VBA 代碼。

Word 和 Excel 中的“開發(fā)工具”選項(xiàng)卡上的另一個(gè)按鈕是“錄制宏”按鈕,該按鈕自動(dòng)生成 VBA 代碼,能夠再現(xiàn)你在應(yīng)用程序中執(zhí)行的操作。 “錄制宏”是可以用于詳細(xì)了解 VBA 的理想工具。 閱讀生成的代碼可以讓你深入了解 VBA,并在你作為用戶需要了解的 Office 知識(shí)和作為程序員需要了解的 Office 知識(shí)之間架起一座穩(wěn)定的橋梁。 唯一需要說(shuō)明的一點(diǎn)是,生成的代碼可能令人困惑,因?yàn)楹昃庉嬈鞅仨殞?duì)你的意圖進(jìn)行一些假設(shè),而這些假設(shè)不一定準(zhǔn)確。

錄制宏

  1. 將 Excel 打開為新的工作簿,并選擇功能區(qū)中的“開發(fā)工具”選項(xiàng)卡。 選擇“錄制宏”并接受“錄制宏”對(duì)話框中的所有默認(rèn)設(shè)置,將“Macro1”作為宏名稱,將“此工作簿”作為位置。

  2. 選擇“確定”開始錄制宏。 請(qǐng)注意按鈕文本是如何變?yōu)?strong>“停止錄制”的。 完成想要錄制的操作后即選擇該按鈕。

  3. 選擇單元格 B1 并鍵入程序員經(jīng)典的第一個(gè)字符串:Hello World。 停止鍵入并查看“停止錄制”按鈕;它將灰顯,因?yàn)?Excel 正在等待你完成在該單元格中鍵入值的操作。

  4. 選擇單元格 B2 以完成單元格 B1 中的操作,然后選擇“停止錄制”

  5. “開發(fā)工具”選項(xiàng)卡上選擇“宏”,選擇“Macro1”(如果未選擇),然后選擇“編輯”以在 Visual Basic 編輯器中查看 Macro1 的代碼。

圖 2. Visual Basic Editor 中的宏代碼

查看代碼

你創(chuàng)建的宏看起來(lái)應(yīng)類似于如下代碼。

VB
Sub Macro1()
'
' Macro1 Macro
'
'
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "Hello World"
    Range("B2").Select
End Sub

請(qǐng)注意與前面在單元格 A1 中選擇文本的代碼段的相似之處,以及不同之處。 在此代碼中,選擇了單元格 B1,然后將字符串“Hello World”應(yīng)用到了已激活的單元格。 文本兩邊的引號(hào)指定與數(shù)字值對(duì)照的字符串值。

是否記得如何選擇單元格 B2 以再次顯示“停止錄制”按鈕? 該操作也顯示為一行代碼。 宏錄制器記錄每次擊鍵。

以撇號(hào)開頭并由編輯器標(biāo)為綠色的代碼行是說(shuō)明代碼或提醒你和其他程序員代碼用途的注釋。 VBA 忽略以單引號(hào)開頭的任何行或行的一部分。 在代碼中編寫清除的相應(yīng)注釋非常重要,但該討論是不在本文范圍內(nèi)。 本文后面對(duì)此代碼的引用不包括這四個(gè)注釋行。

在宏錄制器生成代碼時(shí),它使用復(fù)雜的算法確定預(yù)期的方法和屬性。 如果未能識(shí)別給定的屬性,有許多可用的資源能夠提供幫助。 例如,在已錄制宏中,宏錄制器生成了引用 FormulaR1C1 屬性的代碼。 不清楚上述內(nèi)容的含義?

備注

請(qǐng)注意,Application 對(duì)象隱含在所有 VBA 宏中。 記錄的代碼適用于 Application。 每行的開頭。

使用開發(fā)工具幫助

選擇已錄制宏中的“FormulaR1C1”,并按 F1。 幫助系統(tǒng)運(yùn)行快速搜索,確定相應(yīng)的主題位于 Excel 幫助的“Excel 開發(fā)工具”部分,并列出 FormulaR1C1 屬性。 可以選擇該鏈接了解有關(guān)該屬性的詳細(xì)信息,但在執(zhí)行該操作前,請(qǐng)注意窗口底部附近的 Excel 對(duì)象模型參考鏈接。 選擇該鏈接可查看 Excel 在其對(duì)象模型中用于描述工作表及其組件所使用的對(duì)象的長(zhǎng)列表。

選擇以上任一選項(xiàng)以查看適用于該特定對(duì)象的屬性和方法,以及對(duì)于不同相關(guān)選項(xiàng)的交叉引用。 許多幫助項(xiàng)也有簡(jiǎn)短的代碼示例,可以為你提供幫助。 例如,可以點(diǎn)擊 Borders 對(duì)象中的鏈接,以查看如何在 VBA 中設(shè)置邊框。

VB
Worksheets(1).Range("A1").Borders.LineStyle = xlDouble

編輯代碼

邊框代碼看起來(lái)與錄制的宏不同。 對(duì)象模型令人迷惑的一點(diǎn)是可使用多種方法處理任何給定對(duì)象(在本例中為單元格 A1)。

有時(shí),學(xué)習(xí)編程的最好方法是對(duì)某些運(yùn)行代碼進(jìn)行微小更改,然后查看結(jié)果。 立即嘗試。 在 Visual Basic 編輯器中打開 Macro1,并將代碼更改為以下內(nèi)容。

VB
Sub Macro1()
    Worksheets(1).Range("A1").Value = "Wow!"
    Worksheets(1).Range("A1").Borders.LineStyle = xlDouble
End Sub

提示

在處理代碼時(shí)盡可能地使用復(fù)制和粘貼操作,以避免鍵入錯(cuò)誤。

無(wú)需保存代碼即可試用,因此請(qǐng)返回到 Excel 文檔,選擇 開發(fā)人員 選項(xiàng)卡上的 ,選擇 宏 1,然后選擇 運(yùn)行。 單元格 A1 現(xiàn)在包含文本 Wow! 且其四周有雙線邊框。

圖 3. 第一個(gè)宏的運(yùn)行結(jié)果

剛才錄制了宏,閱讀了對(duì)象模型文檔,并通過(guò)簡(jiǎn)單編程制作了一個(gè)可執(zhí)行某項(xiàng)操作的 VBA 程序。 恭喜!

宏沒(méi)有運(yùn)行? 閱讀 VBA 中的調(diào)試建議。

編程提示和技巧

從示例開始

VBA 社區(qū)非常大;在 Web 上進(jìn)行搜索幾乎總是可以獲得其執(zhí)行的操作與你要執(zhí)行的操作類似的 VBA 代碼示例。 如果你找不到好的示例,請(qǐng)嘗試將任務(wù)分解為較小的單元,然后搜索其中每個(gè)單元,或者嘗試考慮更常見、但類似的問(wèn)題。 從示例開始可為你節(jié)省數(shù)小時(shí)的時(shí)間。

這并不意味著編寫嚴(yán)密的免費(fèi)代碼在 Web 上等待你使用。 事實(shí)上,你找到的一些代碼可能有缺陷或錯(cuò)誤。 但你聯(lián)機(jī)或在 VBA 文檔中找到的示例可為你提供良好的開端。 請(qǐng)記住,學(xué)習(xí)編程需要時(shí)間和思索。 在你忙于使用另一個(gè)解決方案來(lái)解決你的問(wèn)題之前,請(qǐng)?jiān)儐?wèn)自己 VBA 是不是解決此問(wèn)題的正確選擇。

處理較簡(jiǎn)單的問(wèn)題

編程過(guò)程可能會(huì)迅速變得復(fù)雜化。 將問(wèn)題分解為盡可能小的邏輯單元,然后獨(dú)立編寫并測(cè)試每個(gè)單元,這一點(diǎn)很重要,尤其對(duì)于初學(xué)者。 如果你面前有太多代碼,并且你變得迷惑或糊涂,請(qǐng)停止并撇開問(wèn)題。 當(dāng)你重新面對(duì)問(wèn)題時(shí),可以將一個(gè)小問(wèn)題復(fù)制到新模塊中,解決該問(wèn)題,讓代碼運(yùn)行,并測(cè)試它以確保它能夠運(yùn)行。 然后移動(dòng)到下一個(gè)部分。

缺陷和調(diào)試

有兩種主要類型的編程錯(cuò)誤:語(yǔ)法 錯(cuò)誤,即違反編程語(yǔ)言的語(yǔ)法規(guī)則;運(yùn)行時(shí) 錯(cuò)誤,即看上去語(yǔ)法正確,但在 VBA 嘗試執(zhí)行代碼時(shí)失敗。

雖然修復(fù)這些錯(cuò)誤可能令人沮喪,但語(yǔ)法錯(cuò)誤很容易捕獲;如果您在代碼中鍵入語(yǔ)法錯(cuò)誤,Visual Basic 編輯器會(huì)發(fā)出嘟嘟聲并閃爍。

例如,在 VBA 中必須使用雙引號(hào)將字符串值括起來(lái)。 若要了解改用單引號(hào)時(shí)會(huì)發(fā)生什么情況,請(qǐng)返回到 Visual Basic 編輯器,并將代碼示例中的“Wow!”字符串替換為“Wow!” (即,單詞 Wow 用單引號(hào)括起來(lái))。 如果選擇下一行,Visual Basic 編輯器會(huì)做出響應(yīng)。 錯(cuò)誤“編譯錯(cuò)誤:預(yù)期: 表達(dá)式”不是很有幫助,但是生成錯(cuò)誤的行變?yōu)榧t色,告訴你該行中存在語(yǔ)法錯(cuò)誤,因此,此程序?qū)o(wú)法運(yùn)行。

選擇“確定”,然后將文本改回“Wow!”。

運(yùn)行時(shí)錯(cuò)誤較難以捕獲,因?yàn)榫幊陶Z(yǔ)法看上去正確,但代碼在 VBA 嘗試執(zhí)行時(shí)失敗。

例如,打開 Visual Basic 編輯器,在宏中將 Value 屬性名更改為 ValueX,故意引入運(yùn)行時(shí)錯(cuò)誤,因?yàn)?Range 對(duì)象沒(méi)有名為 ValueX 的屬性。 返回到 Excel 文檔,打開“宏”對(duì)話框并再次運(yùn)行 Macro1。 應(yīng)看到一個(gè) Visual Basic 消息框,其中解釋了運(yùn)行時(shí)錯(cuò)誤,文本為“對(duì)象不支持此方法的此屬性”。雖然該文本很清晰,但請(qǐng)選擇 “調(diào)試” 以了解更多信息。

當(dāng)您返回到 Visual Basic 編輯器時(shí),編輯器處于特定調(diào)試模式,即使用黃色突出顯示失敗的代碼行。 與預(yù)期的一樣,突出顯示了包括 ValueX 屬性的行。

可以對(duì)運(yùn)行中的 VBA 代碼進(jìn)行更改,以將 ValueX 改回 Value,然后選擇“調(diào)試”菜單下的綠色小播放按鈕。 程序應(yīng)能夠再次正常運(yùn)行。

了解如何精心地使用調(diào)試器以獲得更長(zhǎng)、更復(fù)雜的程序是一個(gè)不錯(cuò)的主意。 至少,了解如何設(shè)置斷點(diǎn)以在想要查看代碼時(shí)停止執(zhí)行、代碼運(yùn)行時(shí)如何添加監(jiān)視點(diǎn)以查看不同變量和屬性的值、以及如何逐行查看代碼時(shí)。 這些選項(xiàng)在“調(diào)試”菜單中均有提供,認(rèn)真的調(diào)試器用戶通常會(huì)記住相應(yīng)的鍵盤快捷方式。

恰當(dāng)使用參考材料

若要打開內(nèi)建于 Office 幫助的開發(fā)人員參考,請(qǐng)通過(guò)選擇功能區(qū)中的問(wèn)號(hào)或按 F1 打開任何 Office 應(yīng)用程序中的幫助參考。 然后,在“搜索”按鈕右側(cè),選擇下拉箭頭以篩選內(nèi)容。 選擇開發(fā)人員參考。 如果在左面板中沒(méi)有看到目錄,請(qǐng)選擇小書圖標(biāo)將其打開,然后從中展開對(duì)象模型參考。

圖 5. 開發(fā)工具幫助上的篩選功能適用于所有 Office 應(yīng)用程序

瀏覽對(duì)象模型參考所花費(fèi)的時(shí)間將得到回報(bào)。 在你了解要使用的 Office 應(yīng)用程序的 VBA 語(yǔ)法和對(duì)象模型的基礎(chǔ)知識(shí)后,你的技能會(huì)得到提升,你將從主觀猜測(cè)轉(zhuǎn)變?yōu)榘捶椒ㄏ到y(tǒng)化編程。

當(dāng)然,Microsoft Office 開發(fā)人員中心是一個(gè)提供文章、技巧和社區(qū)信息的出色門戶。

搜索論壇和群組

所有程序員都會(huì)時(shí)不時(shí)遇到困難,即使在閱讀他們可以找到的每篇參考文章之后。他們晚上睡覺(jué)時(shí)會(huì)失眠,因?yàn)樗麄冊(cè)谒伎冀鉀Q問(wèn)題的各種方法。 幸運(yùn)的是,Internet 促進(jìn)了互相幫助以解決編程問(wèn)題的開發(fā)人員社區(qū)的發(fā)展。

在網(wǎng)絡(luò)上搜索“office 開發(fā)人員論壇”時(shí)會(huì)顯示幾個(gè)討論組。 你也可以搜索“office 開發(fā)”或問(wèn)題描述來(lái)查找論壇、博文以及文章。

如果你已為解決問(wèn)題而竭盡全力,那么就不要害怕將你的問(wèn)題張貼到開發(fā)人員論壇上。 這些論壇歡迎來(lái)自較新程序員的帖子,并且許多有經(jīng)驗(yàn)的開發(fā)人員都很樂(lè)于提供幫助。

下面是在向開發(fā)人員論壇中張貼內(nèi)容時(shí)需遵守的幾點(diǎn)規(guī)定:

  • 在張貼之前,應(yīng)在網(wǎng)站上查找 FAQ 或論壇成員希望你遵循的準(zhǔn)則。 確保所張貼的內(nèi)容符合這些準(zhǔn)則,并位于論壇的正確區(qū)域。

  • 包括清楚的完整代碼示例,如果您的代碼是一長(zhǎng)段代碼的一部分,請(qǐng)考慮編輯您的代碼以向其他人進(jìn)行闡述。

  • 清楚準(zhǔn)確地描述你的問(wèn)題,并概述你為解決此問(wèn)題已經(jīng)采取的所有步驟。 花些時(shí)間盡力編寫好的帖子,尤其在你慌亂或匆忙時(shí)。 采用對(duì)首次閱讀問(wèn)題陳述的讀者有意義的方式介紹情況。

  • 要有禮貌,并表達(dá)你的感激之情。

進(jìn)一步了解編程

雖然本文很短且只談到 VBA 和編程的表面內(nèi)容,但希望它能夠?yàn)槟闾峁┳銐虻娜腴T信息。

本節(jié)簡(jiǎn)單討論一些較關(guān)鍵的主題。

變量

在本文提供的簡(jiǎn)單示例中,你處理的是應(yīng)用程序已創(chuàng)建的對(duì)象。 你可能希望創(chuàng)建自己的對(duì)象來(lái)存儲(chǔ)值或?qū)?yīng)用程序中臨時(shí)使用的其他對(duì)象的引用。 這些對(duì)象稱為變量。

若要在 VBA 中使用變量,必須使用 Dim 語(yǔ)句告訴 VBA 變量所代表的對(duì)象類型。 然后,設(shè)置其值并用它來(lái)設(shè)置其他變量或?qū)傩浴?/p>

VB
    Dim MyStringVariable As String
    MyStringVariable = "Wow!"
    Worksheets(1).Range("A1").Value = MyStringVariable

分支和循環(huán)

本文中的簡(jiǎn)單程序從上到下一次執(zhí)行一行。 編程的真正功能來(lái)自你必須根據(jù)指定的一個(gè)或多個(gè)條件確定要執(zhí)行哪些代碼行的選項(xiàng)。 你可以進(jìn)一步擴(kuò)展這些功能,以便可以重復(fù)執(zhí)行一項(xiàng)操作許多次。 例如,下面的代碼擴(kuò)展了 Macro1。

VB
Sub Macro1()
    If Worksheets(1).Range("A1").Value = "Yes!" Then
        Dim i As Integer
        For i = 2 To 10
            Worksheets(1).Range("A" & i).Value = "OK! " & i
        Next i
    Else
        MsgBox "Put Yes! in cell A1"
    End If
End Sub

在 Visual Basic 編輯器中鍵入代碼或粘貼代碼,然后運(yùn)行編輯器。 按照出現(xiàn)的消息框中的說(shuō)明操作,并將單元格 A1 中的文本從 Wow! 更改為 Yes! 然后再次運(yùn)行編輯器,以查看循環(huán)功能。 該代碼段演示變量、分支和循環(huán)。 執(zhí)行期間仔細(xì)閱讀代碼,并嘗試確定每行代碼執(zhí)行時(shí)會(huì)發(fā)生的操作。

我的所有 Office 應(yīng)用程序:示例代碼

下面是一些要嘗試的腳本;每個(gè)腳本解決一個(gè) Office 實(shí)際問(wèn)題。

在 Outlook 中創(chuàng)建電子郵件

VB
Sub MakeMessage()
    Dim OutlookMessage As Outlook.MailItem
    Set OutlookMessage = Application.CreateItem(olMailItem)
    OutlookMessage.Subject = "Hello World!"
    OutlookMessage.Display
    Set OutlookMessage = Nothing
End Sub

請(qǐng)注意,有時(shí)你可能希望在 Outlook 中自動(dòng)創(chuàng)建電子郵件;你也可以使用模板。

刪除 Excel 工作表中的空行

VB
Sub DeleteEmptyRows()
    SelectedRange = Selection.Rows.Count
    ActiveCell.Offset(0, 0).Select
    For i = 1 To SelectedRange
        If ActiveCell.Value = "" Then
            Selection.EntireRow.Delete
        Else
            ActiveCell.Offset(1, 0).Select
        End If
    Next i
End Sub

請(qǐng)注意,您可以選擇一列單元格,然后運(yùn)行此宏來(lái)刪除所選列中具有空白單元格的所有行。

刪除 PowerPoint 中的空文本框

VB
Sub RemoveEmptyTextBoxes()
    Dim SlideObj As Slide
    Dim ShapeObj As Shape
    Dim ShapeIndex As Integer
    For Each SlideObj In ActivePresentation.Slides
        For ShapeIndex = SlideObj.Shapes.Count To 1 Step -1
            Set ShapeObj = SlideObj.Shapes(ShapeIndex)
            If ShapeObj.Type = msoTextBox Then
                If Trim(ShapeObj.TextFrame.TextRange.Text) = "" Then
                    ShapeObj.Delete
                End If
            End If
        Next ShapeIndex
    Next SlideObj
End Sub

請(qǐng)注意,此代碼循環(huán)訪問(wèn)所有幻燈片并刪除沒(méi)有任何文本的所有文本框。 計(jì)數(shù)變量遞減而不是遞增,因?yàn)榇a每次刪除一個(gè)對(duì)象時(shí),都會(huì)從集合中移除該對(duì)象,從而減小了計(jì)數(shù)。

將 Outlook 中的聯(lián)系人復(fù)制到 Word

VB
Sub CopyCurrentContact()
   Dim OutlookObj As Object
   Dim InspectorObj As Object
   Dim ItemObj As Object
   Set OutlookObj = CreateObject("Outlook.Application")
   Set InspectorObj = OutlookObj.ActiveInspector
   Set ItemObj = InspectorObj.CurrentItem
   Application.ActiveDocument.Range.InsertAfter (ItemObj.FullName & " from " & ItemObj.CompanyName)
End Sub

請(qǐng)注意,此代碼將 Outlook 中當(dāng)前打開的聯(lián)系人復(fù)制到打開的 Word 文檔中。 僅當(dāng) Outlook 中包含當(dāng)前打開以供檢查的聯(lián)系人時(shí),此代碼才運(yùn)行。

支持和反饋

有關(guān)于 Office VBA 或本文檔的疑問(wèn)或反饋? 請(qǐng)參閱 Office VBA 支持和反饋,獲取有關(guān)如何接收支持和提供反饋的指南。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Office 2010 中的 VBA 開發(fā)入門
Outlook 2010 中的 VBA 入門
VB、Office與VBA
教程 | VBA入門知多少
VBA概述之在Office產(chǎn)品中創(chuàng)建自己的應(yīng)用程序
vba簡(jiǎn)介
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服