2013-11-20 6 views
0

Я пытаюсь создать диаграмму в Excel VBA, и у меня возникают проблемы с тем, чтобы X-Axis отображал даты правильно; код ниже:Установка дат по оси X

Function CreateChart() 
Dim objChart As Chart 

ReDim detached_price(detachedProps.count - 1) As Double 
ReDim detached_date(detachedProps.count - 1) As Date 

ReDim semi_price(semiProps.count - 1) As Double 
ReDim semi_date(semiProps.count - 1) As Date 

Dim minDate As Date 
Dim maxDate As Date 
minDate = Date 

Dim detachedCount As Integer 
detachedCount = 0 
Dim semiCount As Integer 
semiCount = 0 

Set objChart = Charts.Add 
With objChart 
    .HasTitle = True 
    .ChartTitle.Characters.Text = "Price Paid" 
    .ChartType = xlXYScatter 
    .Location xlLocationAsNewSheet 
    .Axes(xlCategory, xlPrimary).HasTitle = True 
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Date" 
    .Axes(xlCategory, xlPrimary).CategoryType = xlTimeScale 
    .Axes(xlCategory, xlPrimary).TickLabels.NumberFormat = "yyyy" 
    .Axes(xlCategory, xlPrimary).MinimumScaleIsAuto = True 
    .Axes(xlCategory, xlPrimary).MaximumScaleIsAuto = True 

    For Each prop In properties 
     Select Case prop.PropertyType 
      Case "Detached" 
       detached_price(detachedCount) = prop.Amount 
       detached_date(detachedCount) = prop.SellDate 
       detachedCount = detachedCount + 1 
      Case "Semi-detached" 
       semi_price(semiCount) = prop.Amount 
       semi_date(semiCount) = prop.SellDate 
       semiCount = semiCount + 1 
     End Select 

     If prop.SellDate < minDate Then 
      minDate = prop.SellDate 
     End If 

     If prop.SellDate > maxDate Then 
      maxDate = prop.SellDate 
     End If 
    Next 

    .SeriesCollection.NewSeries 

    .SeriesCollection(DETACHED).Name = "Detached" 
    .SeriesCollection(DETACHED).Values = detached_price 
    .SeriesCollection(DETACHED).XValues = detached_date 

    .SeriesCollection.NewSeries 
    .SeriesCollection(SEMI).Name = "Semi-Detached" 
    .SeriesCollection(SEMI).Values = semi_price 
    .SeriesCollection(SEMI).XValues = semi_date 
End With End Function 

Свойства переменной в цикле For..Each заполняется, и заполняет массивы правильно.

Однако, несмотря на то, что точки данных Scatter Graph показаны, даты на осях все показывают 1900.

Я попытался добавить следующие строки:

.Axes(xlCategory, xlPrimary).MinimumScale = CDbl(minDate) 
    .Axes(xlCategory, xlPrimary).MaximumScale = CDbl(maxDate) 

Который показал правильные года вдоль оси, но теперь все точки данных для обеих серий исчезли.

Я пробовал еще несколько вещей, но это было чисто на основе проб и ошибок.

Данные следующего

The data is as follows:

Полученные диаграммы:

Правильные даты, нет точек данных

Correct dates, no data points

Неправильных дат, но у нас есть точки данных

Incorrect dates, but we have data points

+0

Вы говорите, что свойства заполнены правильно, но даты не отображаются неправильно на оси? Таким образом, свойство на самом деле имеет правильную дату, но дата отображается по-разному при построении графика? Можете ли вы включить распечатку массива? – chiliNUT

+0

@chilliNut, вот о чем это связано :) Я включил некоторые скриншоты, чтобы уточнить, что я имею в виду, а также необработанные данные, которые находятся в переменной свойств. –

+0

Ах. Я предполагаю, что из-за того, что вы используете нестандартный формат даты (dd-mm-yyyy) вместо более общего (mm-dd-yyyy) excel задыхается и неправильно интерпретирует данные как дату, когда он намечает его – chiliNUT

ответ

5

Несмотря на то, что я не согласен с их определением «общего» формата даты: q, я думаю, что @chiliNUT находится на чем-то. Кажется, есть некоторые проблемы с принуждением формата даты.

Если вы измените все свои переменные типа на Double или Long, он должен работать.

Например, изменение

ReDim detached_date(detachedProps.count - 1) As Date 

к

ReDim detached_date(detachedProps.count - 1) As Double 

или

ReDim detached_date(detachedProps.count - 1) As Long 

Таким образом, даты не преобразуются в String методом XValues. Они хранятся в виде серийных номеров даты, и процедура оси может успешно их использовать в локальном формате даты.

Что происходит в вашем коде является Date типов принуждают String методом XValues и рендеринг обычной оси, как представляется, не в состоянии заставить их обратно в сроки надлежащим образом.

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

1/01/2013 
1/01/2014 
1/01/2015 
1/01/2016 
1/01/2017 
1/01/2018 
1/01/2019 
1/01/2020 
1/01/2021 

, который работает в любой системе.

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

Мне было бы интересно услышать от других более знающих, чем я.

Кроме того, мне очень интересно об этом:

.SeriesCollection.NewSeries 

.SeriesCollection(DETACHED).Name = "Detached" 
.SeriesCollection(DETACHED).Values = detached_price 
.SeriesCollection(DETACHED).XValues = detached_date 

Как это знать, какие серии ссылаться? Является ли DETACHED константой, которую вы определили в другом месте?

Я думаю, что это было бы лучше:

with objChart.SeriesCollection.NewSeries 
    .Name = "Detached" 
    .Values = detached_price 
    .XValues = detached_date 
end with 
+0

Спасибо Прохладный, это сделал трюк! Согласитесь использовать 'with ...' также, спасибо за подсказку :) –

Смежные вопросы