天天看點

Word表格之VBA知識

Table對象(因為是對象,是以用Set指派)

該對象代表一個單獨的表格。Table 對象是Tables集合的一個成員。Tables集合包含了指定的標明内容、範圍或文檔中的所有表格。

下面是Table的常用方法(注意是部分,不是全部,隻例出重要的方法,下面的屬性皆如此,如果詳細面全部的了解,請看Word VBA自帶的幫助。VBAWD10.chm)

使用Table對象

可使用 Tables(index) 傳回一個 Table 對象,其中 index 為索引号。索引号代表標明内容、範圍或文檔中表格的位置。下例将活動文檔中的第一個表格轉換為文本。

ActiveDocument.Tables(1).ConvertToText Separator:=wdSeparateByTabs

使用Add方法可以在指定範圍内新增一表格。下例在活動文檔的起始處添加一 3 x 4 表格。

Set myRange = ActiveDocument.Range(Start:=0, End:=0)

ActiveDocument.Tables.Add Range:=myRange, NumRows:=3, NumColumns:=4

Cell 方法

傳回一個 Cell 對象,該對象代表表格中的一個單元格。

expression.Cell(Row, Column)

expression      必需。該表達式傳回一個Table對象。

Row   Long 類型,必需。指傳回的表格行數。可以是介于 1 和表格行數之間的任意整數。

Column    Long 類型,必需。指傳回的表格單元格數目。可以是介于 1 和表格列數之間的任意整數。

示例

本示例在新文檔中建立一個 3x3 表格,并在表格的第一個和最後一個單元格中插入文本。

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

本示例删除活動文檔的第一個表格中的第一個單元格的内容。

If ActiveDocument.Tables.Count >= 1 Then

    ActiveDocument.Tables(1).Cell(1, 1).Delete

End If

Split 方法

在表格中緊靠指定行的上面插入一空段落,并且傳回一個 Table 對象,此對象包含指定行及其下一行。(簡單的的了解:就是指向拆分後的下面的表格,不清楚也沒關系,看下面的例子。)

expression.Split(BeforeRow)

expression      必需。該表達式傳回一個 Table 對象。

BeforeRow     Variant 類型,必需。将要拆分的表格的前一行。可以為 Row 對象或行号。

本示例在活動文檔(應試是建立文檔)中建立一張 5x5 的表格,并且在第三行之前進行拆分。然後為結果表格(新的 3x5 表格)的單元格添加底紋。

Set newDoc = Documents.Add

Set myTable = ActiveDocument.Tables.Add(Range:=Selection.Range, _

    NumColumns:=5, NumRows:=5)

myTable.Split(BeforeRow:=myTable.Rows(3)).Shading _

    .Texture = wdTexture10Percent

Table屬性

Range 屬性

本示例複制表格 1 中的首行。

If ActiveDocument.Tables.Count >= 1 Then _

    ActiveDocument.Tables(1).Rows(1).Range.Copy

End if

Borders 屬性

該屬性傳回一個 Borders 集合,該集合代表指定對象的所有邊框。

expression.Borders

expression      必需。該表達式傳回“應用于”清單中的一個對象。

示例

本示例對活動文檔中的第一個表格應用内部和外部邊框。

Set myTable = ActiveDocument.Tables(1)

With myTable.Borders

    .InsideLineStyle = wdLineStyleSingle

    .OutsideLineStyle = wdLineStyleDouble

End With

Columns 屬性

傳回一個 Columns 集合,該集合代表在某一區域、所選内容或表格中所有表格列。隻讀。

示例

本示例顯示活動文檔的第一個表格中的列數。

If ActiveDocument.Tables.Count >= 1 Then

    MsgBox ActiveDocument.Tables(1).Columns.Count

End If

本示例将目前列的寬度設定為 1 英寸。

If Selection.Information(wdWithInTable) = True Then

    Selection.Columns.SetWidth ColumnWidth:=InchesToPoints(1), _

        RulerStyle:=wdAdjustProportional

End If

Rows 屬性

該屬性傳回一個 Rows 集合,該集合代表某個範圍、所選部分或表格中所有的表格行。隻讀。

本示例删除活動文檔第一個表格的第二行。

ActiveDocument.Tables(1).Rows(2).Delete

本示例為插入點所在行的各單元格設定邊框。

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 對象

代表單個表格列。Column 對象是 Columns 集合的一個元素。Columns 集合包括某一表格、標明内容或區域中的所有列。

使用 Column 對象

使用 Columns(index) 可傳回單獨的 Column 對象,其中 index 為索引序号。索引序号代表該列在 Columns 集合中的位置(從左至右計算)。

