Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2013, 11:29   #1
Корабль
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 14
По умолчанию Не переносит диаграммы на лист Location error

Есть код, создает кучу графиков на листе.
Перед выполнением нужно поставить метки "начало" и "конец" возле таблиц. На листе 2 типа таблиц: по первому строятся круговые диаграммы (1 столбик - диаграмма), по второму строится гистограмма (3 столбика - диаграмма). В каждой таблице есть данные на 2 диаграммы - одна отражает структуру по возрасту, другая - по стажу.
Проблема в чем. Когда код доходит до 2й таблицы (где нужно строить гистограммы), он строит первые 2 диаграммы (по возрасту и стажу)- все ок. На следующем шаге он выдает ошибку
run time error 1004 : Method 'Location' of object '_Chart' faild

если я пропускаю строчку в дебаггере, то на следующей диаграмме та же самая песня. И эти графики, которые остаются на отдельном листе, не получается перенести даже вручную.


Код:
Sub postroenie()


Dim N, K,  As Range  
Dim sh1 As Worksheet
Dim myChart As Chart
Dim i, j, y, As Integer 
Dim FA


Set sh1 = ActiveSheet
    
    Set N = sh1.[a:a].Find(What:="начало", LookIn:=xlValues, LookAt:=xlWhole)
   Set K = sh1.[j:p].Find(What:="конец", LookIn:=xlValues, LookAt:=xlWhole)
   
If N Is Nothing Or K Is Nothing Then GoTo 1

    FA = N.Address
    i = 0
    j = 0
   
Do
 y = 0
   
'______________круговые_____________________
If N.Offset(0, 4) = "Круг" Then
    For i = i + 1 To i + K.Column - N.Column
    
'Возраст
Set myChart = Charts.Add
j = j + 1
   With myChart
    .SetSourceData Source:=sh1.Range(N.Offset(3, 1 + y), N.Offset(11, 1 + y))
    .ChartType = xlPie
    .ApplyChartTemplate (Шаблон.crtx)
    .SeriesCollection(1).XValues = Range(N.Offset(3, 0), N.Offset(11, 0))
    .name = j
    .HasTitle = True
    .ChartTitle.Text = N.Offset(, 2) & ", " & vbLf & N.Offset(, 1) & ", " & N.Offset(1, 1 + y) & ", " & N.Offset(2, 1 + y)
    .ChartTitle.Font.name = "Times New Roman"
    .ChartTitle.Font.Size = 8
    .Location Where:=xlLocationAsObject, name:=sh1.name
        
    End With
    

'Стаж
'аналогично, просто другие данные
    

Next i

ElseIf N.Offset(0, 4) = "Гист" Then
'____________________Гистограмма________________
For i = i + 1 To i + 6
'Возраст
Set myChart = Charts.Add
j = j + 1
   With myChart
      
    .ApplyChartTemplate (Шаблон.crtx)
    .SeriesCollection(1).name = N.Offset(1, 1 + y)
    .SeriesCollection(1).Values = sh1.Range(N.Offset(3, 1 + y), N.Offset(11, 1 + y))
    .SeriesCollection.NewSeries
    .SeriesCollection(2).name = N.Offset(1, 2 + y)
    .SeriesCollection(2).Values = sh1.Range(N.Offset(3, 2 + y), N.Offset(11, 2 + y))
    .SeriesCollection.NewSeries
    .SeriesCollection(3).name = N.Offset(1, 3 + y)
    .SeriesCollection(3).Values = sh1.Range(N.Offset(3, 3 + y), N.Offset(11, 3 + y))
    .SeriesCollection(1).XValues = Range(N.Offset(3, 0), N.Offset(11, 0))
    a = ActiveChart.SeriesCollection.Count ' убирает лишние ряды
    If a > 3 Then
    For b = a To 4 Step -1
     .SeriesCollection(b).Delete
    Next b
    
    End If
    
    
    .name = j
    .HasTitle = True
    .ChartTitle.Text = N.Offset(, 2) & ", " & vbLf & N.Offset(, 1) & ", " & N.Offset(2, 1 + y)
    .ChartTitle.Font.name = "Times New Roman"
    .ChartTitle.Font.Size = 8
    .Location Where:=xlLocationAsObject, name:=sh1.name 'вот эта строчка

      
        
    End With
       
   
