Excel 脚本编写
本頁內(nèi)容
| 使用 Excel:快速回顧 | |
| 將數(shù)據(jù)添加到電子表格中 | |
| Excel 中的格式設(shè)置 | |
| 使用范圍 | |
| 數(shù)據(jù)排序 | |
| 哦,真的是這樣:從 Active Directory 中提取數(shù)據(jù) | |
| 就這些嗎? |
我猜測當(dāng)您自稱為 Microsoft Scripting Guy 并撰寫名為腳本編寫門診 (Scripting Clinic) 的專欄時(shí),人們認(rèn)為您的生活被腳本包圍就不足為奇了。而實(shí)際上,在工作之外我并沒花太多的時(shí)間研究腳本編寫。譬如,我從來不閱讀關(guān)于腳本編寫的書;相反,我喜歡讀 Brian Greene 所著的The Fabric of the Cosmos 這類的書,這是一本很吸引人的書,講述的是量子力學(xué)、弦論和其他一些我一點(diǎn)都不懂的東西。
注:唯一的例外是這本書討論薛定鄂貓 (Schr?dinger's cat) 的部分。薛定鄂 (Edwin Schr?dinger) 是一個(gè)物理學(xué)家,他提出了下述思想實(shí)驗(yàn):將貓放在一個(gè)完全封閉的盒子里,其中釋放的放射性氣體有 50% 的幾率殺死貓。薛定鄂的命題是,如果您實(shí)際上沒有向盒中看一看,那么這只貓既不是死的也不是活的,而是處于某種不確定的狀態(tài)。我理解這種理論,因?yàn)槲腋铱隙?#xff0c;當(dāng)我們還是小孩時(shí),我們都曾擁有 過薛定鄂貓。只不過對于我們的貓,即使您真地 看一看它,您也不知道它是死是活,或許它根本就不是薛定鄂貓。
順便說一句,如果您想知道那只貓現(xiàn)在正做什么,嗯,這是很難講的。
現(xiàn)在我讀到 Greene 討論“時(shí)間之箭 (time's arrow)”這一部分。顯然,許多物理學(xué)家不明白為什么時(shí)間的流逝是那么的悄無聲息,而其倒退卻是如此之難;甚至愛因斯坦也覺得過去、現(xiàn)在和將來并沒有什么不同。(從我已經(jīng)經(jīng)歷過的來看,他的觀點(diǎn)可能是正確的。)
您大概想到了,當(dāng)您讀到時(shí)間之箭時(shí),您可能會(huì)不由自主地思考一些問題。您會(huì)考慮宇宙的性質(zhì),您也會(huì)考慮時(shí)間旅行所涉及的道德和倫理問題,您還會(huì)想,“在上個(gè)月的專欄中,我們告訴人們?nèi)绾问褂媚_本從 Microsoft Excel 電子表格中提取數(shù)據(jù),并使用這些數(shù)據(jù)在 Microsoft Active Directory 中創(chuàng)建用戶帳號(hào)。如果時(shí)光可以倒流,我就想知道這一過程是否也可以逆轉(zhuǎn)。我想知道腳本是否可以從 Active Directory 中提取數(shù)據(jù)并用這些數(shù)據(jù)填充Excel電子表格。”
如您所料,我周圍的每個(gè)人都說我是瘋子(在我提到這個(gè)觀念之前 就已經(jīng)這樣了)。因此我決定回到 1905 年,去問一問愛因斯坦,他是否認(rèn)為您可以使用腳本將數(shù)據(jù)寫入 Excel。畢竟,我不想在這個(gè)專欄里欺騙我自己。遺憾的是,愛因斯坦走在我的前面,我們彼此錯(cuò)過了。(我在他的應(yīng)答機(jī)上留了言,但是那時(shí)電話應(yīng)答機(jī)還沒有發(fā)明,我不能確定什么時(shí)候能得到答復(fù)。)因此我決定,“究竟是怎么回事兒啊?讓我試一試,看看到底會(huì)發(fā)生什么。如果這條路終究行不通,我就及時(shí)撤回來,并在專欄張貼到 MSDN 之前將其刪除掉?!彼?#xff0c;如果您不能立刻讀到這個(gè)專欄,就知道這是為什么了。
使用 Excel:快速回顧
上個(gè)月,我們學(xué)習(xí)了如何編寫腳本來從 Excel 電子表格提取數(shù)據(jù)。(如果您想不起上個(gè)月的專欄,您可以及時(shí)地返回去,也可以單擊此處。)在該專欄中,我們指出了僅僅使用下面兩行代碼就能夠創(chuàng)建 Excel 實(shí)例:
Set objExcel = CreateObject("Excel.Application") objExcel.Workbooks.Add當(dāng)然,這是薛定諤電子表格的一個(gè)例子:在您看見之前,您不能確定它是否真的是 電子表格。這是因?yàn)?#xff0c;在默認(rèn)情況下,您任何時(shí)候創(chuàng)建的 Excel 實(shí)例都運(yùn)行在不可見的窗口之中。要實(shí)際地看一看 Excel 實(shí)例,您需要將 Visible 屬性設(shè)置為 TRUE,如下所示:
Set objExcel = CreateObject("Excel.Application") objExcel.Workbooks.Add objExcel.Visible = True這三行代碼在屏幕上顯示一個(gè)空白的電子表格。這本身是非常令人興奮的,但如果該電子表格實(shí)際上包含一些數(shù)據(jù)就更令人興奮了。根據(jù)量子力學(xué),電子表格的原子自發(fā)重排以顯示有意義的數(shù)據(jù)還是有可能的。不過,我們還是不要等待這種可能性了,讓我們看一看依靠自己的力量是否能夠?qū)⒂幸饬x的數(shù)據(jù)添加到電子表格中。
返回頁首將數(shù)據(jù)添加到電子表格中
當(dāng)電子表格關(guān)閉時(shí),您可以很容易地將數(shù)據(jù)添加到電子表格中,而不用重排所有的原子:首先您簡單地引用一個(gè)單元格,然后相應(yīng)地設(shè)置值。例如,假設(shè)我們想要將單詞 Schr?dinger 輸入第一行第一列。試一試下面的腳本,看看會(huì)發(fā)生什么:
Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.Workbooks.Add objExcel.Cells(1, 1).Value = "Schr?dinger"當(dāng)您運(yùn)行這個(gè)腳本時(shí),您會(huì)看到類似于這樣的輸出:
圖 1. 將數(shù)據(jù)寫入 Excel 電子表格
哈哈,很酷吧!如果您想要添加其他的數(shù)據(jù),我們只需要多引用幾個(gè)單元格并且設(shè)置合適的值就可以了。例如,下面的腳本將四個(gè)著名物理學(xué)家的名字添加到我們的電子表格中:
Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.Workbooks.Add objExcel.Cells(1, 1).Value = "Schr?dinger" objExcel.Cells(1, 2).Value = "Bohr" objExcel.Cells(1, 3).Value = "Heisenberg" objExcel.Cells(1, 4).Value = "Einstein"當(dāng)您運(yùn)行這個(gè)腳本時(shí),您會(huì)看到類似于這樣的輸出:
圖 2. 將數(shù)據(jù)寫入 Excel 電子表格中的多個(gè)單元格
現(xiàn)在,真的非常酷……!嗯,不錯(cuò),您真行!但這還不 夠,是嗎?可以將數(shù)據(jù)添加到電子表格是一件了不起的事哦,不過,讓我們考慮一下這個(gè)問題。我們?yōu)槭裁丛敢庠?Excel 中顯示數(shù)據(jù)而不愿意在命令窗口中顯示數(shù)據(jù)或?qū)⑵浔4娴轿谋疚募心?#xff08;編寫系統(tǒng)管理腳本最常使用后兩種方法)?我們之所以愿意這么做,最可能的原因并不是選擇這兩種方法會(huì)讓您花大量的精力去安排數(shù)據(jù)的格式。至少我們可以說將數(shù)據(jù)輸出到命令窗口或保存到文本文件會(huì)缺少某種美感。這就是我們愿意使用 Excel 的原因;Excel 使您能夠創(chuàng)建格式漂亮、易于閱讀的輸出。但是在這里我們還無法保證有格式漂亮的輸出;畢竟,您可能連 Schr?dinger 或 Heisenberg 這樣的名字都讀不到。因此,在進(jìn)一步討論之前,讓我們來一個(gè)量子躍遷,談一談 Excel 中的格式設(shè)置。
返回頁首Excel 中的格式設(shè)置
如果您曾經(jīng)使用過 Excel,您就知道在 Excel 中設(shè)置格式是多么的容易:您只需選擇一兩個(gè)單元格,然后就可以應(yīng)用某種格式了(更改字體大小、更改單元格的背景顏色、將文本設(shè)置為黑體等等,想做什么都可以)。在程序化地使用 Excel 時(shí),您也可以做同樣的事情。例如,僅僅通過使用一些設(shè)置格式的命令,您就可以設(shè)置活動(dòng)單元格(您正在輸入的單元格)的格式。下面的腳本將單詞 Schr?dinger 輸入第一行第一列的單元格中,然后:
| ? | 將文本設(shè)為黑體(通過將 Bold 屬性設(shè)置為 TRUE)。 |
| ? | 將字體大小設(shè)為 24(通過將 Size 屬性設(shè)置為 24)。 |
| ? | 將字體顏色設(shè)為紅色(通過將 ColorIndex 屬性設(shè)置為 3)。 |
當(dāng)您運(yùn)行這個(gè)腳本時(shí),您會(huì)看到如下所示的輸出:
圖 3. 將帶格式的數(shù)據(jù)寫入 Excel 電子表格
屏住呼吸,怎么樣?
最好的是除了 ColorIndex 屬性略顯復(fù)雜之外(等一會(huì)兒我們將討論它),這段代碼是非常簡單的。如果想要將文本設(shè)為斜體該怎么辦?可以使用下面這行代碼:
objExcel.Cells(1, 1).Font.Italic = TRUE如果想要使用 Times New Roman 字體該怎么辦?可以使用下面這行代碼:
objExcel.Cells(1, 1).Font.Name = "Times New Roman"注:遺憾的是,我們沒有時(shí)間全面介紹您在處理時(shí)會(huì)使用的許多格式設(shè)置選項(xiàng)。不過,您將此處找到一些非常好的關(guān)于 Excel 對象模型的信息。
好的,但 ColorIndex 屬性又怎么樣呢?雖然在 Excel 中有兩種不同的方法更改顏色,但 ColorIndex 可能是最簡單的(它還可以告訴您一些關(guān)于其他方法的內(nèi)容)。在 Excel 中,有 56 種內(nèi)置的顏色(索引號(hào) 1–56)可供您使用;您必須做的事情就是將 ColorIndex 屬性的值設(shè)置為期望的索引號(hào)。唯一的問題就是:您如何知道索引號(hào) 3 是紅色,而索引號(hào) 4 是您真正感興趣的綠色陰影呢?
這個(gè)問題提得好。我粗略地搜索了一下 MSDN,卻沒有找到這些索引號(hào)的文檔。但是沒關(guān)系,下面這個(gè)簡單的小腳本會(huì)向您顯示所有的 56 個(gè)索引號(hào)都代表什么顏色:
Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.Workbooks.Add For i = 1 to 56objExcel.Cells(i, 1).Value = iobjExcel.Cells(i, 1).Interior.ColorIndex = i Next當(dāng)您運(yùn)行這個(gè)腳本時(shí),您會(huì)看到如下所示的輸出:
圖 4. Excel ColorIndex 值
您可以看出,如果您想要將字體顏色設(shè)置為清綠色,則只需將 ColorIndex 設(shè)置為 8 就行了。
順便提一句,如果您仔細(xì)地看過了前面的腳本,您現(xiàn)在就會(huì)知道如何設(shè)置單元格的背景顏色:只需使用 Interior.ColorIndex 屬性就行了。例如,要將單元格的顏色設(shè)置為紅色,可以使用下面的代碼:
objExcel.Cells(1, 1).Interior.ColorIndex = 3在我看來,您到現(xiàn)在還不知道這回事確實(shí) 是個(gè)奇跡。
在繼續(xù)討論之前,先來為我們的格式設(shè)置腳本做另外一件事。您可能會(huì)想得起來,我們的測試腳本向我們顯示以下所示的輸出:
圖 5. 將帶格式的數(shù)據(jù)寫入 Excel 電子表格
問題在哪里?嗯,首先單詞 Schr?dinger 并沒有全部顯示在第一列中。那好,如果我們在第一行第二列中輸入一些內(nèi)容會(huì)怎么樣呢?我們會(huì)看到類似于這樣的輸出:
圖 6. Excel 電子表格中大小設(shè)置不正確的列
沒有正確地得到我們所希望的輸出類型。顯然,我們需要做的是將第一列加寬一點(diǎn)。但怎么做呢?
返回頁首使用范圍
非常高興您問這個(gè)問題,因?yàn)楝F(xiàn)在是討論范圍的時(shí)候了。到此為止,我們還只是設(shè)置了活動(dòng)單元的格式,為其更改字體大小、單元格顏色等等。然而,有時(shí)您需要使用多個(gè)單元格。或許您想要更改特定行中所有單元格的字體大小?;蛟S您想要對您收集的所有數(shù)據(jù)進(jìn)行排序?;蛟S,和下面的例子一樣,您想要重新設(shè)置整個(gè)列的大小。如果這樣,您就需要使用范圍,一組 指定的單元格。
雖然有幾種不同的方法指示范圍中包含的單元格,但是它們有一點(diǎn)是共同的:它們都需要您創(chuàng)建 Range 對象的實(shí)例,然后 指定哪些單元格是該范圍的一部分。例如,下面是一些創(chuàng)建范圍的常用方法。
要?jiǎng)?chuàng)建包含單個(gè)單元格的范圍:
Set objRange2 = objExcel.Range("A1")要?jiǎng)?chuàng)建包含整個(gè)列的范圍:
Set objRange = objExcel.ActiveCell.EntireColumn正如您所期望的,有相似的命令來創(chuàng)建包含整個(gè)行的范圍:
Set objRange = objExcel.ActiveCell.EntireRow如果您想要選擇的行或列不同于帶有活動(dòng)單元格的行或列怎么辦?沒問題。使用所需的行或列中的一個(gè)單元格來創(chuàng)建范圍,然后使用 Activate 方法來使其成為活動(dòng)單元格。此時(shí),設(shè)置代表整個(gè)行或列的范圍。例如,下面這段代碼使單元格 E5 成為活動(dòng)單元格,然后通過選擇整個(gè)行來創(chuàng)建包含第 5 行中的所有單元格的范圍:
Set objRange = objExcel.Range("E5") objRange.Activate Set objRange = objExcel.ActiveCell.EntireRow要?jiǎng)?chuàng)建包含一組單元格的范圍:
Set objRange = objExcel.Range("A1:C10")注意,您在這里做的是指定起點(diǎn) (A1) 和終點(diǎn) (C10)。Excel 會(huì)自動(dòng)選擇這兩個(gè)點(diǎn)之間的所有單元,并把它們放在范圍之中。
要?jiǎng)?chuàng)建包含所有數(shù)據(jù)的范圍:
Set objCell = objExcel.Range("A1").SpecialCells(11)在這個(gè)例子中,11 是表示包含數(shù)據(jù)的電子表格中最后的單元格的參數(shù)。這個(gè)命令所創(chuàng)建的范圍從單元格 A1 開始一直延伸到所有包含數(shù)據(jù)的單元格。
為了進(jìn)行演示,讓我們再看一下前面的腳本,看看我們是否能夠使它變得更漂亮一點(diǎn)。在這個(gè)經(jīng)過修改的腳本中,我們將把物理學(xué)家的名字放在單列(而不是單行)中,并且我們將給該列加上粗體標(biāo)簽 (Name)。然后,僅僅是為了使它變得更美觀一些,我們將:
| ? | 更改帶標(biāo)簽的單元格 (1,1) 的背景顏色和字體顏色。 |
| ? | 創(chuàng)建包含我們正在使用的五個(gè)單元格的范圍 (A1:A5) 并更改字體大小。 |
| ? | 創(chuàng)建包含帶有四個(gè)物理學(xué)家名字的單元 (A2:A5) 的范圍并更改背景顏色。 |
| ? | 選擇列 A 并使用 Autofit() 方法來重新設(shè)置列的大小,以便所有的文本都適合。 |
腳本如下:
Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.Workbooks.Add objExcel.Cells(1, 1).Value = "Name" objExcel.Cells(1, 1).Font.Bold = TRUE objExcel.Cells(1, 1).Interior.ColorIndex = 30 objExcel.Cells(1, 1).Font.ColorIndex = 2 objExcel.Cells(2, 1).Value = "Schr?dinger" objExcel.Cells(3, 1).Value = "Heisenberg" objExcel.Cells(4, 1).Value = "Bohr" objExcel.Cells(5, 1).Value = "Einstein" Set objRange = objExcel.Range("A1","A5") objRange.Font.Size = 14 Set objRange = objExcel.Range("A2","A5") objRange.Interior.ColorIndex = 36 Set objRange = objExcel.ActiveCell.EntireColumn objRange.AutoFit()下面是最終的輸出結(jié)果:
圖 7. Excel 電子表格中美觀的格式
現(xiàn)在,您知道米開朗基羅完成圣母瑪利亞雕像時(shí)的心情了吧。
返回頁首數(shù)據(jù)排序
當(dāng)然,我們對米開朗基羅懷著應(yīng)有的尊敬,雖然圣母瑪利亞雕像非常出色,但是您不能對其進(jìn)行排序。然而,您可以 對 Excel 中的輸出進(jìn)行排序。將下面這兩行代碼放在腳本的末尾(我們等會(huì)兒就要解釋這兩行代碼的含義),然后再次運(yùn)行腳本:
Set objRange2 = objExcel.Range("A1") objRange.Sort objRange2,,,,,,,1您應(yīng)該看到如下所示的輸出:
圖 8. Excel 電子表格中經(jīng)過排序的數(shù)據(jù)
您必須按范圍對 Excel 中的數(shù)據(jù)進(jìn)行排序。因而,您需要?jiǎng)?chuàng)建一個(gè)范圍,它包含您想要按其進(jìn)行排序的列的第一個(gè)單元格。因?yàn)槲覀兿胍戳?A 進(jìn)行排序,所以我們創(chuàng)建的范圍包含單個(gè)單元格:A1。下面這行代碼的作用就在于此:
Set objRange2 = objExcel.Range("A1")這種 Sort 方法看起來很瘋狂(這么多逗號(hào)!),但這是因?yàn)槲覀儍H僅按單列進(jìn)行排序。當(dāng)您在 Excel 中對一些內(nèi)容進(jìn)行排序時(shí),您必須依次指定所有的排序參數(shù);如果您不使用參數(shù),則將其保留為空。下表對這些參數(shù)進(jìn)行了總結(jié)。
| 參數(shù)位置 | 說明 |
| 1 | 按第一列進(jìn)行排序。必須將其指定為范圍。 |
| 2 | 第一列的排序次序。將其設(shè)置為 1 表示升序(默認(rèn)),將其設(shè)置為 2 表示降序。 |
| 3 | 按第二列進(jìn)行排序。必須將其指定為范圍。 |
| 4 | 不用于腳本。將其保留為空。 |
| 5 | 第二列的排序次序。 |
| 6 | 按第三列進(jìn)行排序。必須將其指定為范圍。 |
| 7 | 第三列的排序次序。 |
| 8 | 指示將要進(jìn)行排序的數(shù)據(jù)是否有標(biāo)題行。將其設(shè)置為 1,指示該數(shù)據(jù)有標(biāo)題行;將其設(shè)置為 0,指示該數(shù)據(jù)沒有標(biāo)題行;而 0 可以讓 Excel 確認(rèn)數(shù)據(jù)是否有標(biāo)題行。 |
下面是在我們的樣本腳本中解釋排序參數(shù) objRange2,,,,,,,1 的方式:
| 參數(shù) | 說明 |
| objRange2 | 按第一列進(jìn)行排序。在我們的例子中,這是包含單元格 A1 的范圍。 |
| , | 第一列的排序次序。我們不使用這個(gè)參數(shù),所以將其保留為空。 |
| , | 按第二列進(jìn)行排序。我們不使用這個(gè)參數(shù),所以將其保留為空。 |
| , | 不用于腳本。將其保留為空。 |
| , | 第二列的排序次序。我們不使用這個(gè)參數(shù),所以將其保留為空。 |
| , | 按第三列進(jìn)行排序。我們不使用這個(gè)參數(shù),所以將其保留為空。 |
| , | 第三列的排序次序。 |
| 1 | 指示將要進(jìn)行排序的數(shù)據(jù)有標(biāo)題行。 |
在稍后的代碼中,我們將對兩個(gè)不同的列進(jìn)行排序,您將看到一個(gè)空想家如何進(jìn)行排序的例子。
返回頁首哦,真的是這樣:從 Active Directory 中提取數(shù)據(jù)
如果您的記憶力比較好(或者您可以訪問時(shí)間機(jī)器),您就可能會(huì)想起,在這個(gè)專欄的開頭我答應(yīng)教您如何從 Active Directory 中提取數(shù)據(jù)并將其直接放到電子表格中。我們確實(shí)是繞了一個(gè)圈子才回到這兒,不過,我們馬上就要進(jìn)入正題了。
我們將要做的事情是編寫一個(gè)腳本來搜索 Active Directory 并提取每個(gè)用戶帳號(hào)的信息;然后,我們使用這些信息來建立公司電話目錄。注意,當(dāng)我向您顯示用于搜索 Active Directory 的代碼時(shí),我們將不會(huì)采用任何方式來討論這些代碼;畢竟,這是一個(gè)關(guān)于 Excel 而不是 Active Directory 的專欄。(如果您想要獲得更多關(guān)于使用腳本來搜索 Active Directory 的信息,您可能需要查看我們關(guān)于這個(gè)主題最新的網(wǎng)絡(luò)廣播。
首先我們來看一看這段代碼,然后我們將對相關(guān)的部分做一些介紹:
Const ADS_SCOPE_SUBTREE = 2 Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.Workbooks.Add objExcel.Cells(1, 1).Value = "Last name" objExcel.Cells(1, 2).Value = "First name" objExcel.Cells(1, 3).Value = "Department" objExcel.Cells(1, 4).Value = "Phone number" Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 100 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE objCommand.CommandText = _"SELECT givenName, SN, department, telephoneNumber FROM " _& "'LDAP://dc=fabrikam,dc=microsoft,dc=com' WHERE " _& "objectCategory='user'" Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst x = 2 Do Until objRecordSet.EOFobjExcel.Cells(x, 1).Value = _objRecordSet.Fields("SN").ValueobjExcel.Cells(x, 2).Value = _objRecordSet.Fields("givenName").ValueobjExcel.Cells(x, 3).Value = _objRecordSet.Fields("department").ValueobjExcel.Cells(x, 4).Value = _objRecordSet.Fields("telephoneNumber").Valuex = x + 1objRecordSet.MoveNext Loop Set objRange = objExcel.Range("A1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit() Set objRange = objExcel.Range("B1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit() Set objRange = objExcel.Range("C1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit() Set objRange = objExcel.Range("D1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit() Set objRange = objExcel.Range("A1").SpecialCells(11) Set objRange2 = objExcel.Range("C1") Set objRange3 = objExcel.Range("A1") objRange.Sort objRange2,,objRange3,,,,,1確實(shí),這段代碼看起來 有點(diǎn)復(fù)雜。但實(shí)際上,它非常簡單。例如,看到了用斜體字顯示的代碼行了嗎?嗯,現(xiàn)在,我們完全可以忽略它們。它們用于:
| ? | 創(chuàng)建可見的 Excel 實(shí)例(您已經(jīng)知道如何去做了)。 |
| ? | 標(biāo)記四個(gè)用于輸出的列 (Last name、First name、Department、Phone number)。您也已經(jīng)知道如何去做了。 |
| ? | 搜索 fabrikam.com 域并檢索所有用戶帳號(hào)的 SN(姓或名)、givenName(名)、department 和 telephoneNumber 屬性。如果您不 知道如何去做,可以查看網(wǎng)絡(luò)廣播。 |
事實(shí)上,只有開始編寫這些用黑體字顯示的代碼行之后,腳本編寫才開始變得有趣:
x = 2 Do Until objRecordSet.EOFobjExcel.Cells(x, 1).Value = _objRecordSet.Fields("SN").ValueobjExcel.Cells(x, 2).Value = _objRecordSet.Fields("givenName").ValueobjExcel.Cells(x, 3).Value = _objRecordSet.Fields("department").ValueobjExcel.Cells(x, 4).Value = _objRecordSet.Fields("telephoneNumber").Valuex = x + 1objRecordSet.MoveNext Loop這是我們從 Active Directory 中實(shí)際提取數(shù)據(jù)并將其顯示在 Excel 中的地方。為此,我們首先將變量 x 的值設(shè)置為 2。該變量指示電子表格中的當(dāng)前行。我們?yōu)槭裁磸牡诙虚_始而不從第一行開始呢?其原因很簡單,我們把列標(biāo)題放在了第一行。因此,我們從第二行開始顯示數(shù)據(jù)。
接下來,我們創(chuàng)建一個(gè)循環(huán)來循環(huán)顯示返回記錄集中的所有記錄。循環(huán)中的第一個(gè)命令是:
objExcel.Cells(x, 1).Value = _objRecordSet.Fields("SN").Value這段代碼選擇第 2 行(用 x 表示)第 1 列,并且將該值設(shè)置為 objRecordSet.Fields("SN")。這是記錄集中第一個(gè)用戶的 SN(姓)。然后,腳本轉(zhuǎn)到第 2 行第 2 列,并且將該單元格的值設(shè)置為用戶的 givenName(名)。在為 department 和 telephoneNumber 執(zhí)行了相同的操作之后,腳本將 x 增加 1(從而使 x = 3)。然后,它循環(huán)處理記錄集中的下一個(gè)記錄,并將數(shù)據(jù)顯示在第 3 行中。這樣繼續(xù)下去,直到所有的用戶數(shù)據(jù)都添加到電子表格中為止。
換句話說,就是 您從 Active Directory 中提取數(shù)據(jù)并將其顯示在 Excel 中。您首先檢索數(shù)據(jù),然后簡單地將指定單元格的值設(shè)置為從 Active Directory 中提取的值。通過使用簡單的 Do Loop 循環(huán)并將行號(hào)每次增 1,您可以顯示記錄集中的每一項(xiàng)的信息。就是這么簡單!
腳本的剩余部分純粹就是點(diǎn)綴了。例如,這段代碼將活動(dòng)范圍設(shè)置為單元格 A1,選擇整個(gè)列,然后使用 Autofit 方法來重新設(shè)置該列的大小,這樣所有的數(shù)據(jù)就都可以顯示在屏幕上。該腳本然后對列 B、C 和 D 重復(fù)這個(gè)過程。
Set objRange = objExcel.Range("A1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit()代碼的最后四行對所有的返回?cái)?shù)據(jù)進(jìn)行排序,首先按部門名稱進(jìn)行排序,然后按姓進(jìn)行排序。腳本首先創(chuàng)建包含所有數(shù)據(jù)的范圍,然后為單元格 C1(按第一列進(jìn)行排序)和單元格 A1(按第二列進(jìn)行排序)創(chuàng)建單獨(dú)的范圍。此時(shí),腳本調(diào)用 Sort 方法,將單獨(dú)的范圍對象作為參數(shù)傳入。(相信我:這聽起來雖然有點(diǎn)復(fù)雜,但是它真的非常簡單!)
如果您在填充了電子表格之后想要自動(dòng)保存它,該怎么做呢?如果與這個(gè)例子的情況一樣,就只要在腳本的末尾加上下面這段代碼就行了;這三行代碼將電子表格保存為 C:/Scripts/Phone_Directory.xls 并終止 Excel 實(shí)例:
Set objWorkbook = objExcel.ActiveWorkbook objWorkbook.SaveAs("C:/Scripts/Phone_Directory.xls") objExcel.Quit如果不想終止 Excel 實(shí)例,只要不加上最后一行就可以了。
記住,您并不限于顯示 Excel 中的 Active Directory 信息。例如,下面是一個(gè)非常簡單的 WMI 腳本,它檢索運(yùn)行在計(jì)算機(jī)上的所有服務(wù)的狀態(tài)和名稱,然后將這些 信息顯示在 Excel 中。
Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.Workbooks.Add x = 1 strComputer = "." Set objWMIService = GetObject _("winmgmts://" & strComputer & "/root/cimv2") Set colServices = objWMIService.ExecQuery _("Select * From Win32_Service") For Each objService in colServicesobjExcel.Cells(x, 1) = objService.NameobjExcel.Cells(x, 2) = objService.Statex = x + 1 Next雖然相當(dāng)簡單,但是它為您提供了一些創(chuàng)建腳本的基礎(chǔ)。
返回頁首就這些嗎?
不管您信不信,您可以在系統(tǒng)管理腳本中使用的所有奇妙的方法,我們都還沒有接觸到。例如,我們還沒有討論使用 Excel 來創(chuàng)建圖表或圖形的可能性。這是我們將來要做的事情嗎?嗨!我看起來像什么,一個(gè)時(shí)間旅行者?(事實(shí)上,我們將 討論如何創(chuàng)建圖表或圖形。唯一的問題是,我們將在這個(gè)系列中進(jìn)行討論,還是在一些并行的系列中進(jìn)行討論。)
如果您碰巧讀到這個(gè)系列并且對本月的專欄有什么問題或建議的話,請通過電子郵件將它們發(fā)送至 scripter@microsoft.com。下個(gè)月見(這取決于時(shí)間之箭指向何方,上個(gè)月見)。
腳本編寫門診
Greg Stemp 是國家公認(rèn)的腳本編寫權(quán)威之一,并且被大家廣泛譽(yù)為世界級(jí)……哈哈!嗯,他們 的履歷表中怎么都當(dāng)過足球教練?真的嗎?他被解雇 了?哦,很好!Greg Stemp 工作在……哦,現(xiàn)在繼續(xù),難道我還沒有說出來嗎?好吧!Greg Stemp 現(xiàn)在在微軟工作,他擁有System Administration Scripting Guide 首席作家的終身頭銜。
總結(jié)
以上是生活随笔為你收集整理的Excel 脚本编写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP使用SMTP邮件服务器
- 下一篇: 数据结构杂谈(一)