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
我对 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