適用范圍:
Microsoft Office Excel 2003
摘要:尋找能夠為 Excel 工作表增加額外功能的宏。只需稍加練習,您就可以擴展這些程序,使其適合您自己的應用程序。
本頁(yè)內容
引言
導出帶有逗號和引號分隔符的文本文件
計算包含公式、文本或數字的單元格數量
使用 Saved 屬性確定工作簿是否已發(fā)生更
合并數據列
數組中的總行數和總列數
結論
引言
本文介紹幾個(gè) Microsoft Visual Basic for Applications (VBA) 宏,您可以使用這些宏為 Microsoft Office Excel 2003 工作簿和工作表增加額外的功能。這些宏將為您的應用程序提供新的功能或增強現有的功能。閱讀示例的同時(shí),您應該尋找擴展這些宏的方法,以適合您自己的情況。
導出帶有逗號和引號分隔符的文本文件
Excel 沒(méi)有自動(dòng)將數據導出為文本文件的菜單命令,因此導出的文本文件同時(shí)帶有逗號和引號分隔符。例如,沒(méi)有命令能自動(dòng)創(chuàng )建包含以下內容的文本文件:
"Text1","Text2","Text3"
但是,您可以使用 VBA 宏在 Excel 中創(chuàng )建該功能。這種文件格式是在諸如 Microsoft Office Access 2003 和 Microsoft Office Word 2003 之類(lèi)的應用程序中導入文本數據時(shí)常見(jiàn)的格式。
您可以在如下所示的 VBA 宏中使用 Print 語(yǔ)句,導出同時(shí)帶有逗號和引號分隔符的文本文件。要使該程序正常運行,必須在運行該程序之前選擇包含數據的單元格。
使用以下示例之前,請執行以下步驟:
1.
打開(kāi)一個(gè)新工作簿。
2.
在“工具”菜單中,指向“宏”,然后單擊“Visual Basic 編輯器”(或者簡(jiǎn)單地按下 ALT+F11 組合鍵)。在“Visual Basic 編輯器”中,單擊“插入”菜單,然后單擊“模塊”。
3.
將以下示例代碼鍵入或粘貼到模塊中:
Sub QuoteCommaExport() Dim DestFile As String Dim FileNum As Integer Dim ColumnCount As Integer Dim RowCount As Integer ‘ 提示用戶(hù)指定目標文件名。 DestFile = InputBox("Enter the destination filename" & _ Chr(10) & "(with complete path and extension):", _ "Quote-Comma Exporter") ‘ 獲取下一個(gè)可用的文件句柄編號。 FileNum = FreeFile() ‘ 關(guān)閉錯誤檢查功能。 On Error Resume Next ‘ 嘗試打開(kāi)目標文件以供輸出。 Open DestFile For Output As #FileNum ‘ 如果出現錯誤,則報告錯誤并結束程序。 If Err <> 0 Then MsgBox "Cannot open filename " & DestFile End End If ‘ 打開(kāi)錯誤檢查功能。 On Error GoTo 0 ‘ 循環(huán)選擇的每一行。 For RowCount = 1 To Selection.Rows.Count ‘ 循環(huán)選擇的每一列。 For ColumnCount = 1 To Selection.Columns.Count ‘ 將當前單元格中的文本寫(xiě)入到文件中,文本用引號括起來(lái)。 Print #FileNum, """" & Selection.Cells(RowCount, _ ColumnCount).Text & """"; ‘ 檢查單元格是否位于最后一列。 If ColumnCount = Selection.Columns.Count Then ‘ 如果是,則寫(xiě)入一個(gè)空行。 Print #FileNum, Else ‘ 否則,則寫(xiě)入一個(gè)逗號。 Print #FileNum, ","; End If ‘ 開(kāi)始 ColumnCount 循環(huán)的下一個(gè)迭代。 Next ColumnCount ‘ 開(kāi)始 RowCount 循環(huán)的下一個(gè)迭代。 Next RowCount ‘ 關(guān)閉目標文件。 Close #FileNum End Sub
4.
運行該宏之前,請選擇要導出的數據,然后在“工具”菜單中指向“宏”并單擊“宏”。
5.
選擇 QuoteCommaExport 宏,然后單擊“運行”。
計算包含公式、文本或數字的單元格數量
在 Excel 中,您可以對包含公式、文本或數字的工作表中的單元格數量進(jìn)行計算,方法是使用“定位條件”對話(huà)框選擇單元格,然后運行計算所選單元格數量的宏。例如,當您需要設置表格以確定合計列的每一行是否都包含公式而不用手動(dòng)檢查每一行時(shí),此方法可能很有用。
選擇單元格
要選擇公式、文本或數字,請執行以下步驟:
1.
在“編輯”菜單中,單擊“定位”,然后單擊“定位條件”。
2.
在“定位條件”對話(huà)框中,要選擇所有公式,請單擊“公式”并確保選中“數字”、“文本”、“邏輯值”以及“錯誤”復選框。要選擇文本,請選擇“常量”選項,然后僅單擊并選中“文本”復選框。要選擇數字,請選擇“常量”選項,然后僅單擊并選中“數字”復選框。
計算所選單元格數量的 VBA 代碼
要計算所選的單元格數量并在消息框中顯示計算結果,請使用以下程序:
Sub Count_Selection() Dim cell As Object Dim count As Integer count = 0 For Each cell In Selection count = count + 1 Next cell MsgBox count & " item(s) selected" End Sub
您可以將此程序指定給一個(gè)命令按鈕,這樣,當您單擊該按鈕時(shí),將顯示所選項的數量。
使用 Saved 屬性確定工作簿是否已發(fā)生更改
可以通過(guò)檢查工作簿的 Saved 屬性來(lái)確定工作簿是否已發(fā)生更改。根據工作簿是否發(fā)生了更改,Saved 屬性將返回 True 或 False 值。
注意:用戶(hù)除了可以通過(guò)“事件”設置 Saved 屬性外,還可以通過(guò)代碼將其設置為 True 或 False。本節包含的示例宏說(shuō)明了如何在這兩種情況下使用 Saved 屬性。
工作表中的各種情況(例如存在可變函數)都可能會(huì )影響 Saved 屬性??勺兒瘮凳侵腹ぷ鞅碇忻看伟l(fā)生更改時(shí)都會(huì )重新計算的函數,而不管發(fā)生的更改是否影響到這些函數。某些常見(jiàn)的可變函數包括 RAND()、NOW()、TODAY() 和 OFFSET()。
如果活動(dòng)工作簿包含未保存的更改,第一個(gè)宏將顯示如下消息:
Sub TestForUnsavedChanges() If ActiveWorkbook.Saved = False Then MsgBox "This workbook contains unsaved changes." End If End Sub
下一個(gè)宏將關(guān)閉包含示例代碼的工作簿并放棄對工作簿所做的所有更改:
Sub CloseWithoutChanges() ThisWorkbook.Saved = True ThisWorkbook.Close End Sub
下面的示例宏也將關(guān)閉工作簿并放棄更改:
Sub CloseWithoutChanges() ThisWorkbook.Close SaveChanges:=False End Sub
合并數據列
在 Excel 中,可以使用宏合并兩個(gè)相鄰列中的數據并在包含數據的右側列中顯示結果,完全不需要手動(dòng)設置公式。本節包含的示例宏就可以實(shí)現此功能。
Sub ConcatColumns() Do While ActiveCell <> "" ‘ 一直循環(huán),直到活動(dòng)單元格為空。 ActiveCell.Offset(0, 1).FormulaR1C1 = _ ActiveCell.Offset(0, -1) & " " & ActiveCell.Offset(0, 0) ActiveCell.Offset(1, 0).Select Loop End Sub
要使用宏,請執行以下步驟:
1.
打開(kāi)包含數據的工作簿。
2.
按 ALT+F11 組合鍵激活“Visual Basic 編輯器”。
3.
在“插入”菜單中,單擊“模塊”以插入一個(gè)模塊。在模塊的代碼窗口中鍵入上面的宏。
4.
單擊“文件”菜單中的“關(guān)閉并返回到 Microsoft Excel”。
5.
選擇包含要合并的數據的工作表。
6.
單擊要合并的右側數據列的第一個(gè)單元格。例如,如果單元格 A1:A100 和 B1:B100 包含數據,則單擊單元格 B1。
7.
在“工具”菜單中,指向“宏”并單擊“宏”。選擇 ConcatColumns 宏并單擊“運行”。
注意:可以用語(yǔ)句 ActiveCell.Offset(0, 1).Formula 替換語(yǔ)句 ActiveCell.Offset(0, 1).FormulaR1C1。如果僅使用文本和數字(不包含公式),那么兩個(gè)語(yǔ)句的效果相同。第一個(gè)語(yǔ)句末尾使用的 R1C1 表示第一行的第一列,這是 Excel 幫助主題中大多數示例使用的形式。
數組中的總行數和總列數
在 Excel 中,可以使用數組來(lái)計算和操作工作表中的數據,還可以使用宏將某個(gè)范圍內的單元格中的值存儲到一個(gè)數組中。本節中的示例宏代碼將在一個(gè)矩形單元格區域中添加一行和一列,以包含該區域中每一行和每一列中的單元格總數。
具體的步驟是,代碼從活動(dòng)工作表上活動(dòng)單元格周?chē)漠斍皢卧駞^域中讀取數據。宏將這些數據存儲在一個(gè)數組中,計算每一行和每一列中的單元格總數,然后將輸出顯示在工作表中。數組的大小由當前區域中的單元格數量決定。
注意:此宏不會(huì )在工作表中添加任何公式,因此如果該范圍內的單元格總數有變化,則必須重新運行宏。
使用以下示例之前,請執行以下步驟:
1.
打開(kāi)一個(gè)新工作簿。
2.
在“工具”菜單中,指向“宏”,然后單擊“Visual Basic 編輯器”(或者簡(jiǎn)單地按下 ALT+F11 組合鍵)。在“Visual Basic 編輯器”中的“插入”菜單中,單擊“模塊”。
將以下示例代碼鍵入或粘貼到模塊中:
Sub TotalRowsAndColumns() ‘ 此宏假定您已從 ‘ 要計算單元格總數的矩形區域內 ‘ 選擇了一個(gè)單元格或一組單元格。行和列的單元格總數將出現在 ‘ 當前區域下面的行和右側的列中。 Dim r As Integer Dim c As Integer Dim i As Integer Dim j As Integer Dim myArray As Variant ‘ 將 myArray 聲明為變量將使數組可以接收 ‘ 一組單元格。此時(shí),數組將自動(dòng)轉換為 ‘ 以下標 myArray(1,1) 開(kāi)始的數組。 ‘ 指當前所選單元格周?chē)膮^域。 With Selection.CurrentRegion r = .Rows.Count c = .Columns.Count ‘ 重新計算總行數和總列數并將結果存儲到數組中。 myArray = .Resize(r + 1, c + 1) ‘ 在下面的嵌套循環(huán)中,變量 i 跟蹤 ‘ 行號,變量 j 跟蹤 ‘ 列號。j 在可用列中每循環(huán)一次, ‘ i 就遞增一,而 j ‘ 則重新從一到 c 循環(huán)一次。 For i = 1 To r For j = 1 To c ‘ 行 i 的總數 myArray(i, c + 1) = myArray(i, c + 1) + myArray(i, j) ‘ 列 j 的總數 myArray(r + 1, j) = myArray(r + 1, j) + myArray(i, j) ‘ 總計 myArray(r + 1, c + 1) = myArray(r + 1, c + 1) + myArray(i, j) Next j Next i ‘ 將數組返回工作表,數組中現在包含一個(gè) ‘ 新行和一個(gè)新列,用于存儲總數。 .Resize(r + 1, c + 1) = myArray End With End Sub
3.
突出顯示要求和區域中的一個(gè)單元格,在“工具”菜單中,指向“宏”并單擊“宏”。
4.
選擇 TotalRowsAndColumns 宏,然后單擊“運行”。
注意:要執行與本示例中的運算類(lèi)似的運算,可以修改宏代碼。例如,要對選定范圍內的單元格中包含的值進(jìn)行減法、乘法或除法運算,可以更改數學(xué)運算符。
結論
本文介紹了各種 VBA 宏,使用這些宏可以減少使用工作表所需的工作量。此外,您還可以修改本文介紹的大多數宏以擴展它們的功能。始終記住可以在工具或提示庫中添加更多宏,您將會(huì )受益匪淺。