2016-02-24 169 views
0

我在使用VB6构建报告时遇到了一些问题。基本上,我正在构建一个动态报告,其中标题和2列(客户端,学生)从记录集中填充。正如您在图片中看到的,在我的标题末尾,我添加了一个TOTAL标题,下面有客户和学生。我试图让每个专栏中的所有客户总数达到TOTAL,与学生一样。列数(UCLA,SDU,SCCU)可能会有所不同,所以我试图让它变成动态的。基本上从A开始,然后是B,然后是C,D和NONE。有任何想法吗? enter image description here 编辑:我请从SQL SERVER的SHORT LABEL和填充直到g_RS3是空Excel报告 - 公式VBA

Do While Not g_RS3.EOF 
    With xlSheet.Cells(xlRow, xlCol) 
     .Value = g_RS3("ShortLabel") 
      .Offset(1, 0).Value = " Clients " 
      .Offset(1, 1).Value = " Students" 
       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 = "Students" 
      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 

然后我开始xlrow = 4 xlcol = 2和填充数据在客户端和STUDENT列。我拥有的循环相当长。但用户只会查看摘录。一旦它的产生取决于他们,他们用它做什么。该应用程序为他们提供了添加SHORTLABEL的选项,一旦它们生成,SHORTLABEL需要在提取中显示。

+0

哪一个VBA或VB6? – 0m3r

+0

[SUMIFS函数](https://support.office.com/en-us/article/SUMIFS-function-C9E748F5-7EA7-455D-9406-611CEBCE642B)将执行此操作;例如'= sumifs($ b4:$ g4,$ b $ 3:$ g $ 3,$ h $ 3)''。如果必须在VBA中执行计算或[Range.Formula属性](https:/ /),请使用[WorksheetFunction对象](https://msdn.microsoft.com/en-us/library/office/ff834434.aspx) /msdn.microsoft.com/en-us/library/office/ff838835.aspx)如果你想保留公式。 – Jeeped

+1

顺便说一句,你将不得不决定是否使用'CLIENT'或'CLIENTS'。不应该有一个标准的多个版本。 – Jeeped

回答

2

SUMIF functionSUMIFS function可以方便地执行此操作。

在H4作为标准公式,

=sumifs($b4:$g4, $b$3:$g$3, h$3) 

填写两个向右和向下。

在VBA作为,

with worksheets("Sheet1") 
    .range("H4:I8").formula = "=sumifs($b4:$g4, $b$3:$g$3, h$3)" 
    'optional revert to values only 
    '.range("H4:I8") = .range("H4:I8").values 
end with 

您必须确定客户端/学生的程度范围,但有一半做法仅仅是知道放在哪里公式(例如H4)。

VBA

我已经删除了很多所使用的原代码的冗余。考虑到您尚未将数据填充到客户端/学生列中,我使用了一种方法,其中Total列(s)总是写入右侧的公式。如果还有另外一组行,那么总计将被覆盖,并在右侧创建一个新行。

Dim xlStartCol As Long 
xlStartCol = xlCol 
Do While Not g_RS3.EOF 
    With xlSheet.Cells(xlRow, xlCol) 
     .Resize(1, 2).Merge 
     .Value = "TEST" 'g_RS3("ShortLabel") 
     .Offset(1, 0).Resize(1, 2) = Array("Clients", "Students") 
     .Offset(2, 0).Resize(1, 2).ClearContents 
     With .Offset(0, 1) 
      .Resize(1, 2).Merge 
      .Value = "Total" 'keep writing Total to the right; it will be overwritten if there is another ShortLabel 
      .Offset(1, 0).Resize(1, 2) = Array("Clients", "Students") 
      .Offset(2, 0).Resize(1, 2).Formula = _ 
       "=SUMIFS(" & Range(.Parent.Cells(xlRow + 2, xlStartCol), .Parent.Cells(xlRow + 2, xlCol + 1)).Address(0, 1) & Chr(44) & _ 
          Range(.Parent.Cells(xlRow + 1, xlStartCol), .Parent.Cells(xlRow + 1, xlCol + 1)).Address(1, 1) & Chr(44) & _ 
          .Parent.Cells(xlRow + 1, xlCol - 1).Address(1, 0) & Chr(41) 
     End With 
     With .Resize(2, 4) 
      .Font.Bold = True 
      .VerticalAlignment = xlCenter 
      .HorizontalAlignment = xlCenter 
      .Borders.Weight = xlThin 
     End With 
    End With 
    xlCol = xlCol + 2 
    g_RS3.MoveNext 
Loop 

一旦实际填充数据到每对列和了解程度,只需使用Range.FillDown method来填充剩下的公式。

xlCol

我会建议删除不相关的记录代码部分。记录的代码非常冗长,妨碍了可读性。您可能还想查看在T-SQL中创建查询的For XML方法。这将扩展返回的列,并允许您使用字段计数来确定范围。

+0

我必须从3列中取得客户数,并将其置于TOTAL的客户端,与学生相同。让我这样做。此外,我需要使这种动态,基本上如果用户添加另一个HEADING,这个Excel提取将自动添加它,所以我不能指定哪一列开始。我只能确定TOTAL中的ROW总是与报告格式相同。 COLUMN将取决于有多少HEADINGS。 – FatBoySlim7

+0

回复:*'让我做临时工*' - 你甚至在问之前试过吗?至于动态扩展a)它将取决于用户如何放置新列,b)您应该更担心它结束的位置,而不是它开始的位置。在我看来,它始终始于B列。c)我认为数据来自记录集,而不是来自用户随意添加新列的任何地方。 – Jeeped

+0

我一直在玩它。用户将其输入到应用程序中。它被保存在SQL SERVER中。我从那里选择数据并在Excel中创建提取。摘录仅用于查看目的(供用户使用)。它始终在同一地方开始,结尾栏是问题,因为它可能会有所不同。我编辑了这个问题,告诉你我是如何做到的。 – FatBoySlim7