Table 對(duì)象(因?yàn)槭菍?duì)象,所以用Set賦值) 該對(duì)象代表一個(gè)單獨(dú)的表格。Table 對(duì)象是Tables集合的一個(gè)成員。Tables集合包含了指定的選定內(nèi)容、范圍或文檔中的所有表格。 下面是Table的常用方法(注意是部分,不是全部,只例出重要的方法,下面的屬性皆如此,如果詳細(xì)面全部的了解,請(qǐng)看Word VBA自帶的幫助。VBAWD10.chm) 使用Table對(duì)象可使用 Tables(index) 返回一個(gè) Table 對(duì)象,其中 index 為索引號(hào)。索引號(hào)代表選定內(nèi)容、范圍或文檔中表格的位置。下例將活動(dòng)文檔中的第一個(gè)表格轉(zhuǎn)換為文本。 ActiveDocument.Tables(1).ConvertToText Separator:=wdSeparateByTabs 使用Add方法可以在指定范圍內(nèi)新增一表格。下例在活動(dòng)文檔的起始處添加一 3 x 4 表格。 Set myRange = ActiveDocument.Range(Start:=0, End:=0) ActiveDocument.Tables.Add Range:=myRange, NumRows:=3, NumColumns:=4 Cell 方法返回一個(gè) Cell 對(duì)象,該對(duì)象代表表格中的一個(gè)單元格。 expression.Cell(Row, Column) expression 必需。該表達(dá)式返回一個(gè)Table對(duì)象。 Row Long 類型,必需。指返回的表格行數(shù)??梢允墙橛?/SPAN> 1 和表格行數(shù)之間的任意整數(shù)。 Column Long 類型,必需。指返回的表格單元格數(shù)目??梢允墙橛?/SPAN> 1 和表格列數(shù)之間的任意整數(shù)。 示例 本示例在新文檔中創(chuàng)建一個(gè) 3x3 表格,并在表格的第一個(gè)和最后一個(gè)單元格中插入文本。 Dim docNew As Document Dim tableNew As Table Set docNew = Documents.Add Set tableNew = docNew.Tables.Add(Selection.Range, 3, 3) With tableNew .Cell(1,1).Range.InsertAfter "First cell" .Cell(tableNew.Rows.Count, _ tableNew.Columns.Count).Range.InsertAfter "Last Cell" End With 本示例刪除活動(dòng)文檔的第一個(gè)表格中的第一個(gè)單元格的內(nèi)容。 If ActiveDocument.Tables.Count >= 1 Then ActiveDocument.Tables(1).Cell(1, 1).Delete End If Split 方法在表格中緊靠指定行的上面插入一空段落,并且返回一個(gè) Table 對(duì)象,此對(duì)象包含指定行及其下一行。(簡(jiǎn)單的的理解:就是指向拆分后的下面的表格,不清楚也沒(méi)關(guān)系,看下面的例子。) expression.Split(BeforeRow) expression 必需。該表達(dá)式返回一個(gè) Table 對(duì)象。 BeforeRow Variant 類型,必需。將要拆分的表格的前一行??梢詾?/SPAN> Row 對(duì)象或行號(hào)。 本示例在活動(dòng)文檔(應(yīng)試是新建文檔)中創(chuàng)建一張 5x5 的表格,并且在第三行之前進(jìn)行拆分。然后為結(jié)果表格(新的 3x5 表格)的單元格添加底紋。 Set myTable = ActiveDocument.Tables.Add(Range:=Selection.Range, _ NumColumns:=5, NumRows:=5) myTable.Split(BeforeRow:=myTable.Rows(3)).Shading _ .Texture = wdTexture10Percent Table屬性Range 屬性本示例復(fù)制表格 1 中的首行。
If ActiveDocument.Tables.Count >= 1 Then _ ActiveDocument.Tables(1).Rows(1).Range.Copy End if Borders 屬性該屬性返回一個(gè) Borders 集合,該集合代表指定對(duì)象的所有邊框。 expression.Borders expression 必需。該表達(dá)式返回“應(yīng)用于”列表中的一個(gè)對(duì)象。 示例 本示例對(duì)活動(dòng)文檔中的第一個(gè)表格應(yīng)用內(nèi)部和外部邊框。 Set myTable = ActiveDocument.Tables(1) With myTable.Borders .InsideLineStyle = wdLineStyleSingle .OutsideLineStyle = wdLineStyleDouble End With Columns 屬性返回一個(gè) Columns 集合,該集合代表在某一區(qū)域、所選內(nèi)容或表格中所有表格列。只讀。 示例 本示例顯示活動(dòng)文檔的第一個(gè)表格中的列數(shù)。 If ActiveDocument.Tables.Count >= 1 Then MsgBox ActiveDocument.Tables(1).Columns.Count End If 本示例將當(dāng)前列的寬度設(shè)置為 1 英寸。 If Selection.Information(wdWithInTable) = True Then Selection.Columns.SetWidth ColumnWidth:=InchesToPoints(1), _ RulerStyle:=wdAdjustProportional End If Rows 屬性該屬性返回一個(gè) Rows 集合,該集合代表某個(gè)范圍、所選部分或表格中所有的表格行。只讀。 本示例刪除活動(dòng)文檔第一個(gè)表格的第二行。 ActiveDocument.Tables(1).Rows(2).Delete 本示例為插入點(diǎn)所在行的各單元格設(shè)置邊框。 Selection.Collapse Direction:=wdCollapseStart If Selection.Information(wdWithInTable) = True Then Selection.Rows(1).Borders.OutsideLineStyle = wdLineStyleSingle Else MsgBox "The insertion point is not in a table." End If Column 對(duì)象代表單個(gè)表格列。Column 對(duì)象是 Columns 集合的一個(gè)元素。Columns 集合包括某一表格、選定內(nèi)容或區(qū)域中的所有列。 使用 Column 對(duì)象使用 Columns(index) 可返回單獨(dú)的 Column 對(duì)象,其中 index 為索引序號(hào)。索引序號(hào)代表該列在 Columns 集合中的位置(從左至右計(jì)算)。 下列示例選定活動(dòng)文檔中的表格 1 的第一列。 ActiveDocument.Tables(1).Columns(1).Select 用 Cell 對(duì)象的 Column 屬性可返回一個(gè) Column 對(duì)象。下列示例刪除單元格 1 中的文字,插入新文字,然后對(duì)該列進(jìn)行排序。 With ActiveDocument.Tables(1).Cell(1, 1) .Range.Delete .Range.InsertBefore "Sales" .Column.Sort End With 用 Add 方法可在表格中添加一列。下列示例為活動(dòng)文檔的第一張表格中添加一列,然后將列寬設(shè)置為相等。 If ActiveDocument.Tables.Count >= 1 Then Set myTable = ActiveDocument.Tables(1) myTable.Columns.Add BeforeColumn:=myTable.Columns(1) myTable.Columns.DistributeWidth End If 說(shuō)明 用 Selection 對(duì)象的 Information 屬性可返回當(dāng)前列號(hào)。下列示例選定當(dāng)前列并在消息框中顯示其列號(hào)。 If Selection.Information(wdWithInTable) = True Then Selection.Columns(1).Select MsgBox "Column " _ & Selection.Information(wdStartOfRangeColumnNumber) End If Cell 對(duì)象代表單個(gè)表格單元格。Cell 對(duì)象是 Cells 集合中的元素。Cells 集合代表指定對(duì)象中所有的單元格。 使用 Cell 對(duì)象用 Cell(row, column) 或 Cells(index)可返回 Cell 對(duì)象,其中 row 為行號(hào),column 為列號(hào),index 為索引序號(hào)。下列示例給第一行的第二個(gè)單元格加底紋。 Set myCell = ActiveDocument.Tables(1).Cell(Row:=1, Column:=2) myCell.Shading.Texture = wdTexture20Percent 下列示例給第一行的第一個(gè)單元格加底紋。 ActiveDocument.Tables(1).Rows(1).Cells(1).Shading _ .Texture = wdTexture20Percent 用 Add 方法可在 Cells 集合中添加 Cell 對(duì)象。也可用 Selection 對(duì)象的 InsertCells 方法插入新單元格。下列示例在 myTable 的第一個(gè)單元格之前插入一個(gè)單元格。 Set myTable = ActiveDocument.Tables(1) myTable.Range.Cells.Add BeforeCell:=myTable.Cell(1, 1) 本示例將第一個(gè)表格的頭兩個(gè)單元格設(shè)定為一個(gè)域 (myRange)。區(qū)域設(shè)定之后,用 Merge 方法合并兩個(gè)單元格。 Set myTable = ActiveDocument.Tables(1) Set myRange = ActiveDocument.Range(myTable.Cell(1, 1) _ .Range.Start, myTable.Cell(1, 2).Range.End) myRange.Cells.Merge 說(shuō)明 使用帶 Rows 或 Columns 集合的 Add 方法添加一行或一列單元格。 使用 Selection 對(duì)象的 Information 屬性返回當(dāng)前行號(hào)和列號(hào)。下面的示例改變選中部分第一個(gè)單元格的寬度,再顯示單元格的行號(hào)和列號(hào)。 If Selection.Information(wdWithInTable) = True Then With Selection .Cells(1).Width = 22 MsgBox "Cell " & .Information(wdStartOfRangeRowNumber) _ & "," & .Information(wdStartOfRangeColumnNumber) End With End If Row 對(duì)象代表表格的一行。Row 對(duì)象是 Rows 集合中的一個(gè)元素。Rows 集合包括指定部分、區(qū)域或表格中的所有行。 使用 Row 對(duì)象用 Rows(index) 可返回單獨(dú)的 Row 對(duì)象,其中 index 為索引序號(hào)。索引序號(hào)代表該行在選定部分、區(qū)域或表格中的位置。下列示例刪除活動(dòng)文檔中第一張表格的首行。 ActiveDocument.Tables(1).Rows(1).Delete 用 Add 方法可在表格中添加行。下列示例在選定部分首行前插入一行。 If Selection.Information(wdWithInTable) = True Then Selection.Rows.Add BeforeRow:=Selection.Rows(1) End If 說(shuō)明 用 Cells 屬性可修改 Row 對(duì)象中的單個(gè)單元格。下列示例在選定部分中添加一張表格,并在表格第二行的各單元格內(nèi)插入數(shù)字。 Selection.Collapse Direction:=wdCollapseEnd If Selection.Information(wdWithInTable) = False Then Set myTable = _ ActiveDocument.Tables.Add(Range:=Selection.Range, _ NumRows:=3, NumColumns:=5) For Each aCell In myTable.Rows(2).Cells i = i + 1 aCell.Range.Text = i Next aCell End If 訪問(wèn)表格行或列時(shí)產(chǎn)生的錯(cuò)誤如果要訪問(wèn)繪制表格中單獨(dú)的行或列,而該表格又不統(tǒng)一,則會(huì)產(chǎn)生一個(gè)運(yùn)行時(shí)錯(cuò)誤。例如,如果活動(dòng)文檔中第一張表格的每列中具有不同數(shù)量的行,則使用下列指令將導(dǎo)致出錯(cuò)。 Sub RemoveTableBorders() ActiveDocument.Tables(1).Rows(1).Borders.Enable = False End Sub 要避免這種錯(cuò)誤,可首先使用 SelectColumn 或 SelectRow 方法選定一列或一行中的單元格。選定單元格后,再使用 Selection 對(duì)象的 Cells 屬性。下列示例選定第一張文檔表格中的第一行。Cells 屬性用于訪問(wèn)選定的單元格(第一行中的所有單元格)以刪除邊框。 Sub RemoveTableBorders() ActiveDocument.Tables(1).Cell(1, 1).Select With Selection .SelectRow .Cells.Borders.Enable = False End With End Sub 下列示例選定第一張文檔表格的第一列。For Each...Next 循環(huán)語(yǔ)句用于在所選內(nèi)容(第一列中的所有單元格)的每個(gè)單元格中添加文字。 Sub AddTextToTableCells() Dim intCell As Integer Dim oCell As Cell ActiveDocument.Tables(1).Cell(1, 1).Select Selection.SelectColumn intCell = 1 For Each oCell In Selection.Cells oCell.Range.Text = "Cell " & intCell intCell = intCell + 1 Next oCell End Sub 處理表格創(chuàng)建一張表格,插入文字,并應(yīng)用格式 下列示例在活動(dòng)文檔的開(kāi)頭插入一張 4 列 3 行的表格。For Each...Next 結(jié)構(gòu)用于循環(huán)遍歷表格中的每個(gè)單元格。在 For Each...Next 結(jié)構(gòu)中,InsertAfter 方法用于將文字添至表格單元格(單元格 1、單元格 2、以此類推)。 Sub CreateNewTable() Dim docActive As Document Dim tblNew As Table Dim celTable As Cell Dim intCount As Integer Set docActive = ActiveDocument Set tblNew = docActive.Tables.Add( _ Range:=docActive.Range(Start:=0, End:=0), NumRows:=3, _ NumColumns:=4) intCount = 1 For Each celTable In tblNew.Range.Cells celTable.Range.InsertAfter "Cell " & intCount intCount = intCount + 1 Next celTable tblNew.AutoFormat Format:=wdTableFormatColorful2, _ ApplyBorders:=True, ApplyFont:=True, ApplyColor:=True End Sub 在表格單元格中插入文字 下列示例在活動(dòng)文檔中第一張表格的第一個(gè)單元格中插入文字。Cell 方法返回單獨(dú)的 Cell 對(duì)象。Range 屬性返回一個(gè) Range 對(duì)象。Delete 方法用于刪除現(xiàn)有的文字,而 InsertAfter 方法用于插入文字“Cell 1,1”。 Sub InsertTextInCell() If ActiveDocument.Tables.Count >= 1 Then With ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range .Delete .InsertAfter Text:="Cell 1,1" ' .text="cell 1,1" 上面兩行,可以用這一行表示。 End With End If End Sub 返回表格單元格中的文字,不包括表格結(jié)束單元格標(biāo)記 下列示例返回并顯示文檔中第一張表格的第一行中每個(gè)單元格的內(nèi)容。 Sub ReturnTableText() Dim tblOne As Table Dim celTable As Cell Dim rngTable As Range Set tblOne = ActiveDocument.Tables(1) For Each celTable In tblOne.Rows(1).Cells Set rngTable = ActiveDocument.Range(Start:=celTable.Range.Start, _ End:=celTable.Range.End - 1) '注意這里用了-1 MsgBox rngTable.Text Next celTable End Sub
Sub ReturnCellText() Dim tblOne As Table Dim celTable As Cell Dim rngTable As Range Set tblOne = ActiveDocument.Tables(1) For Each celTable In tblOne.Rows(1).Cells Set rngTable = celTable.Range rngTable.MoveEnd Unit:=wdCharacter, Count:=-1 MsgBox rngTable.Text Next celTable End Sub
將文本轉(zhuǎn)換為表格 下列示例在活動(dòng)文檔的開(kāi)頭插入用制表符分隔的文本,然后將這些文本轉(zhuǎn)換為表格。 Sub ConvertExistingText() With Documents.Add.Content .InsertBefore "one" & vbTab & "two" & vbTab & "three" & vbCr .ConvertToTable Separator:=Chr(9), NumRows:=1, NumColumns:=3 End With End Sub
返回每個(gè)表格單元格的內(nèi)容 下列示例定義一個(gè)數(shù)組,該數(shù)組的元素個(gè)數(shù)等于文檔中第一張表格(假定為 Option Base 1)中的單元格數(shù)。For Each...Next 結(jié)構(gòu)用于返回每個(gè)表格單元格的內(nèi)容,并將文字指定給相應(yīng)的數(shù)組元素。 Sub ReturnCellContentsToArray() Dim intCells As Integer Dim celTable As Cell Dim strCells() As String Dim intCount As Integer Dim rngText As Range If ActiveDocument.Tables.Count >= 1 Then With ActiveDocument.Tables(1).Range intCells = .Cells.Count ReDim strCells(intCells) intCount = 1 For Each celTable In .Cells Set rngText = celTable.Range rngText.MoveEnd Unit:=wdCharacter, Count:=-1 strCells(intCount) = rngText intCount = intCount + 1 Next celTable End With End If End Sub (測(cè)試環(huán)境.doc的VBA中有更好的方法,可以參考) 將活動(dòng)文檔中的所有表格復(fù)制到新文檔中 本示例將當(dāng)前文檔中的表格復(fù)制到新文檔中。 Sub CopyTablesToNewDoc() Dim docOld As Document Dim rngDoc As Range Dim tblDoc As Table If ActiveDocument.Tables.Count >= 1 Then Set docOld = ActiveDocument Set rngDoc = Documents.Add.Range(Start:=0, End:=0) For Each tblDoc In docOld.Tables tblDoc.Range.Copy With rngDoc .Paste .Collapse Direction:=wdCollapseEnd .InsertParagraphAfter .Collapse Direction:=wdCollapseEnd End With Next End If End Sub
以下為我對(duì)表格的認(rèn)識(shí):(陋見(jiàn)) 在“測(cè)試環(huán)境.doc”中有不少的例子(在VBA中),也有解釋, 兩個(gè)文檔花了我8小時(shí)以上(即一個(gè)工作日以上) 關(guān)于表格在VBA中的相關(guān)說(shuō)明: 1. 如下圖,類似于回車 在VBA中也是chr(13),豎線就是chr(7),怎么知道的? 2. 當(dāng)然是看老大們知道的。不過(guò)。在“測(cè)試環(huán)境.doc”中有相關(guān)的宏能得到這些數(shù)字。這也是授之以漁吧。 3. 重點(diǎn)推薦“測(cè)試環(huán)境.doc”的相關(guān)代碼用了我不少功夫,慢慢體會(huì)。不懂的可以提出來(lái)。
4. 因?yàn)?/SPAN>chr(13)為段落標(biāo)記,所以在VBA中,ActiveDocument.Paragraphs.Count測(cè)得的段落數(shù)與工具、字?jǐn)?shù)統(tǒng)計(jì)是不一樣的。 5. 如果這樣統(tǒng)計(jì):表格中單元格中類似的 且不為空就為一個(gè)段落,否則不算。這就與工工具、字?jǐn)?shù)統(tǒng)計(jì)的段落數(shù)一樣了。 6. 如果要新建一個(gè)表格,再添加一些字符(包括數(shù)字)的話,更好的方法是:先字符寫入文檔中(當(dāng)然,要加一些標(biāo)記,以便確定單元格),再利用Word的表格、轉(zhuǎn)換、文字轉(zhuǎn)換為表格。這樣,速度快一些。有以下的代碼為證。 Sub 表格5() '先放到文檔,再放入表格 Dim i%, astring As String Dim adoc As Document Dim atime As Long Application.ScreenUpdating = False '關(guān)閉屏幕更新 atime = Timer '設(shè)atime為正前時(shí)間 For i = 1 To 1000 astring = astring & i & Chr(13) Next Set adoc = Documents.Add adoc.Content = astring adoc.Range.ConvertToTable Separator:=wdSeparateByParagraphs, NumColumns:=10, _ NumRows:=100 Application.ScreenUpdating = True MsgBox "先放到文檔的運(yùn)行時(shí)間為:" & Timer - atime '1.28,1.07,1.03 End Sub Sub 表格6() '先生成表格,再向單元格中添數(shù) Dim i%, astring As String Dim adoc As Document Dim atime As Long Dim atable As Table Application.ScreenUpdating = False '關(guān)閉屏幕更新 atime = Timer '設(shè)atime為正前時(shí)間 Set adoc = Documents.Add Set atable = adoc.Tables.Add(Selection.Range, 100, 10) With atable.Range For i = 1 To 1000 .Cells(i).Range.Text = i Next End With Application.ScreenUpdating = True MsgBox "先放到文檔的運(yùn)行時(shí)間為:" & Timer - atime '16.3,15.53,15.35 End Sub '幾乎是15倍的差別,誰(shuí)快誰(shuí)慢應(yīng)該大家知道了。還順帶說(shuō)一話:有的軟件在操作Word的表格時(shí),就是用類似于“表格6”的方法,而且也沒(méi)有用Appplication.ScreenUpdating=true。所以,看上去就像在看動(dòng)畫片。(例如:“青山預(yù)算之星”的“輸出到Word”就是)看來(lái),國(guó)產(chǎn)軟件還需努力。 7. 有些尤意末盡的,大家慢慢在程序中體會(huì)。 8. 特別強(qiáng)調(diào):微軟本身的許多功能,不是一般的VBA的程序,比VBA要快很多,不明白內(nèi)部是用什么語(yǔ)言或什么原理在工作。例如:a.郵件合并,速度奇快。如果你試著用VBA來(lái)做,速度奇慢。b.修訂功能;c.工具、宏、命令listcommands的運(yùn)行速度。 |
|