根据使用vba填充的新数据更新excel图

时间:2015-04-03 11:39:39

标签: excel vba excel-vba

Sub Macro1()
    Dim wb1 As Excel.Workbook
    Dim lastcolumn As Integer
    Dim EndColumnname As String
    Dim StartColumnname As String
    Set wb1 = ActiveWorkbook
    wb1.Sheets("Sheet1").Activate
    lastcolumn = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column
    EndColumnname = ConvertToLetter(lastcolumn)
    StartColumnname = ConvertToLetter(lastcolumn - 4)
    ActiveSheet.ChartObjects("Chart 6").Activate
   'ActiveChart.SetSourceData Source:=Range("A1,C1:H1,A3:A4,C3:H4")
    ActiveChart.SetSourceData Source:=Range("A1", StartColumnname & 1 & ":" & EndColumnname & 1, "A3:A4", StartColumnname & 3 & ":" & EndColumnname & 4)
End Sub

Function ConvertToLetter(iCol As Integer) As String
   Dim iAlpha As Integer
   Dim iRemainder As Integer
   iAlpha = Int(iCol / 27)
   iRemainder = iCol - (iAlpha * 26)
   If iAlpha > 0 Then
      ConvertToLetter = Chr(iAlpha + 64)
   End If
   If iRemainder > 0 Then
      ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
   End If
End Function

我收到了这一行的错误

ActiveChart.SetSourceData Source:=Range("A1", StartColumnname & 1 & ":" & EndColumnname & 1, "A3:A4", StartColumnname & 3 & ":" & EndColumnname & 4)

错误是 - 编译错误---错误否。分配的参数或无效属性

第3个参数 - 是系列标签 第二个参数 - x轴标签的日期范围 第四个参数 - 数据范围

当我像

那样硬编码时,它工作正常
ActiveChart.SetSourceData Source:=Range("A1,C1:H1,A3:A4,C3:H4")

我希望在“I”列中填充数据时,上面的行在代码的帮助下变为如下所示

ActiveChart.SetSourceData Source:=Range("A1,D1:I1,A3:A4,D3:I4") 

3 个答案:

答案 0 :(得分:1)

您可能希望借用R3uK的ConvertToLetter例程,但如果您愿意,可以将源数据设置为一行,您只需要修改格式&串联。

更改

ActiveChart.SetSourceData Source:=Range("A1", StartColumnname & 1 & ":" & _
  EndColumnname & 1, "A3:A4", StartColumnname & 3 & ":" & EndColumnname & 4)

ActiveChart.SetSourceData Source:=Range("A1," & StartColumnname & "1:" & _
  EndColumnname & "1, A3:A4," & StartColumnname & "3:" & EndColumnname & "4")

当他们需要进入内部时,您只是设法将自己与引用字符串的外部的位置混淆。例如,在原始行中,您有"A1",,其中引号外的逗号是参数分隔符,而不是范围之间的分隔符。

答案 1 :(得分:1)

你过度复杂的生活。我个人倾向于将我的数据加载到中并将图表部署到给定的表。当数据集扩展时,表格也会扩展,您的图表将自动刷新。可能不适用于您的情况(共享wb等),但对我而言,它通常可以解决问题。

答案 2 :(得分:0)

创建一个中间字符串更好,我用更高效的东西改变了你的ConvertToLetter(我以前也使用过相同的算法;)

试试这个:

Sub Macro1()
    Dim Wb1 As Excel.Workbook
    Dim Ws1 As Worksheet
    Dim LastColumn As Integer
    Dim EndColumnname As String
    Dim StartColumnname As String
    Dim RgSrc1 As String
    Dim RgSrc2 As String


    'Set wb1 = ActiveWorkbook
    Set Ws1 = ActiveWorkbook.Sheets("Sheet1")
    LastColumn = Ws1.Cells(1, Columns.Count).End(xlToLeft).Column

    EndColumnname = ConvertToLetter(LastColumn)
    StartColumnname = ConvertToLetter(LastColumn - 4)


   'ActiveChart.SetSourceData Source:=Range("A1,C1:H1,A3:A4,C3:H4")
    RgSrc1 = StartColumnname & 1 & ":" & EndColumnname & 1
    RgSrc2 = StartColumnname & 3 & ":" & EndColumnname & 4

    ActiveSheet.ChartObjects("Chart 6").SetSourceData Source:=Range("A1", RgSrc1, "A3:A4", RgSrc2)

    Set Wb1 = Nothing
    Set Ws1 = Nothing
End Sub

Public Function ConvertToLetter(iCol As Integer) As String
With ActiveSheet.Columns(iCol)
    ConvertToLetter = Left(.Address(False, False), InStr(.Address(False, False), ":") - 1)
End With
End Function