情况如下:
我正在使用SQL Server Reporting Service生成导出到Word 2010的报表。报表本身是一组嵌套表。我需要能够进入其中一个内部表并将一个文本框添加到表中的特定单元格。
我需要这样做,我可以做一个循环,循环遍历特定表中的所有行。该表可以有 n 行,并且需要在每个行中修改此单元格。因此问题是双重的。我需要能够索引到正确的表并获得指向特定单元格的指针,然后我需要修改单元格的内容以在其中具有单个文本框控件。我理解您使用形状集合来添加文本框本身,但我不知道如何获取对特定表格的特定单元格的引用,并找到与其关联的形状集合。
对此的任何帮助将不胜感激。
我正在使用此代码尝试迭代文档中的表,但没有" HasTable"财产,只有一个" HasChart"和#34; HasSmartArt"
Dim Shp As Shape
For Each Shp In ThisDocument.InlineShapes
If Shp.HasTable Then
MsgBox "Found Table"
End If
Next Shp
这段代码会添加一个文本框,但是我不知道如何让它出现在我正在使用的表的右栏中,这也没有给我一个索引所有行的方法在表格中添加文本框:
ActiveDocument.Shapes.AddTextbox _
Orientation:=msoTextOrientationHorizontal, _
Left:=lLeft,
Top:=6, _
Width:=72, _
Height:=12
我尝试了以下内容,它似乎没有帮助:
Dim tbl As Word.Table for Each tbl In ActiveDocument.Tables
tbl.Columns.Select If tbl.Tables.Count > 0 Then tbl.Tables(1).Select ActiveDocument.Shapes.AddTextbox Orientation:=msoTextOrientationHorizontal, _ Left:=tbl.Tables(1).Columns.Borders.DistanceFromLeft, _ Top:=tbl.Tables(1).Columns.Borders.DistanceFromTop, _ Width:=72, _ Height:=12 End If Next tbl
这将添加文本框,但它不会将其放在正确的单元格中。
XAML中的Visual Tree是一个分层数据结构,包含XAML页面的所有可视元素。您可以递归地查找特定节点,然后在找到后修改给定节点的内容。这就是我在这里要做的,但我没有看到那种结构
答案 0 :(得分:0)
通过此处的代码进行了大量修改:
http://www.msofficeforums.com/word-vba/11055-word-vba-add-textboxs-table-cells.html
试试这个,可能需要稍微调整以供特定用途,但这会相对于表格中的任何单元格添加一个文本框,并将其锚点设置为表格。
未经测试的修订版应查找多个占位符(在strText
变量中指定占位符文本),并在每个表中为每个占位符添加相应单元格的文本框。
Option Explicit
Sub AddTextBoxToTableCell()
Dim tbl As Table
Dim tblRow As Row
Dim t As Integer
Dim bkmark As String
Dim tblCell As Cell
Dim clTop As Long
Dim clLeft As Long
Dim tbWidth As Single
Dim tbHeight As Single
Dim strText as String
'## Specify dimensions of textbox:
tbWidth = 72
tbHeight = 10
'## Specify the placeholder text
strText = "[placeholder for textbox]"
'## Iterate the tables
For Each tbl In ActiveDocument.Tables
t = t + 1
'## Define the cell we want to use (modify as needed)
For r = 1 to tbl.Rows.Count
For c = 1 to tbl.Columns.Count
If tbl.Cell(r,c).Range.Text = strText then
'## Construct a string to use as a Bookmark
bkmark = "table_" & t & "_Row" & r & "_Col" & c
Set tblCell = tbl.Cell(r, c)
'## Get the position of the cell
clLeft = GetCellAbsoluteLeft(tblCell)
clTop = tblCell.Range.Information(wdVerticalPositionRelativeToPage)
'## Add a bookmark if it does not already exist
If ActiveDocument.Bookmarks.Exists(bkmark) Then
ActiveDocument.Bookmarks(bkmark).Delete
End If
'## Add/Update the bookmark location
ActiveDocument.Bookmarks.Add "table_" & t, tblCell.Range
'## Add a textbox to your table:
ActiveDocument.Shapes.AddTextbox msoTextOrientationHorizontal, _
clLeft, clTop, tbWidth, tbHeight, _
Anchor:=ActiveDocument.Bookmarks(bkmark).Range
End If
Next
Next
Next
End Sub
Function GetCellAbsoluteLeft(cl As Cell) As Long
'## Custom function to return the absolute left position in points, of a table cell
Dim col As Integer
Dim c As Integer
Dim ret As Long
ret = cl.Range.Information(wdHorizontalPositionRelativeToPage)
col = cl.Range.Information(wdStartOfRangeColumnNumber)
c = 1
'## Add up the column widths with the position wdHorizontalPositionRelativeToPage
Do
ret = ret + cl.Row.Cells(c).Width
c = c + 1
Loop While Not c >= col
'## Return the value:
GetCellAbsoluteLeft = ret
End Function