Word / Excel VBA:获取表中Word复选框的值和位置

时间:2019-12-06 17:56:36

标签: excel vba ms-word

我有一个大约10页和20个表格的Word文件。其中一些表具有复选框。我想将这些表复制到Excel文件中。

只是让您知道我像vba初学者。

但是以下代码足以将所有表从我的文字文件复制到我的Excel文件中:

Sub Import()
Option Explicit

Dim wb As Workbook
Dim sh As Worksheet
Dim sheet As Worksheet
Dim lzeile As Integer
Set wb = ActiveWorkbook
Set sh = wb.ActiveSheet
Set sheet = wb.Worksheets("Tabelle1")

Dim Btxt As Object
Set Btxt = CreateObject("Word.Application")

Btxt.Visible = True
Btxt.documents.Open "C:\Users\*.doc"          '*=path
lzeile = 0

For i = 1 To 20
    Btxt.ActiveDocument.Tables(i).Range.Copy

    Application.Goto sheet.Cells(1 + lzeile, 1)
    sheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False

    lzeile = sheet.Cells(Rows.Count, 1).End(xlUp).Row
    lzeile = lzeile + 1
    sheet.Cells(lzeile, 1) = "Tabelle" & i
Next i

Btxt.Quit
Set Btxt = Nothing
Set wb = Nothing
Set sh = Nothing

End Sub

复制复选框或复选框的值(0 =未选中/ 1 =已选中)。我可以使用以下代码行将复选框的值写入excel工作表中的单元格:

sheet.Cells(j, 10) = Btxt.ActiveDocument.Tables(i).FormFields.Item("Kontrollkästchen" & j).Result

使用循环j遍历所有“Kontrollkästchen”(contentcontrol或formfield项的德语翻译),因此基本上是该字文件中所有formfield项的名称。但是,如何获取这些表单字段项的位置或确定哪个表单字段/ ContentControl在哪个表中?

我尝试遍历每个表中的所有行和列,因为它们都不大于10x10。但是我找不到一种方法来检查复选框是否在表3的第5列第5行中,然后将该复选框的名称读取到一个安全的值,即excel单元格中相同位置的值(0/1)。我复制的表格。

我们将不胜感激!

2 个答案:

答案 0 :(得分:0)

解决方案取决于它们是表单域还是内容控件。

假设它们是表单域:

Sub Demo()
Dim i As Long, j As Long, Rng As Range
With ActiveDocument
  For i = .FormFields.Count To 1 Step -1
    With .FormFields(i)
      If .Type = wdFieldFormCheckBox Then
        j = Abs(.CheckBox.Value)
        Set Rng = .Range
        .Delete
        Rng.Text = j
      End If
    End With
  Next
End With
End Sub

假设它们是内容控件:

Sub Demo()
Dim i As Long, j As Long, Rng As Range
With ActiveDocument
  For i = .ContentControls.Count To 1 Step -1
    With .ContentControls(i)
      If .Type = wdContentControlCheckBox Then
        j = Abs(.Checked)
        Set Rng = .Range
        .Delete
        Rng.Text = j
      End If
    End With
  Next
End With
End Sub

答案 1 :(得分:0)

为简单明了起见,下面的示例代码省略了与Excel有关的部分以及创建Word应用程序的实例。它仅显示如何访问Word文档的复选框并将其转换为静态值。

最后,该文档也被关闭,不保存更改,这意味着要进行表单保护,并且复选框应保持不变-宏不会影响它们。

注意:您应该在代码页的顶部而不是“ Sub”中放置Option Explicit

工作方式

将打开要处理的文档,然后将其设置为对象(doc)。使用它代替ActiveDocument,因为它会更加清晰,并且在用户尝试执行某些操作的情况下,也不会影响宏的执行。

如果文档具有表单保护,则必须将其关闭以删除复选框并插入静态值。

然后将所有表单字段循环。如果它们是复选框,则将确定该值,将该复选框删除,并将该值分配给该复选框占用的范围。

完成此操作后,将代码传输到Excel。然后关闭文档而不保存更改。

Sub ConvertCheckBoxesToValues()
    Dim ff As Object    ' Word.FormField
    Dim doc As Object   ' Word.Document
    Dim cbValue As String
    Dim rngFF As Object ' Word.Range

    Set doc = Btxt.Documents.Open("C:\Users\*.doc")         '*=path
    If doc.ProtectionType <> -1 Then   'wdNoProtection
        doc.Unprotect
    End If

    For Each ff In doc.FormFields
        If ff.Type = 71 Then  'wdFieldFormCheckBox 
            If ff.CheckBox.value = True Then
                cbValue = "1"
            Else
                cbValue = "0"
            End If
            Set rngFF = ff.Range
            ff.Delete
            rngFF = cbValue
        End If
    Next

    'Transfer the information to Excel, then

    doc.Close 0  'wdDoNotSaveChanges
End Sub