ExcelVBA中的IF语句结合Chart函数

IF statement combined with Chart function in Excel VBA

我对 VBA 还是个新手,到目前为止,我已经通过一些在线帮助完成了我的任务,但是这对我来说太遥远了。

示例 sheet 此处:http://s000.tinyupload.com/index.php?file_id=50923272994978624314

我想要做的是 - 如果 A 列包含月份的任何最后日期(2015-01-31、2015-02-28、2015-03-31、2015-04-30 , 2015-05-31, 2015-06-30, 2015-07-31, 2015-08-31, 2015-09-30, 2015-10-31, 2015-11-30, 2015-12-31), select 这些日期列中的任何一个(select 具有这些值的单元格),select B 列中的相应单元格(例如,如果 A10 中有 2015-04-30 ,select B10 值)并使用这些 selected 值(水平轴上的日期,垂直轴上的金额)创建一个图表(简单的二维聚集列)。

想法是制作一个图表,显示每个月末的总金额(因为 B 列中的值是累积的)手工操作很简单 - 找到当月的最后一天并查看金额相应 B 列中的值,然后在 sheet 中重复该月的任何最后一天并创建图表。但我每天都会这样做,所以我试图将其自动化(通过宏)。

我绝对不会使用宏。相反,我会制作一列您要捕获的日期。然后,当您将值更新到 A 列时,您的图表会自动拾取它们,因此我认为宏在这里没用而公式是可行的方法。

所以让我们从制作那一列日期开始:

Date        MTD Revenue  2015
2015-03-09  € 2,855.270  2015-01-31
2015-03-10  € 3,534.550  2015-02-28
2015-03-11  € 3,791.760  2015-03-31
2015-03-12  € 4,024.680  2015-04-30
2015-03-15  € 4,182.020  2015-05-31
2015-03-16  € 4,317.610  2015-06-30
2015-03-17  € 4,439.900  2015-07-31
2015-03-18  € 4,585.070  2015-08-31
2015-03-19  € 4,798.900  2015-09-30
2015-03-20  € 4,903.830  2015-10-31
2015-03-21  € 4,959.710  2015-11-30
2015-03-23  € 5,203.690  2015-12-31
...         ...

如果您想让日期动态化,您甚至可以使用公式根据年份创建 "End of month dates"。这样您所要做的就是更新 header 列中的年份以更改所有日期:

C
------------------------------------------------------------
2015
=TEXT(DATE(C,1,DAY(EOMONTH(DATE(C1,1,1),0))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C2)+1,DAY(EOMONTH(C2,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C3)+1,DAY(EOMONTH(C3,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C4)+1,DAY(EOMONTH(C4,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C5)+1,DAY(EOMONTH(C5,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C6)+1,DAY(EOMONTH(C6,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C7)+1,DAY(EOMONTH(C7,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C8)+1,DAY(EOMONTH(C8,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C9)+1,DAY(EOMONTH(C9,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C10)+1,DAY(EOMONTH(C10,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C11)+1,DAY(EOMONTH(C11,1))),"yyyy-mm-dd")
=TEXT(DATE(C,MONTH(C12)+1,DAY(EOMONTH(C12,1))),"yyyy-mm-dd")

(注意:我将日期包装在 TEXT(..., "yyyy-mm-dd") 中,因为那是您的 A 列值。如果它们实际上是日期而不是文本,请删除它)

现在我们可以添加一个index-match公式来得到对应的值:

A           B           C           D
----------------------------------------------------------------
Date        MTD Revenue  2015        MTD Revenue
2015-03-09  € 2,855.270  2015-01-31  =INDEX(B:B,MATCH(C2,A:A,0))
2015-03-10  € 3,534.550  2015-02-28  =INDEX(B:B,MATCH(C3,A:A,0))
2015-03-11  € 3,791.760  2015-03-31  =INDEX(B:B,MATCH(C4,A:A,0))
2015-03-12  € 4,024.680  2015-04-30  =INDEX(B:B,MATCH(C5,A:A,0))
2015-03-15  € 4,182.020  2015-05-31  =INDEX(B:B,MATCH(C6,A:A,0))
2015-03-16  € 4,317.610  2015-06-30  =INDEX(B:B,MATCH(C7,A:A,0))
2015-03-17  € 4,439.900  2015-07-31  =INDEX(B:B,MATCH(C8,A:A,0))
2015-03-18  € 4,585.070  2015-08-31  =INDEX(B:B,MATCH(C9,A:A,0))
2015-03-19  € 4,798.900  2015-09-30  =INDEX(B:B,MATCH(C10,A:A,0))
2015-03-20  € 4,903.830  2015-10-31  =INDEX(B:B,MATCH(C11,A:A,0))
2015-03-21  € 4,959.710  2015-11-30  =INDEX(B:B,MATCH(C12,A:A,0))
2015-03-23  € 5,203.690  2015-12-31  =INDEX(B:B,MATCH(C13,A:A,0))
...         ...          

之后应该是这样的:

A           B            C           D
------------------------------------------------
Date        MTD Revenue  2015        MTD Revenue
2015-03-09  € 2,855.270  2015-01-31  #N/A
2015-03-10  € 3,534.550  2015-02-28  #N/A
2015-03-11  € 3,791.760  2015-03-31  6,541.27
2015-03-12  € 4,024.680  2015-04-30  6,327.07
2015-03-15  € 4,182.020  2015-05-31  #N/A
2015-03-16  € 4,317.610  2015-06-30  #N/A
2015-03-17  € 4,439.900  2015-07-31  #N/A
2015-03-18  € 4,585.070  2015-08-31  #N/A
2015-03-19  € 4,798.900  2015-09-30  #N/A
2015-03-20  € 4,903.830  2015-10-31  #N/A
2015-03-21  € 4,959.710  2015-11-30  #N/A
2015-03-23  € 5,203.690  2015-12-31  #N/A
...         ...

然后我们可以继续制作图表(2D 聚类列...根据要求):

最后说明:从技术上讲,由于您的数据是日期,因此在二维聚类列上使用折线图会更正确。

如果您想要 vba 解决方案,试试这个:

Sub Month_Chart()

Dim mydate As Date
Dim myRange, totrange As Range
   Set totrange = Range("A1:B1")
   'Select Dates based on selection
   For Each c In Selection
   'Build date
   mydate = DateSerial(Left(c, 4), Mid(c, 6, 2), Mid(c, 9, 2))
   'Check last day of month
   If Day(mydate + 1) = 1 Then
        'Create Range
        Set myRange = Range(c, c.Offset(0, 1))
       Set totrange = Union(totrange, myRange)
   End If

   Next c
  'Create Chart
    ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
    ActiveChart.SetSourceData Source:=totrange
End Sub