VBA 根据唯一的列数据创建新的 WB 并将新的 WB 范围转换为表格
VBA Creating New WB based on unique Column data and converting new WB ranges to Tables
我过去发布了一个与此类似的问题,但出现了一个不同的问题。
在这里找到。
现有代码的工作原理:它为 A 列中的每个唯一值及其重复值创建一个新工作簿,其中包含所有关联的行数据。
除了当我尝试在 table 范围内使用它时,该代码非常适合我需要它做的事情。经过一些研究后,我意识到我所有的参考资料都不正确,无法在 table 上执行此操作。我正在研究如何做到这一点以长期解决我的问题。
作为短期替代方案,我一直在研究如何将每个新工作簿范围转换为 table,但无法弄清楚如何将其插入我现有的代码中。下面的示例是我想象它应该去的地方,但是在查看我在研究中遇到的其他示例时,我无法理解如何添加命令。
For Each ky In dic.keys
ThisWorkbook.Sheets("DEMURRAGE INSTRUCTIONS").Copy
Set wbN = ActiveWorkbook
xSht.Range(xTitle).AutoFilter xCName, ky
Set xNSht = Worksheets.Add(, wbN.Sheets(wbN.Sheets.Count))
xSht.AutoFilter.Range.EntireRow.Copy xNSht.Range("A1")
xNSht.Name = xNSht.Range("T2").Value
ActiveWindow.DisplayGridlines = False
xNSht.Columns.AutoFit
如果您有一个从 A1 开始的 headers 的连续范围,那么这应该可以将其转换为 ListObject/Table:
With xNSht.ListObjects.Add(xlSrcRange, xNSht.Range("A1").CurrentRegion, , xlYes)
.Name = "Table1"
End with
将范围转换为 Table (ListObject)
- 这将为工作表和 table 使用相同的名称。
- 如果您需要复制整行,它将不起作用。
For Each ky In dic.keys
ThisWorkbook.Sheets("DEMURRAGE INSTRUCTIONS").Copy
Set wbN = ActiveWorkbook
xSht.Range(xTitle).AutoFilter xCName, ky
' You have just copied a single worksheet to wbN hence:
Set xNSht = Worksheets.Add(After:=wbN.Sheets(1))
' Why entire row? No need, unless there is data to the right!?
With xSht.AutoFilter.Range
.Copy xNSht.Range("A1")
With xNSht.ListObjects.Add(xlSrcRange, _
xNSht.Range("A1").Resize(.Rows.Count, .Columns.Count), , xlYes)
.Name = xNSht.Range("T2").Value ' or some other table name?
End With
End With
xNSht.Name = xNSht.Range("T2").Value
ActiveWindow.DisplayGridlines = False
xNSht.Columns.AutoFit
我过去发布了一个与此类似的问题,但出现了一个不同的问题。
现有代码的工作原理:它为 A 列中的每个唯一值及其重复值创建一个新工作簿,其中包含所有关联的行数据。
除了当我尝试在 table 范围内使用它时,该代码非常适合我需要它做的事情。经过一些研究后,我意识到我所有的参考资料都不正确,无法在 table 上执行此操作。我正在研究如何做到这一点以长期解决我的问题。
作为短期替代方案,我一直在研究如何将每个新工作簿范围转换为 table,但无法弄清楚如何将其插入我现有的代码中。下面的示例是我想象它应该去的地方,但是在查看我在研究中遇到的其他示例时,我无法理解如何添加命令。
For Each ky In dic.keys
ThisWorkbook.Sheets("DEMURRAGE INSTRUCTIONS").Copy
Set wbN = ActiveWorkbook
xSht.Range(xTitle).AutoFilter xCName, ky
Set xNSht = Worksheets.Add(, wbN.Sheets(wbN.Sheets.Count))
xSht.AutoFilter.Range.EntireRow.Copy xNSht.Range("A1")
xNSht.Name = xNSht.Range("T2").Value
ActiveWindow.DisplayGridlines = False
xNSht.Columns.AutoFit
如果您有一个从 A1 开始的 headers 的连续范围,那么这应该可以将其转换为 ListObject/Table:
With xNSht.ListObjects.Add(xlSrcRange, xNSht.Range("A1").CurrentRegion, , xlYes)
.Name = "Table1"
End with
将范围转换为 Table (ListObject)
- 这将为工作表和 table 使用相同的名称。
- 如果您需要复制整行,它将不起作用。
For Each ky In dic.keys
ThisWorkbook.Sheets("DEMURRAGE INSTRUCTIONS").Copy
Set wbN = ActiveWorkbook
xSht.Range(xTitle).AutoFilter xCName, ky
' You have just copied a single worksheet to wbN hence:
Set xNSht = Worksheets.Add(After:=wbN.Sheets(1))
' Why entire row? No need, unless there is data to the right!?
With xSht.AutoFilter.Range
.Copy xNSht.Range("A1")
With xNSht.ListObjects.Add(xlSrcRange, _
xNSht.Range("A1").Resize(.Rows.Count, .Columns.Count), , xlYes)
.Name = xNSht.Range("T2").Value ' or some other table name?
End With
End With
xNSht.Name = xNSht.Range("T2").Value
ActiveWindow.DisplayGridlines = False
xNSht.Columns.AutoFit