下列示例標明活動文檔中的表格 1 的第一列。

ActiveDocument.Tables(1).Columns(1).Select

用 Cell 對象的 Column 屬性可傳回一個 Column 對象。下列示例删除單元格 1 中的文字,插入新文字,然後對該列進行排序。

With ActiveDocument.Tables(1).Cell(1, 1)

    .Range.Delete

    .Range.InsertBefore "Sales"

    .Column.Sort

End With

用 Add 方法可在表格中添加一列。下列示例為活動文檔的第一張表格中添加一列,然後将列寬設定為相等。

If ActiveDocument.Tables.Count >= 1 Then

    Set myTable = ActiveDocument.Tables(1)

    myTable.Columns.Add BeforeColumn:=myTable.Columns(1)

    myTable.Columns.DistributeWidth

End If

說明

用 Selection 對象的 Information 屬性可傳回目前列号。下列示例標明目前列并在消息框中顯示其列号。

If Selection.Information(wdWithInTable) = True Then

    Selection.Columns(1).Select

    MsgBox "Column " _

        & Selection.Information(wdStartOfRangeColumnNumber)

End If

Cell 對象

代表單個表格單元格。Cell 對象是 Cells 集合中的元素。Cells 集合代表指定對象中所有的單元格。

使用 Cell 對象

用 Cell(row, column) 或 Cells(index)可傳回 Cell 對象,其中 row 為行号,column 為列号,index 為索引序号。下列示例給第一行的第二個單元格加底紋。

Set myCell = ActiveDocument.Tables(1).Cell(Row:=1, Column:=2)

myCell.Shading.Texture = wdTexture20Percent

下列示例給第一行的第一個單元格加底紋。

ActiveDocument.Tables(1).Rows(1).Cells(1).Shading _

    .Texture = wdTexture20Percent

用 Add 方法可在 Cells 集合中添加 Cell 對象。也可用 Selection 對象的 InsertCells 方法插入新單元格。下列示例在 myTable 的第一個單元格之前插入一個單元格。

Set myTable = ActiveDocument.Tables(1)

myTable.Range.Cells.Add BeforeCell:=myTable.Cell(1, 1)

本示例将第一個表格的頭兩個單元格設定為一個域 (myRange)。區域設定之後,用 Merge 方法合并兩個單元格。

Set myTable = ActiveDocument.Tables(1)

Set myRange = ActiveDocument.Range(myTable.Cell(1, 1) _

    .Range.Start, myTable.Cell(1, 2).Range.End)

myRange.Cells.Merge

說明

使用帶 Rows 或 Columns 集合的 Add 方法添加一行或一列單元格。

使用 Selection 對象的 Information 屬性傳回目前行号和列号。下面的示例改變選中部分第一個單元格的寬度,再顯示單元格的行号和列号。

If Selection.Information(wdWithInTable) = True Then

    With Selection

        .Cells(1).Width = 22

        MsgBox "Cell " & .Information(wdStartOfRangeRowNumber) _

            & "," & .Information(wdStartOfRangeColumnNumber)

    End With

End If

Row 對象

代表表格的一行。Row 對象是 Rows 集合中的一個元素。Rows 集合包括指定部分、區域或表格中的所有行。

使用 Row 對象

用 Rows(index) 可傳回單獨的 Row 對象,其中 index 為索引序号。索引序号代表該行在標明部分、區域或表格中的位置。下列示例删除活動文檔中第一張表格的首行。

ActiveDocument.Tables(1).Rows(1).Delete

用 Add 方法可在表格中添加行。下列示例在標明部分首行前插入一行。

If Selection.Information(wdWithInTable) = True Then

    Selection.Rows.Add BeforeRow:=Selection.Rows(1)

End If

說明

用 Cells 屬性可修改 Row 對象中的單個單元格。下列示例在標明部分中添加一張表格,并在表格第二行的各單元格内插入數字。

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

通路表格行或列時産生的錯誤

如果要通路繪制表格中單獨的行或列,而該表格又不統一,則會産生一個運作時錯誤。例如,如果活動文檔中第一張表格的每列中具有不同數量的行,則使用下列指令将導緻出錯。

Sub RemoveTableBorders()

    ActiveDocument.Tables(1).Rows(1).Borders.Enable = False

End Sub

要避免這種錯誤,可首先使用 SelectColumn 或 SelectRow 方法標明一列或一行中的單元格。標明單元格後,再使用 Selection 對象的 Cells 屬性。下列示例標明第一張文檔表格中的第一行。Cells 屬性用于通路標明的單元格(第一行中的所有單元格)以删除邊框。

