如何将格式应用于VBA宏(Word)中的非连续单元格范围?

如何将格式应用于VBA宏(Word)中的非连续单元格范围?,vba,ms-word,Vba,Ms Word,我需要在MS Word文档中表格的矩形区域上执行一些简单任务。比如说,它包含10列20行。例如,我需要将文本居中放置在从第2列第3行到第8列第18行的单元格中。我试图得到一个从指定位置开始和结束的范围,但它包括,例如,第9列和第10列的单元格以及第3到第17行的单元格。以及最左边列中的相应单元格。另一方面,如果调用此范围的Select方法,它会根据需要选择一个矩形区域。但是,我不想使用选择,因为它们会使文本闪烁 作为解决方案,我迭代这些单元格,但需要很长时间。«作为解决方案,我迭代这些单元格,但

我需要在MS Word文档中表格的矩形区域上执行一些简单任务。比如说,它包含10列20行。例如,我需要将文本居中放置在从第2列第3行到第8列第18行的单元格中。我试图得到一个从指定位置开始和结束的范围,但它包括,例如,第9列和第10列的单元格以及第3到第17行的单元格。以及最左边列中的相应单元格。另一方面,如果调用此范围的
Select
方法,它会根据需要选择一个矩形区域。但是,我不想使用选择,因为它们会使文本闪烁


作为解决方案,我迭代这些单元格,但需要很长时间。

«作为解决方案,我迭代这些单元格,但需要很长时间。»

下面的代码,包括错误检查,对于单个表,所需时间不到1秒:

Sub Demo()
Application.ScreenUpdating = False
Dim eTime As Single: eTime = Timer
Dim Tbl As Table, r As Long, Rng As Range
For Each Tbl In ActiveDocument.Tables
  With Tbl
    If .Rows.Count > 17 Then
      If .Columns.Count > 7 Then
        For r = 3 To 18
          Set Rng = .Cell(r, 2).Range
          With Rng
            .End = .Rows(1).Cells(8).Range.End
            .ParagraphFormat.Alignment = wdAlignParagraphCenter
          End With
        Next
      End If
    End If
  End With
Next
Application.ScreenUpdating = True
eTime = (Timer - eTime + 86400) Mod 86400 ' Just in case execution time spans midnight
MsgBox "Execution took " & Format(eTime / 86400, "hh:mm:ss")
End Sub

«作为解决方案,我迭代这些单元格,但这需要很长时间。»

下面的代码,包括错误检查,对于单个表,所需时间不到1秒:

Sub Demo()
Application.ScreenUpdating = False
Dim eTime As Single: eTime = Timer
Dim Tbl As Table, r As Long, Rng As Range
For Each Tbl In ActiveDocument.Tables
  With Tbl
    If .Rows.Count > 17 Then
      If .Columns.Count > 7 Then
        For r = 3 To 18
          Set Rng = .Cell(r, 2).Range
          With Rng
            .End = .Rows(1).Cells(8).Range.End
            .ParagraphFormat.Alignment = wdAlignParagraphCenter
          End With
        Next
      End If
    End If
  End With
Next
Application.ScreenUpdating = True
eTime = (Timer - eTime + 86400) Mod 86400 ' Just in case execution time spans midnight
MsgBox "Execution took " & Format(eTime / 86400, "hh:mm:ss")
End Sub

如果你展示你尝试过的东西,通常会得到更多的响应…@TimWilliams,实际上,我可以得到非连续单元格的
范围。就像
选择
一样,如果你在一个表格中选择两个单元格。如果你展示你尝试过的内容,通常会得到更多的响应…@TimWilliams,事实上,我可以得到非连续单元格的
范围
。如果您在表格中选择两个单元格,则与选择类似。当然!但是,如果我们谈论的是几十个表呢?但是,感谢您的
屏幕更新
!在一个包含200个表的文档中,所有这些表都需要重新格式化,我上面发布的修改后的代码在我的笔记本电脑上需要5秒钟。考虑到所涉及的工作(22400个单元格需要重新格式化),这几乎不是我所说的“很长时间”。当然!但是,如果我们谈论的是几十个表呢?但是,感谢您的
屏幕更新
!在一个包含200个表的文档中,所有这些表都需要重新格式化,我上面发布的修改后的代码在我的笔记本电脑上需要5秒钟。考虑到所涉及的工作(22400个单元格需要重新格式化),这几乎不是我所说的“很长时间”。