'Стаж
Set myChart = Charts.Add
j = j + 1
   With myChart
      
    .ApplyChartTemplate (Шаблон.crtx)
    .SeriesCollection(1).name = N.Offset(1, 1 + y)
    .SeriesCollection(1).Values = sh1.Range(N.Offset(10, 1 + y), N.Offset(15, 1 + y))
    .SeriesCollection.NewSeries
    .SeriesCollection(2).name = N.Offset(1, 2 + y)
    .SeriesCollection(2).Values = sh1.Range(N.Offset(10, 2 + y), N.Offset(15, 2 + y))
    .SeriesCollection.NewSeries
    .SeriesCollection(3).name = N.Offset(1, 3 + y)
    .SeriesCollection(3).Values = sh1.Range(N.Offset(10, 3 + y), N.Offset(15, 3 + y))
    .SeriesCollection(1).XValues = Range(N.Offset(10, 0), N.Offset(15, 0))
    a = ActiveChart.SeriesCollection.Count
    If a > 3 Then
    For b = a To 4 Step -1
     .SeriesCollection(b).Delete
    Next b
    
    End If
       
    .name = j
    .HasTitle = True
    .ChartTitle.Text = N.Offset(, 3) & ", " & vbLf & N.Offset(, 1) & ", " & N.Offset(2, 1 + y)
    .ChartTitle.Font.name = "Times New Roman"
    .ChartTitle.Font.Size = 8
    .Location Where:=xlLocationAsObject, name:=sh1.name  'и эта строчка
 End With
  
y = y + 3
Next i
End If
    
    '---------------------------------------
    x = x + 464
    Set N = sh1.[a:a].Find(What:="начало", LookIn:=xlValues, LookAt:=xlWhole, after:=N)
    Set K = sh1.[j:p].Find(What:="конец", LookIn:=xlValues, LookAt:=xlWhole, after:=K)
    
Loop Until FA = N.Address

1:

End Sub
Подскажите что не так?
прикладываю файлик с данными и шаблонами
Вложения
Тип файла: zip Книга2.zip (78.3 Кб, 13 просмотров)
Корабль вне форума Ответить с цитированием
Старый 27.06.2013, 12:11   #2
Корабль
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 14
По умолчанию

Небольшая корректировка
не работает эта строчка с комментарием ' вот эта строчка
а с комментом ' и эта строчка работает
то есть получается, что диаграммы с именами 21,23,25,27,29, 49, 51, 53 и тд не переносятся на нужный лист, а остаются на отдельном
Корабль вне форума Ответить с цитированием
Старый 27.06.2013, 18:06   #3
Корабль
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 14
По умолчанию

Переписала код
та же беда, только теперь выдает ошибку в другой строчке
то есть не перемещаются диаграммы 2,4,6
я ничего не понимаю Т_Т

Код:
Sub гист()

Dim N  As Range  
Dim sh1 As Worksheet
Dim myChart As Chart
Dim i As Integer   
Dim j As Integer  
Dim x As Integer 
Dim y As Integer
Dim g As Integer  
Dim b As Integer 
Dim FA

ActiveSheet.Copy Before:=Sheets(1)

x = ActiveCell.Top
y = ActiveCell.Left
Set sh1 = ActiveSheet
   sh1.Columns("A:T").Select
    Selection.Replace What:="-", Replacement:="0", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Set N = sh1.[a:a].Find(What:="начало", LookIn:=xlValues, LookAt:=xlWhole)
     
If N Is Nothing Then GoTo 1

    FA = N.Address
    i = 1
    j = 0
   
Do
 g = 0

For i = i + 1 To i + (N.Offset(3, 0).End(xlToRight).Column - N.Column) / 3
'возраст
Set myChart = Charts.Add
j = j + 1

   With myChart
      
    .ApplyChartTemplate ("222.crtx")
    .SeriesCollection(1).name = N.Offset(1, 1 + g)
    .SeriesCollection(1).Values = sh1.Range(N.Offset(3, 1 + g), N.Offset(11, 1 + g))
    .SeriesCollection.NewSeries
    .SeriesCollection(2).name = N.Offset(1, 2 + g)
    .SeriesCollection(2).Values = sh1.Range(N.Offset(3, 2 + g), N.Offset(11, 2 + g))
    .SeriesCollection.NewSeries
    .SeriesCollection(3).name = N.Offset(1, 3 + g)
    .SeriesCollection(3).Values = sh1.Range(N.Offset(3, 3 + g), N.Offset(11, 3 + g))
    .SeriesCollection(1).XValues = Range(N.Offset(3, 0), N.Offset(11, 0))

