Excel VBA 报告建设

Excel VBA report building

我一直致力于在 MS Excel 中创建动态报告。我正在处理一个遗留的 VB6 应用程序,我遇到了一些问题,我希望你们能帮助我解决。我在下面做的是将数据抓取到我的记录集中 g_RS3 - 通常这有 3 到 20 个项目,我使用 g_RS3 输入值(标题,每个标题下有 2 列值: 客户、买家)到我的 excel 电子表格中。我正在尝试对其进行编辑,但我一直在努力解决它。这是我的代码....

Do While Not g_RS3.EOF
    With xlSheet.Cells(xlRow, xlCol)
        .Value = g_RS3("Label")
            .Offset(1, 0).Value = "Clients"
            .Offset(1, 1).Value = "Buyers"
                With .Offset(1, 0)
                    .Font.Bold = True
                .Borders.Weight = xlThin
            End With
            With .Offset(1, 1)
                .Font.Bold = True
                .Borders.Weight = xlThin
            End With
            With .Resize(1, 2)
                .Font.Bold = True
                .WrapText = True
                .VerticalAlignment = xlCenter
                .Merge
                .HorizontalAlignment = xlCenter
                .Borders.Weight = xlThin
            End With
    End With
    xlCol = xlCol + 2
    g_RS3.MoveNext
Loop

我附上了一张图片,展示了它的外观。在记录集的末尾,我试图添加另一个标题,它只是说 TOTAL 并且在它下面有 2 列。但我很难做到这一点。

我认为只要再添加一个 WITH 语句来在循环之后添加 TOTAL 单元格就可以了。基于循环的最后一部分 (xlCol = xlCol + 2),xlCol 应该已经指向下一列,所以我相信这应该有效。

Do While Not g_RS3.EOF
    With xlSheet.Cells(xlRow, xlCol)
        .Value = g_RS3("Label")
            .Offset(1, 0).Value = "Clients"
            .Offset(1, 1).Value = "Buyers"
                With .Offset(1, 0)
                    .Font.Bold = True
                .Borders.Weight = xlThin
            End With
            With .Offset(1, 1)
                .Font.Bold = True
                .Borders.Weight = xlThin
            End With
            With .Resize(1, 2)
                .Font.Bold = True
                .WrapText = True
                .VerticalAlignment = xlCenter
                .Merge
                .HorizontalAlignment = xlCenter
                .Borders.Weight = xlThin
            End With
    End With
    xlCol = xlCol + 2
    g_RS3.MoveNext
Loop

    With xlSheet.Cells(xlRow, xlCol)
        .Value = "TOTAL"
            .Offset(1, 0).Value = "Clients"
            .Offset(1, 1).Value = "Buyers"
                With .Offset(1, 0)
                    .Font.Bold = True
                .Borders.Weight = xlThin
            End With
            With .Offset(1, 1)
                .Font.Bold = True
                .Borders.Weight = xlThin
            End With
            With .Resize(1, 2)
                .Font.Bold = True
                .WrapText = True
                .VerticalAlignment = xlCenter
                .Merge
                .HorizontalAlignment = xlCenter
                .Borders.Weight = xlThin
            End With
    End With

在这种情况下,从主代码中提取 stand-alone 功能是有意义的:header 块格式可以进入单独的 Sub,因此您可以调用它来自记录集循环内或一组标题

然后主代码变成

'headers from recordset
Do While Not g_RS3.EOF
    DoBlock xlsheet.Cells(xlRow, xlCol), g_RS3("Label"), "Clients", "Buyers"
    g_RS3.MoveNext
    xlCol = xlCol + 2
Loop
'Extra header
DoBlock xlsheet.Cells(xlRow, xlCol), "Total", "Clients", "Buyers"

提取代码: 编辑 - 整理

Sub DoBlock(rng As Range, h1, h2, h3)
    With rng
        .Value = h1
        .WrapText = True
        .VerticalAlignment = xlCenter
        .HorizontalAlignment = xlCenter

        .Offset(1, 0).Value = h2
        .Offset(1, 1).Value = h3

        With .Resize(2, 2)
            .Font.Bold = True
            .Borders.Weight = xlThin
        End With
        .Resize(1, 2).Merge
    End With
End Sub