我有一个问题,过去几天一直困扰着我。
我有一个包含100个表的工作表,以及一个代码,可以在运行时将更多数据插入到该工作表中。
我们的想法是将添加的数据转换为表格。但是我遇到了一些问题。
我将尝试解释我当前的方法,我有一个for循环,可以使用.find
方法基于{{轻松选择每个当前表中的数据和已添加的新数据1}}奇数或偶数。然后我运行了spearsheet(因为所有数据都在同一列中。)此时我遇到了一个麻烦的世界。
首先,我尝试选择应该是表格的数据范围(有时是,其他情况不是)并转换为表格。这没有用,因为我发现你无法强迫桌子再次成为同一张桌子。
其次,我尝试使用i
来解决这个问题。我试图将范围取消列为表格,然后如果出现错误,即范围不是表格,则转到使范围成为表格的部分,如果选择范围是表格,则从范围中删除表格并将范围重新格式化为表格。
此时我的想法不合时宜。下面是我第二次尝试的代码。
On Errors
我试图尽可能地评论代码,并让您了解我的思维过程。我希望有更简单的方法可以做到这一点,但不是我能想到的。
感谢您提供的任何帮助
答案 0 :(得分:0)
这是ws.Range(" A1:C8")是一个表(包括标题的整个表)的示例。如果table else False
,则使用函数返回TrueOption Explicit
Sub test()
Dim wb As Workbook
Dim ws As Worksheet
Dim testRange As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
Set testRange = ws.Range("A1:C8")
If IsTable(testRange, ws) Then
Debug.Print "Table"
Else
End If
End Sub
Public Function IsTable(ByVal testRange As Range, ByVal ws As Worksheet) As Boolean
Dim table As ListObject
Dim tableAddresses() As String
ReDim tableAddresses(ws.ListObjects.Count)
Dim counter As Long
For Each table In ws.ListObjects
tableAddresses(counter) = table.Range.Address 'or databody range depending on your requirements
counter = counter + 1
Next table
Dim i As Long
For i = LBound(tableAddresses) To UBound(tableAddresses)
If testRange.Address = tableAddresses(i) Then
IsTable = True
Exit Function
End If
Next i
End Function
答案 1 :(得分:0)
可以使用以下两个选项中的任何一个将新数据添加到ListObject
:
在ListObject
的最后一行之后的下一行中发布新数据。 ListObject
会自动调整大小以包含新行。
调整Range
的{{1}}大小以包含新行。请注意,在调整ListObject
的大小时,ListObject
必须保留在同一行中。
要验证Header
中Cell
中的任何Range
是否属于ListObject
,请使用该范围的ListObject
属性:
设置lo = rg.ListObject
我还建议声明变量和对象的使用,所以这样的行:ActiveSheet.ListOnjects.Items(1).Unlist
将写成:ws.ListOnjects.Items(1).Unlist
。然后,在编译或运行过程时,将突出显示拼写错误,前提是您有机会进行更正,例如:ws.ListObjects(1).Unlist
。要强制声明变量和语法检查,请参见图。下方。
关于Style
的{{1}},您可以使用此行默认设置ListObject
:
workbook
或在添加 wb.DefaultTableStyle = "TableStyleLight15" 'where wb is the workbook object
时可以设置,如:
ListObject
尝试此程序:
ws.ListObjects.Add(xlSrcRange, rg, , xlYes, , "TableStyleLight15")