Excel vba Charting, редактирование ассортимента - PullRequest
1 голос
/ 14 марта 2012
Sub StoragevsQuota()
    Charts.Add
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SetSourceData Source:=Sheets("Data").Range("E1:G32")
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Storage Charts"
    ActiveChart.Parent.Name = "Used Space vs Disk Quota"
    ActiveChart.SetElement (msoElementChartTitleCenteredOverlay)
    ActiveChart.ChartTitle.Text = "Used Space vs Disk Quota"
End Sub

в Excel VBA это дает мне график при нажатии кнопки из диапазона E1:G32. Но это статический диапазон

Я хочу сохранить примерно такой же синтаксис, но чтобы он проходил по столбцу E, например, до самого конца, пока не осталось больше данных, поэтому было бы 32, а затем расширить этот диапазон до G32

это длина столбцов, которая может варьироваться для графиков, которые я буду производить, не столько столбцов, кто-нибудь может мне помочь настроить его так, чтобы, как я сказал выше, считывал столбец до тех пор, пока не введены данные, а затем не расширил диапазон в случай выше по 3 столбцам?

Спасибо, Z

Продолжение

Sub WeeklySuccessOrFailure() 
'On Error Resume Next
Dim lastRow As Long
With Sheets("Data")
lastRow = .range("AA" & Rows.Count).End(xlUp).Row
Charts.Add
ActiveChart.SetSourceData Source:=Sheets("Data").range("AA1:AA & lastRow, AD1:&      lastRow, AE1:AE & lastRow")
ActiveChart.ChartType = xlColumnClustered
ActiveChart.Location Where:=xlLocationAsObject, Name:="Job Charts"
ActiveChart.Parent.Name = "Total Weekly Success or Failure"
ActiveChart.SetElement (msoElementChartTitleCenteredOverlay)
ActiveChart.ChartTitle.Text = "Total Weekly Success Or Failure Of Jobs"
End With
End Sub

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Это то, что вы пытаетесь? ( UNTESTED )

Sub StoragevsQuota()
    Dim lastRow As Long

    With Sheets("Data")
        lastRow = .Range("G" & Rows.Count).End(xlup).Row

        Charts.Add
        ActiveChart.ChartType = xlColumnClustered
        ActiveChart.SetSourceData Source:=.Range("E1:G" & lastRow)
        ActiveChart.Location Where:=xlLocationAsObject, Name:="Storage Charts"
        ActiveChart.Parent.Name = "Used Space vs Disk Quota"
        ActiveChart.SetElement (msoElementChartTitleCenteredOverlay)
        ActiveChart.ChartTitle.Text = "Used Space vs Disk Quota"
    End With
End Sub

Followup

@ siddarth, просто чтобы привлечь ваше внимание любым шансом, что вы можете помочь мне с проблемой, которую я разместил под комментарием ниже, где прокомментировал boschiero, спасибо.

Это то, что вы пытаетесь? ( СНОВА НЕПРОВЕРЕНО )

ActiveChart.SetSourceData Source:=Sheets("Data").Range("AA1:AA" & lastRow & _
",AD1:AD" & lastRow & ",AE1:AE" & lastRow)
1 голос
/ 14 марта 2012

Лично я предпочитаю, чтобы начальная и конечная ячейки моих диапазонов были динамическими, поэтому мой код будет выглядеть примерно так:

ActiveChart.SetSourceData Source:=.Range(.cells(1,5),.cells(7,lastRow))

Но на самом деле только потому, что я предпочитаю обозначение ячейки для определения диапазонов. Ответ Сиддхарта в значительной степени точен.

Для нескольких несмежных диапазонов я бы создал переменную Range, а затем использовал бы Union, чтобы назначить ему любые диапазоны.

Итак, скажем, я хотел столбцы AA, AD и AE, как в примере с Сиддхартом, я бы сделал следующее:

Sub WeeklySuccessOrFailure() 
'On Error Resume Next
Dim lastRow As Long
Dim myRange as Range
With Sheets("Data")
lastRow = .range("AA" & Rows.Count).End(xlUp).Row
Charts.Add
Set myRange = Union(.range(.cells(1,27),cells(lastRow,27)),_
.range(.cells(1,30),.cells(lastRow,30)),_
.range(.cells(1,31),.cells(lastRow,31)))
ActiveChart.SetSourceData Source:= myRange
ActiveChart.ChartType = xlColumnClustered
ActiveChart.Location Where:=xlLocationAsObject, Name:="Job Charts"
ActiveChart.Parent.Name = "Total Weekly Success or Failure"
ActiveChart.SetElement (msoElementChartTitleCenteredOverlay)
ActiveChart.ChartTitle.Text = "Total Weekly Success Or Failure Of Jobs"
End With
End Sub

Я не тестировал приведенный выше код, но ранее использовал метод myRange и Union.

Я бы сказал, что это несколько глупее, чем предложение Сиддхарта, но я считаю, что его проще использовать для целей автоматизации. Если вы никогда не собираетесь автоматизировать ту часть вашего макроса, которая находит столбцы для построения графика, т. Е. Всегда будут одни и те же столбцы, то метод Сиддхарта проще и, вероятно, более интуитивен.

0 голосов
/ 03 декабря 2014

Если данные представляют собой красивый прямоугольник, окруженный пустыми строками и столбцами, вы можете сделать это очень просто. Выберите ячейку в диапазоне данных, затем запустите код, который найдет всю область данных, содержащую активную ячейку:

Sub MakeChartFromIndicatedRange1()
  Dim rng As Range
  Set rng = ActiveCell.CurrentRegion
  Charts.Add
  ActiveChart.SetSourceData Source:=rng
  ' etc.
End Sub

Или, если пользователь собирается выбрать весь диапазон, этот код использует выбранную область:

Sub MakeChartFromIndicatedRange2()
  Dim rng As Range
  Set rng = Selection
  Charts.Add
  ActiveChart.SetSourceData Source:=rng
  ' etc.
End Sub

Или полностью имитировать встроенный в Excel определитель диапазона, который использует выбранный диапазон, если в нем более одной ячейки, или весь регион, в котором находится активная ячейка, если выбрана только одна ячейка .:

Sub MakeChartFromIndicatedRange()
  Dim rng As Range
  If Selection.Cells.Count = 1 Then
    Set rng = ActiveCell.CurrentRegion
  Else
    Set rng = Selection
  End If
  Charts.Add
  ActiveChart.SetSourceData Source:=rng
  ' etc.
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...