2017-08-10 29 views
0

我在尝试弄清楚如何对其进行编码时遇到了一些麻烦。我有一个5列的零件表(数量,零件号,描述,数量和总数)。当单击一个命令按钮时,会添加一个新行。每添加一个新行,每个新添加的单元格都包含一个文本内容控件,该控件的名称和编号将加1。例如,Qty3,Qty4,Qty5等。“金额”和“总计”列的功能相同。我将Total内容控件锁定。Word VBA从表中删除添加的行

我发现在可以删除该行之前,必须解锁“Total”内容控件。现在,代码选择“Total3”内容控件,并成功删除行,因为它是表中的最后一行。我无法弄清楚的部分是如何让代码识别哪个“Total#”内容控件是表中的最后一个。我希望这是有道理的,如果需要的话,我可以澄清任何事情。提前致谢!

'Add Part Button 

Private Sub CommandButton1_Click() 
Dim oTable As Table 
Set oTable = ActiveDocument.Tables(8) 
MakePartsRow oTable 
lbl_Exit: 
Set oTable = Nothing 
Exit Sub 
End Sub 

'Delete Part Button 

Private Sub CommandButton11_Click() 
Dim oTable As Table 
Dim CC As ContentControl 
Set oTable = ActiveDocument.Tables(8) 
Dim lngRow As Long 
Dim Index As Long 
Dim sName1 As String 

If Not ActiveDocument.ProtectionType = wdNoProtection Then 
     ActiveDocument.Unprotect 
End If 
If oTable.Rows.Count > 2 Then 
Set CC = ActiveDocument.SelectContentControlsByTag("Total3").Item(1) 
With CC 
    .LockContents = False 
    .Delete True 
End With 
oTable.Rows.Last.Delete 
End If 
    ActiveDocument.Protect wdAllowOnlyFormFields, NoReset:=True, _ 
    Password:="" 
End Sub 

Sub MakePartsRow(oTable As Table) 
Dim oNewRow As Row 
Dim oRng As Range 
Dim oCell As Cell 
Dim iCell As Integer 
Dim oCC As ContentControl, oCC1 As ContentControl, oCC2 As ContentControl 
Dim lngCell1 As Long, lngCell2 As Long 
lngCell1 = 0: lngCell2 = 0 
If Not ActiveDocument.ProtectionType = wdNoProtection Then 
    ActiveDocument.Unprotect 
End If 
Set oNewRow = oTable.Rows.Add 
oNewRow.Range.Font.Bold = False 
For iCell = 1 To 5 
    Set oCell = oNewRow.Cells(iCell) 
    Set oRng = oCell.Range 
    oRng.End = oRng.End - 1 
    Select Case iCell 
     Case 1 
      Set oCC = oRng.ContentControls.Add(wdContentControlText) 
      With oCC 
       .Range.Text = "1" 
       .SetPlaceholderText , , ("Qty") 
       .Tag = "Qty" & oCell.RowIndex 
      End With 
     Case 2 
      Set oCC = oRng.ContentControls.Add(wdContentControlText) 
      With oCC 
       .SetPlaceholderText , , ("Part No.") 
      End With 
     Case 3 
      Set oCC = oRng.ContentControls.Add(wdContentControlText) 
      With oCC 
       .SetPlaceholderText , , ("Description") 
      End With 
     Case 4 
      Set oCC = oRng.ContentControls.Add(wdContentControlText) 
      With oCC 
       .Range.Text = "" 
       .SetPlaceholderText , , ("Amount") 
       .Tag = "Amount" & oCell.RowIndex 
      End With 
     Case 5 
      Set oCC = oRng.ContentControls.Add(wdContentControlText) 
      With oCC 
       .SetPlaceholderText , , ("Total") 
       .Tag = "Total" & oCell.RowIndex 
      End With 
    End Select 
Next iCell 
oNewRow.Cells(4).Select 
ActiveDocument.Protect wdAllowOnlyFormFields, NoReset:=True, _ 
Password:="" 
End Sub 

回答

0

我建议计数内容控件的数量与像总*标签,在你的CommandButton11_Click()子,即:

Dim ControlCount as Long 
Dim ControlIndex as Long 
ControlIndex = 0 
For ControlIndex = 1 to ActiveDocument.ContentControls.Count 
    If ActiveDocument.ContentControls(ControlIndex).Tag Like "Total*" Then ControlCount = ControlCount + 1 
Next ControlIndex 

你知道这样多少控制你有,你可以通过使用

Set CC = ActiveDocument.SelectContentControlsByTag("Total" & ControlCount).Item(1) 

而不是你的引用的最后一个:

Set CC = ActiveDocument.SelectContentControlsByTag("Total3").Item(1) 
+0

感谢您的回复。我插入了你的代码,并得到了这个运行时错误:集合的请求成员不存在。 Set CC命令正在高亮显示。我想知道我是否将它插入错误的地方? – BradBerger

+0

你的代码在哪里插入了For循环(我的回复中的代码的第一部分)? 当你得到错误时,进入_Immediate_窗口(按Ctrl + G),然后输入:'?ControlCount' 你可以检查该控件(_Total_)是否确实存在? – Prebsus

+0

我认为有两件事情正在进行。我最初可能是在错误的地方。我将Un循环代码上方的For循环移动到了最后一行的内容控件处,并将ControlCount检查为一个。我刚刚在Set CC标记选择中的ControlCount上添加了一个“+1”,它像一个魅力一样工作。我还添加了“如果ControlCount> 1,那么”就在它通过标记选择CC之前,所以如果在没有行时点击按钮,它不会出错。谢谢你的帮助! – BradBerger