使用" Step-into"启动时,Word VBA脚本的行为会有所不同。或"运行"

时间:2014-09-01 21:50:37

标签: vba ms-word word-vba

这是我第一次尝试为Word编写VBA脚本(我是一名前程序员,他有合理的,自学成才,使用Excel VBA成功)。我使用的是Word 2013(15.0.4641.1001 64位)和VBA 7.1 .142。

我试图执行一个简单的任务,即在当前光标位置创建一个双列表(它本身可以在另一个表中)。我希望表格是可用宽度的100%,然后我想修复第一列的宽度。从本质上讲,我的代码做了我想要的(并且第一次尝试,我对它感到相当满意),但它不稳定。

问题与宽度有关。如果我定位光标和" Step-into"宏,它通常(90%以上的时间)做我想要的。如果我"运行"它,它永远不会正常工作。

我的代码如下。它应该做的是: -

  1. 创建一个5行×2列的表格,即它所在位置的全宽。
  2. 使第一列成为固定宽度(接受短的固定格式字符串)
  3. 按顺序为每行编号并右对齐文本。
  4. 将每个原始行的第二列拆分为两行。
  5. 问题在于行动" 2",其他工作正常。

    • 如果表格是全文档宽度,则操作" 2"在"进入"似乎总能正常工作,但是
    • 当它是"运行",动作" 2"通过使第一列50%宽而总是失败。
    • 如果我手动创建1行2列表,然后"进入"宏在两个单元格的每一个中创建一个子表:
      • 行动" 2"第一个子表正常工作,但
      • 行动" 2"对于第二个子表,通常将第一列设置为50%而不是固定宽度
      • 有时行动" 2"将整个子表设置为其父单元格宽度的50%,并将其列设置为其自身宽度的50%

    我注意到的一件事是,当它执行时,命令

         .Columns(1).PreferredWidth = 15
    

    似乎比其他命令长得多。

    正如我所说,这是我的第一次努力,但我还不知道是否已经忽略了某些参数。

    如果有人可以解释我出错的地方以及如何解决这个问题,我真的很感激。

    干杯

    巴兹

    这是我的代码。

    Sub CreateTable()
    AddRows = 5
    Set NewTable = ActiveDocument.Tables.Add(Selection.Range, AddRows, 2)
    With NewTable
    'Display cell borders
        If .Style <> "Table Grid" Then
            .Style = "Table Grid"
        End If
    'Make table 100% wide
        .PreferredWidthType = wdPreferredWidthPercent
        .PreferredWidth = 100
    'Make column 1 narrow
        .PreferredWidthType = wdPreferredWidthPoints
        .Columns(1).PreferredWidth = 15
        .AutoFitBehavior (wdAutoFitFixed)
    'Number each row
        For a = 1 To AddRows
            .Cell(a, 1).Range.InsertAfter a & ")"
            .Cell(a, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
        Next a
    'Split column 2
        For a = 1 To (AddRows * 2) - 1 Step 2
            .Cell(a, 2).Split NumRows:=2, NumColumns:=1
        Next a
    End With
    End Sub
    

2 个答案:

答案 0 :(得分:1)

  1. 确保Option Explicit位于每个模块的顶部,并且代码编译(您的经验已经引导您完成此操作)。
  2. 开始临时评论操作,目的是进一步隔离问题。我很好奇.AutoFitBehavior是个问题。
  3. 插入DoEvents以帮助清除所有这些内部缓冲区。当您单步执行代码时,事件始终在进行;也许不是在运行时。

答案 1 :(得分:1)

由于我还在学习,我还不太了解Word VBA,以便完全理解为什么一种方法有效,而另一种方法没有,但这是一个有效的代码的简化版本。

Sub MakeTable()
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=5, NumColumns:=2, _
    DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:=wdAutoFitWindow
Selection.Tables(1).Columns(1).PreferredWidthType = wdPreferredWidthPoints
Selection.Tables(1).Columns(1).PreferredWidth = CentimetersToPoints(1)
'Number each row
For a = 1 To AddRows
    Selection.Tables(1).Cell(a, 1).Range.InsertAfter a & ")"
    Selection.Tables(1).Cell(a, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
Next a
'Split column 2
For a = 1 To (AddRows * 2) - 1 Step 2
    Selection.Tables(1).Cell(a, 2).Split NumRows:=2, NumColumns:=1
Next a
End Sub