If ActiveChart.SeriesCollection.Count > 3 Then
    For b = ActiveChart.SeriesCollection.Count To 4 Step -1
     .SeriesCollection(b).Delete
    Next b
    
End If
    
    
    .name = j
    .HasTitle = True
    .ChartTitle.Text = N.Offset(, 1) & ", " & N.Offset(2, 1 + g)
    .ChartTitle.Font.name = "Times New Roman"
    .ChartTitle.Font.Size = 8
    .Location Where:=xlLocationAsObject, name:=sh1.name
      
        
    End With
    
With sh1.ChartObjects(j)
.Top = x
.Left = y + g * 262
.Height = 227
.Width = 257
End With
    
    
'стаж
Set myChart = Charts.Add
j = j + 1
   With myChart
      
    .ApplyChartTemplate ("222.crtx")
    .SeriesCollection(1).name = N.Offset(1, 1 + g)
    .SeriesCollection(1).Values = sh1.Range(N.Offset(10, 1 + g), N.Offset(15, 1 + g))
    .SeriesCollection.NewSeries
    .SeriesCollection(2).name = N.Offset(1, 2 + g)
    .SeriesCollection(2).Values = sh1.Range(N.Offset(10, 2 + g), N.Offset(15, 2 + g))
    .SeriesCollection.NewSeries
    .SeriesCollection(3).name = N.Offset(1, 3 + g)
    .SeriesCollection(3).Values = sh1.Range(N.Offset(10, 3 + g), N.Offset(15, 3 + g))
    .SeriesCollection(1).XValues = Range(N.Offset(10, 0), N.Offset(15, 0))
If ActiveChart.SeriesCollection.Count > 3 Then
    For b = ActiveChart.SeriesCollection.Count To 4 Step -1
     .SeriesCollection(b).Delete
    Next b
    
End If
       
    .name = j
    .HasTitle = True
    .ChartTitle.Text = N.Offset(, 1) & ", " & N.Offset(2, 1 + g)
    .ChartTitle.Font.name = "Times New Roman"
    .ChartTitle.Font.Size = 8
    .Location Where:=xlLocationAsObject, name:=sh1.name

    
        
    End With
    
   
With sh1.ChartObjects(j)
.Top = x + 230
.Left = y + g * 262
.Height = 227
.Width = 257
End With
g = g + 3
Next i

    
    '---------------------------------------
    x = x + 464
    Set N = sh1.[a:a].Find(What:="начало", LookIn:=xlValues, LookAt:=xlWhole, after:=N)
      
Loop Until FA = N.Address

1:

End Sub
Корабль вне форума Ответить с цитированием
Старый 03.07.2013, 18:27   #4
Корабль
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 14
По умолчанию

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

Код:
ActiveSheet.Shapes.AddChart.Select
Set myChart = ActiveChart
   
  With myChart
Select Case g
выбор шаблона
End Select

    .SetSourceData Source:=Range(N.Offset(3, 1 + g), N.Offset(10, 3 + g))
    .SeriesCollection(1).XValues = Range(N.Offset(3, 0), N.Offset(10, 0))
    .SeriesCollection(1).name = N.Offset(1, 1 + g)
    .SeriesCollection(2).name = N.Offset(1, 2 + g)
    .SeriesCollection(3).name = N.Offset(1, 3 + g)


If myChart.SeriesCollection.Count > 3 Then
    For b = myChart.SeriesCollection.Count To 4 Step -1
     .SeriesCollection(b).Delete
    Next b
    
End If
    
    
    .HasTitle = True
    .ChartTitle.Text = N.Offset(, 1) & ", " & N.Offset(2, 1 + g)
    .ChartTitle.Font.name = "Times New Roman"
    .ChartTitle.Font.Size = 8
        
    End With
    

With sh1.ChartObjects(j)
.name = ("Диаграмма " & j)
.Top = x
.Left = y + g * 140
.Height = 245
.Width = 370
End With
Корабль вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование строк таблицы по условию одной ячейки из Лист 1 в Лист 2 Людвиг Microsoft Office Excel 5 25.10.2014 11:46
Header (Location) jasul PHP 6 15.04.2012 12:10
Excel диаграмма на лист Location funball Microsoft Office Excel 2 24.11.2010 10:25
Location FonFon Общие вопросы C/C++ 1 06.08.2010 16:44
Проблема с Location hoza_syl JavaScript, Ajax 4 23.10.2009 18:14