これをコード化する方法を理解しようとするといくつか問題があります。私は5列(数量、部品番号、説明、金額、合計)の部品表を持っています。コマンドボタンをクリックすると、新しい行が追加されます。新しく追加された各セルには、新しい行が追加されるたびに名前と番号が1ずつ増加するタグ付きテキストコンテンツコントロールが含まれています。たとえば、Qty3、Qty4、Qty5などです。Amount列と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
返信いただきありがとうございます。私はあなたのコードを挿入し、この実行時エラーが発生しています:コレクションの要求されたメンバーが存在しません。 Set CCコマンドが強調表示されています。私はそれを間違った場所に挿入したのだろうか? – BradBerger
どこのコードにForループを挿入しましたか(返信にコードの最初の部分)? エラーが発生したら、_Immediate_ウィンドウ(Ctrl + Gキーを押して)に移動し、「?ControlCount」と入力します。 実際にそのコントロール(_Total_)が存在するかどうかを確認できますか? – Prebsus
私は考えていることが2つありました。私はおそらく間違った場所にそれを持っていた。 Unprotectコードの上にあるForループを移動し、最後の行のコンテンツコントロールより1つ少ないところでControlCountをチェックしました。私はちょうど "CC"タグ選択のControlCountに "+1"を追加し、それは魅力的に機能しました。私はまた、 "ControlCount> 1ならば"というタグをCCでタグを選択する直前に追加したので、行がないときにボタンがクリックされると、エラーは発生しません。あなたの助けてくれてありがとう! – BradBerger