【问题标题】:Excluding last row during sort在排序期间排除最后一行
【发布时间】:2019-07-23 02:08:13
【问题描述】:

通过调整 AddArrayName 上的 forloop 以按升序计数和填充,我解决了我的问题,而无需剪切、排序或插入行。

Sub AddArrayName()
With ActiveDocument

Dim tbl As Object
Dim noOfCol As Integer
Dim i As Long
Dim j As Integer

j = cbArraySize.Value

Set tbl = .Tables(2)
    With tbl
        noOfCol = tbl.Range.Rows(1).Cells.Count
        For i = .Rows.Count To 1 Step -1
            With .Rows(i)
                If Len(.Range) = noOfCol * 2 + 2 Then 
.Cells(1).Range.InsertAfter Text:=tbArrayName.Text + " - " & j + 1
            End With
        j = j - 1
        Next i

End With
End With
End Sub

我有一个动态表,它创建 x 行并根据用户输入自动填充第一个单元格。命名后,我会排除标题并对行进行排序。最后一行需要从排序中排除,因为它包含“Notes:”。

我相信我需要一个 for 循环来获取最后一行 -1,但由于我是 VBA 新手并且仍在尝试学习基础知识,因此无法理解它或从哪里开始。

Sub TableSort() ActiveDocument.Tables(2).Sort ExcludeHeader:=True End Sub

这是我目前拥有的,分为单独的 Subs。我有它的工作,除了它插入范围之前最后一行。

Private Sub cbArraySize_Click()

If cbArraySize.Value <> 0 Then

DeleteRows
CutRow2
AddRows
AddArrayName
TableSort
InsertRow2

End If

End Sub

Sub DeleteRows()

Dim tbl As Word.Table
Dim nrRows As Long, ColToCheck As Long, i As Long
Dim cellRange As Word.Range

Set tbl = ActiveDocument.Tables(2)
nrRows = tbl.Rows.Count - 1
ColToCheck = 2

For i = nrRows To 1 Step -1
    Set cellRange = tbl.Cell(i, ColToCheck).Range
    If Len(cellRange.Text) = 2 Then
        cellRange.Rows(1).Delete
    End If
Next i

End Sub

Sub CutRow2()

With ActiveDocument

.Tables(2).Rows(2).Select
Selection.Cut
End With

End Sub 

Sub AddRows()

With ActiveDocument

.Tables(2).Rows(1).Select
Selection.InsertRowsBelow (cbArraySize.Value)

End With

End Sub

Sub AddArrayName()
With ActiveDocument

Dim tbl As Object
Dim noOfCol As Integer
Dim i As Long
Dim intcount As Integer

intcount = 1

Set tbl = .Tables(2)
    With tbl
        noOfCol = tbl.Range.Rows(1).Cells.Count
        For i = .Rows.Count To 1 Step -1
            With .Rows(i)
                If Len(.Range) = noOfCol * 2 + 2 Then 
.Cells(1).Range.InsertAfter Text:=tbArrayName.Text + " - " & intcount
            intcount = intcount + 1
            End With
        Next i
End With
End With
End Sub

然后我对不包括标题的表格进行排序。

InsertRow2()

Dim mytable As Object
Set mytable = ActiveDocument.Tables(2)

mytable.Rows(mytable.Rows.Count).Range.Paste

End Sub

在 InsertRow2() 子例程之后,它将范围插入到最后一行之前。

表格示例:End Table Result I am looking for

实际作用:Actual Table Result

【问题讨论】:

标签: vba ms-word


【解决方案1】:

VBA 的一条经验法则:如果您作为最终用户无法做到这一点,那么 VBA 也可能无法做到。 Word 内置的排序命令只能排除表头行,不能排除表尾的行。

据我所知,解决此问题的唯一方法是将最后一行拆分为单独的表格。这将在之间放置一个段落标记,但可以使用“隐藏”字体格式进行格式化,以便两个表格看起来像一个表格。这将使您能够对没有“注释”的表格进行排序,如下所示。

【讨论】:

  • 谢谢辛迪。我会试试你的建议,看看我能不能解决这个问题。
  • 如果您需要更详细的说明,请告诉我...@Sparks
  • 现在我正在尝试使用 .Tables(2).Rows(2).Cut (总是可以使用复制然后删除 Row(2),然后我对表格进行排序。我将如何粘贴最后一行之后的这个范围?@Cindy Meister
  • @Sparks :您不是本次问答中的人:stackoverflow.com/questions/57049229/…?他们看起来如此接近,我想你再试一次,用不同的名字。该答案中的代码显示了如何。
  • 不,不是我。我一直在寻找试图破译它以将其应用于我的答案。 @Cindy Meister
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多