具有未知数量的融合行/列的VBA Word表

时间:2015-07-30 11:52:57

标签: vba multidimensional-array ms-word

我目前正在尝试使用Microsoft Word中的复杂表格。我的问题是,那些表格有融合的单元格和行,而且我不确定我会有多少行或列。

这是一个(愚蠢的)示例,我的表格类型如何 example of complex table

感谢书签,我得到了我的桌子,然后继续将桌子存放在Dim中以便于访问

Sub SetTable()
    Dim tb as Table
    Selection.GoTo What:=wdGoToBookmark, Name:="MyTable"
    Selection.MoveDown
    Set tb = Selection.Tables(1)
End Sub

现在,我使用该表写入数据库的几个表。 让我们说,我有一张桌子"目的地",一张桌子" Ways"和表格#34;时间"

我有点被阻止了。 对于融合的行和列,我无法访问整个列或行。但是因为我不知道我有多少行和列(例如,我可以有5种不同的方式用于"目的地1和#34;或者在#34中的几个距离;方式1和#34 ;)

enter image description here

我对如何努力工作有点失落。 单元格(x,y)。由于多行是融合的,因此不起作用,而且与Column相同,因此我们非常容易出错

我在考虑将表放在可能获得未知行数/列数的单元格中,有点像这样

enter image description here

这种方法的问题在于,在文档中写下的人不会成为我。这意味着,如果每次有新的行/列需要它时都必须创建一个表,那么它很快就会成为一个问题。 (我还没有找到一种方法,可以在新线的创建时将某些东西放在桌子的特定单元格中,我也在这一点上打开)

我想知道是否有适用于此类案例的最佳做法,我也在寻找建议。 如果你已经不得不对待类似于此的东西,你是怎么做的?
提前感谢您的回答

诚然,
Zawarudio

注意:此处的表格示例非常愚蠢,甚至我甚至不知道它在说什么。只是将信息放在表格中,并且与我试图做的事情完全没有联系。 如果你迷失了距离/时间/无论如何,抱歉

2 个答案:

答案 0 :(得分:1)

我有一些假期,所以我现在还没有解决这个问题 我刚刚发现了一种我觉得相关的方式,所以我来这里分享我的答案

请注意,我目前只处理了未知数量的合并行,所以这个答案只会是这个,尽管我相信它是一样的。另请注意我在Word 2010上。我不知道2013年行/列行为是否发生了变化,或者将来是否会发生变化。 (很明显)

最大的问题是合并的行单元格只有合并行的第一行的值。我们举一个简单的例子

a table with merged rows

此表有2行2列。我们融合了第一列的行 table.Rows.Count将返回2,table.Columns.count也将返回。
table.cell(1,1)。.ange.text将返回合并行的内容 我们希望 table.cell(2,1).Range.text返回合并行的值,但VBA告诉我们这个值不存在。

table.cell(1,2).Range.text和table.cell(2,2).Range.text。

没有问题。

使用值,这意味着包含合并行的表格非常相等 Table equivalence

每个空单元格会产生错误5941。

如何解决问题?

Sub ReadAllRows()
    Dim NbRows As Integer
    Dim NbColumns As Integer
    Dim i, j As Integer
    Dim SplitStr() As String

    Dim col1 as String
    Dim col2 as String
    Dim col3 as String
    Dim col4 as String

    'note : my table here is a public value that i get thanks to bookmarks
    NbRows = table.Rows.count
    NbColumns = table.Columns.count

    For i = 3 To NbRows
        'We put each value of each columns in a dim
        'We do that to remember previously entered row value if the application encounters an error
        'Because of merged rows, some cells on each row will not exist and return an error
        'When the application encounters an error, it just proceeds to next column
        'As previous existing value of this column was stocked in a Dim, we can get the full row at the end of the column loop
        For j = 1 To NbColumns
            On Error GoTo ErrorHandler

            SplitStr = Split(table.Cell(i, j).Range.Text, Chr(13))
            Select Case j
                Case 1:
                    col1 = SplitStr(0)
                Case 2:
                    col2 = SplitStr(0)
                Case 3:
                    col3 = SplitStr(0)
                Case 4:
                    col4 = SplitStr(0)

                'ect...
            End Select
NextRow:
        Next j

        'We have here all the values of the line
        MsgBox "col1: " & col1 & Chr(10) & _
            "col2: " & col2 & Chr(10) & _
            "col3: " & col3 & Chr(10) & _
            "col4: " & col4 & Chr(10)
    Next i

'This Error handler will skip the whole Select Case and thus will proceed towards next cell
ErrorHandler:
If Err.Number = 5941 Then
    Err.Clear
    Resume NextRow
End If

End Sub

这样,当一个单元格不存在时,这意味着合并后的行。这意味着我们想要行的最后已知值。由于我们在行未知时跳过整个选择,因此当我们确定未合并行的值时,Dim的值不会改变。

这不是火箭科学,但我首先从一个简单的On Error Resume Next开始,并且由此,不存在的行只具有最后一个现有行的值,所以我还必须处理一个函数这将试图为每一行的每个单元格获得良好的价值......

请注意,我在这里做了一些丑陋的事情,但你可以使用一个一维的数组来按照Word应该理解它的方式存储整行,或者你甚至可以得到一个二维数组来存储你的整个表格Word理解的方式

嗯,我希望有一天能帮助别人!

亲切地,
Zawarudio

答案 1 :(得分:0)

我认为必须有关于此的现有问答,但我没有使用快速搜索找到它,所以现在......

您可以做的一件事是遍历表格范围的单元格。像这样:

Sub iterTable()
Dim r As Range
Set r = ActiveDocument.Tables(1).Range
For i = 1 To r.Cells.Count
  Debug.Print r.Cells(i).RowIndex, r.Cells(i).ColumnIndex, r.Cells(i).Range.Text
Next
End Sub

只要您有预定义的文本,您就可以检测到目的地"小组,这应该足以让你取得进步......