我有一个大约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)。我复制的表格。
我们将不胜感激!
答案 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