Sub RemoveTableBorders()

    ActiveDocument.Tables(1).Cell(1, 1).Select

    With Selection

        .SelectRow

        .Cells.Borders.Enable = False

    End With

End Sub

下列示例標明第一張文檔表格的第一列。For Each...Next 循環語句用于在所選内容(第一列中的所有單元格)的每個單元格中添加文字。

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

處理表格

建立一張表格,插入文字,并應用格式

下列示例在活動文檔的開頭插入一張 4 列 3 行的表格。For Each...Next 結構用于循環周遊表格中的每個單元格。在 For Each...Next 結構中,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

在表格單元格中插入文字

下列示例在活動文檔中第一張表格的第一個單元格中插入文字。Cell 方法傳回單獨的 Cell 對象。Range 屬性傳回一個 Range 對象。Delete 方法用于删除現有的文字,而 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

傳回表格單元格中的文字,不包括表格結束單元格标記

下列示例傳回并顯示文檔中第一張表格的第一行中每個單元格的内容。

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

将文本轉換為表格

下列示例在活動文檔的開頭插入用制表符分隔的文本,然後将這些文本轉換為表格。

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

傳回每個表格單元格的内容

下列示例定義一個數組,該數組的元素個數等于文檔中第一張表格(假定為 Option Base 1)中的單元格數。For Each...Next 結構用于傳回每個表格單元格的内容,并将文字指定給相應的數組元素。

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

(測試環境.doc的VBA中有更好的方法,可以參考)

将活動文檔中的所有表格複制到新文檔中

本示例将目前文檔中的表格複制到新文檔中。

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

以下為我對表格的認識:(陋見)

在“測試環境.doc”中有不少的例子(在VBA中),也有解釋,

兩個文檔花了我8小時以上(即一個工作日以上)

關于表格在VBA中的相關說明:

1.         如下圖,類似于回車 在VBA中也是chr(13),豎線就是chr(7),怎麼知道的?

2.         當然是看老大們知道的。不過。在“測試環境.doc”中有相關的宏能得到這些數字。這也是授之以漁吧。

3.         重點推薦“測試環境.doc”的相關代碼用了我不少功夫,慢慢體會。不懂的可以提出來。

Ch(13)
Ch(7)

4.         因為chr(13)為段落标記,是以在VBA中,ActiveDocument.Paragraphs.Count測得的段落數與工具、字數統計是不一樣的。

5.         如果這樣統計:表格中單元格中類似的 且不為空就為一個段落,否則不算。這就與工工具、字數統計的段落數一樣了。

6.         如果要建立一個表格,再添加一些字元(包括數字)的話,更好的方法是:先字元寫入文檔中(當然,要加一些标記,以便确定單元格),再利用Word的表格、轉換、文字轉換為表格。這樣,速度快一些。有以下的代碼為證。

Sub 表格5()

'先放到文檔,再放入表格

Dim i%, astring As String

Dim adoc As Document

Dim atime As Long

Application.ScreenUpdating = False '關閉螢幕更新

atime = Timer '設atime為正前時間

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 "先放到文檔的運作時間為:" & Timer - atime

    '1.28,1.07,1.03

End Sub

Sub 表格6()

'先生成表格,再向單元格中添數

Dim i%, astring As String

Dim adoc As Document

Dim atime As Long

Dim atable As Table

Application.ScreenUpdating = False '關閉螢幕更新

atime = Timer '設atime為正前時間

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 "先放到文檔的運作時間為:" & Timer - atime

    '16.3,15.53,15.35

End Sub

'幾乎是15倍的差别,誰快誰慢應該大家知道了。還順帶說一話:有的軟體在操作Word的表格時,就是用類似于“表格6”的方法,而且也沒有用Appplication.ScreenUpdating=true。是以,看上去就像在看卡通片。(例如:“青山預算之星”的“輸出到Word”就是)看來,國産軟體還需努力。

7.         有些尤意末盡的,大家慢慢在程式中體會。

8.         特别強調:微軟本身的許多功能,不是一般的VBA的程式,比VBA要快很多,不明白内部是用什麼語言或什麼原理在工作。例如:a.郵件合并,速度奇快。如果你試着用VBA來做,速度奇慢。b.修訂功能;c.工具、宏、指令listcommands的運作速度。

等等,都是我們VBA一族所不能及的。(不過來,如果我們的VBA與微軟快,微軟不PK我們才怪。呵呵,阿Q精神一下,找一下心理平衡。

繼續閱讀