2017-08-10 20 views
0

Ich habe ein paar Probleme zu versuchen, herauszufinden, wie dies zu kodieren. Ich habe eine Teile-Tabelle mit 5 Spalten (Anzahl, Teilenummer, Beschreibung, Betrag und Gesamt). Wenn auf eine Befehlsschaltfläche geklickt wird, wird eine neue Zeile hinzugefügt. Jede neu hinzugefügte Zelle enthält ein Textinhalt-Steuerelement, das mit einem Namen und einer Nummer versehen ist, die bei jeder neuen Zeile um 1 erhöht werden. Zum Beispiel Qty3, Qty4, Qty5 usw. Die Spalten "Amount" und "Total" machen dasselbe. Ich habe die Kontrollen für den gesamten Inhalt gesperrt.Word VBA löschen Zeilen aus der Tabelle

Ich habe herausgefunden, dass die Inhaltskontrolle "Total" entsperrt werden muss, bevor die Zeile gelöscht werden kann. Jetzt wählt der Code das Inhaltssteuerelement "Total3" aus und löscht die Zeile erfolgreich, weil sie zuletzt in der Tabelle ist. Der Teil, den ich nicht herausfinden kann, ist, wie man den Code identifizieren kann, welcher "Total #" Inhaltskontrolle zuletzt in der Tabelle ist. Ich hoffe, das macht Sinn und ich kann alles klären, wenn es sein muss. Danke im Voraus!

'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 

Antwort

0

Ich würde vorschlagen, die Anzahl der Inhaltssteuerelementen mit einem Tag wie Total * zählen, in Ihrem CommandButton11_Click() Unter, das heißt:

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 

diese Weise werden Sie wissen, wie viele Gesamt Kontrollen Sie haben, und Sie können mit

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

Statt Ihr die letzte Referenz:

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

Danke für die Antwort. Ich habe Ihren Code eingefügt und erhalte diesen Laufzeitfehler: Das angeforderte Mitglied der Sammlung existiert nicht. Der Befehl CC setzen wird markiert. Ich frage mich, ob ich es an der falschen Stelle eingefügt habe? – BradBerger

+0

Wo in Ihrem Code haben Sie die For-Schleife (erster Teil des Codes in meiner Antwort) eingefügt? Wenn Sie den Fehler erhalten, gehen Sie zum _Immediate_ Fenster (drücken Sie Strg + G), und geben Sie dann: '? ControlCount' Können Sie überprüfen, ob das Steuerelement (_Total_) tatsächlich existiert? – Prebsus

+0

Es gab zwei Dinge, denke ich. Ich hatte es wahrscheinlich ursprünglich an der falschen Stelle. Ich habe die For-Schleife über den Unprotect-Code verschoben und den ControlCount um eins weniger als das Inhaltssteuerelement in der letzten Zeile überprüft. Ich habe gerade einen "+1" zum ControlCount in der Set CC-Tag-Auswahl hinzugefügt und es funktionierte wie ein Zauber. Ich habe auch "If ControlCount> 1 then" hinzugefügt, kurz bevor das CC by-Tag ausgewählt wurde. Wenn also auf die Schaltfläche geklickt wird, wenn keine Zeilen vorhanden sind, wird kein Fehler angezeigt. Vielen Dank für Ihre Hilfe! – BradBerger

Verwandte Themen