我在自动生成的Word文档中有很多大表,并且我想删除其中没有值的列。它们都将具有标头,因此从本质上讲,我需要检查第2行到末尾的值,或者仅将整个列获取为字符串,然后在我认为是列标记的第一个chr(14)之后进行检查。
是否可以这样,而不会逐行循环显示单元格(这似乎很慢),或者选择似乎导致屏幕出现问题且UI冻结的列,有时会导致Word崩溃。
答案 0 :(得分:1)
您想做的事完全有可能,但是会遇到问题。根据您是否使用
,报告的选择范围内的单元格数量有所不同(因此要处理的文本也有所不同)selection.range.cells
或
Sub DeleteEmptyTableColumns(this_table As Word.Table)
Dim my_cells As Range
Dim my_column As Long
Dim my_text As String
Dim my_last_row As Long
' Assumes that the Table is uniform
my_last_row = this_table.Rows.Count
Application.ScreenUpdating = False
With this_table
For my_column = .Columns.Count To 1 Step -1
DoEvents
Set my_cells = .Range.Document.Range( _
Start:=.Cell(2, my_column).Range.Start, _
End:=.Cell(my_last_row, my_column).Range.End)
' We have to use selection to get the correct text
my_cells.Select
Debug.Print
' Wrong numbers and text
Debug.Print my_cells.Cells.Count
Debug.Print my_cells.Text
' Correct information
Debug.Print Selection.Cells.Count
Debug.Print Selection.Text
' Back to the wrong information
Debug.Print Selection.Range.Cells.Count
Debug.Print Selection.Range.Text
my_text = Selection.Text
' Add other replacments as required.
my_text = Replace(my_text, " ", vbNullString)
my_text = Replace(my_text, vbCrLf, vbNullString)
my_text = Replace(my_text, Chr$(13), vbNullString)
my_text = Replace(my_text, Chr$(7), vbNullString)
If Len(my_text) = 0 Then
this_table.Columns(my_column).Delete
End If
Next
End With
Application.ScreenUpdating = True
End Sub
前者按预期工作,而后者则无法工作。
下面的代码以您描述的方式删除列,并且还包括debug.print语句以演示该问题。
我已经在5x6的表格上测试了代码。您的经验可能有所不同。
{{1}}