2016-02-05 104 views
0

回答上个问题,为我提供了此循环的基础。在不同尺寸表中循环显示Excel VBA

VBA Excel - Loop through worksheet creating tables

不过,我遇到了一个问题,我可以与右下它的行没有数据的表头。在这种情况下,我只想制作一个只有标题的表格。

我试过这段代码 - 简单地将rngStart下面的行分配为oneDown。然后创建一个if /然后检查是否LEN(oneDown)> 0

`Dim ws As Worksheet 
Set ws = ActiveSheet 

With ws 

'find last row of data in column A 
Dim lRow As Long 
lRow = .Range("A" & .Rows.Count).End(xlUp).Row 
Dim rngStart As Range 
Set rngStart = .Range("A3") 

'set counter variable for naming tables 
Dim i As Long 
i = i + 1 
Dim oneDown As Long 
Set oneDown =rngStart.Offset(1) 

Do 

if Len(oneDown) > 0 Then 
    'create table range 
    Set rngTable = .Range(rngStart.End(xlToRight),rngStart.End(xlDown)) 
    'create table 
    .ListObjects.Add(xlSrcRange, rngTable.Resize(rngTable.Rows.Count, rngStart.End(xlToRight).Column), , xlYes).Name = "Table" & i 
    'set style 
    .ListObjects("Table" & i).TableStyle = "TableStyleLight9" 
    'find next table range start 
    Set rngStart = rngTable.End(xlDown).Offset(2) 
Else 
'create table range 
    Set rngTable = .Range(rngStart.End(xlToRight)) 
    'create table 
    .ListObjects.Add(xlSrcRange, rngTable.Resize(rngTable.Rows.Count, rngStart.End(xlToRight).Column), , xlYes).Name = "Table" & i 
    .ListObjects("Table" & i).TableStyle = "TableStyleLight9" 
    Set rngStart = rngTable.End(xlDown).Offset(2) 

End If 
    i = i + 1 

Loop Until rngStart.Row > lRow 

End With` 

我得到了相同的结果与我的数据,如果我没有足够的的if/then到位。

+0

尝试 设置oneDown = rngStart.Offset(1,1) – Siva

+0

@Silva感谢小费,但也没有工作。用我的if/then逻辑做一切正确吗? –

+0

@ScottHoltzman有什么想法? –

回答

1

我不得不改变你的代码的一部分,但这个曾与我测试了这样试一试:

Dim ws As Worksheet 
    Set ws = ActiveSheet 

    With ws 

    'find last row of data in column A 
    Dim lRow As Long 
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row 
    Dim rngStart As Range 
    Set rngStart = .Range("A3") 

    'set counter variable for naming tables 
    Dim i As Long 
    i = i + 1 

    Do 

Dim oneDown As String 
oneDown = rngStart.Offset(1) 

'Proceed to next cell if rngstart is empty 
If rngStart.Value = "" Then 
    Set rngStart = rngStart.Offset(1) 
ElseIf Len(oneDown) > 0 Then 
    'create table range 
    Set rngtable = .Range(rngStart.End(xlToRight), rngStart.End(xlDown)) 
    'create table 
    .ListObjects.Add(xlSrcRange, rngtable.Resize(rngtable.Rows.Count, rngStart.End(xlToRight).Column), , xlYes).Name = "Table" & i 
    'set style 
    .ListObjects("Table" & i).TableStyle = "TableStyleLight9" 
    'find next table range start 
    Set rngStart = rngtable.End(xlDown).Offset(1) 
    i = i + 1 
Else 
'create table range 
    Set rngtable = .Range(rngStart.End(xlToRight), rngStart) 
    'create table 
    .ListObjects.Add(xlSrcRange, rngtable.Resize(rngtable.Rows.Count, rngStart.End(xlToRight).Column), , xlYes).Name = "Table" & i 
    .ListObjects("Table" & i).TableStyle = "TableStyleLight9" 
    Set rngStart = rngtable.End(xlDown).Offset(1) 
    i = i + 1 
End If 


    Loop Until rngStart.Row > lRow 

    End With 
+0

尝试过并且不起作用 –

+0

我更新了答案并修改了一下代码。它在我测试它时起作用,所以试试看,如果您有任何问题,请告诉我。 – Jonathan

+0

它适用于除了期望的表头之间没有两个空格的情况。我已经尝试删除所有空白行,然后在列A中具有“CUSTOMER_”的每一行上方插入一行。现在,如果我可以修改rngStart以仅在这些行上启动,我将会成功。 –