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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2014, 17:42   #1
GAS1979
Пользователь
 
Регистрация: 22.04.2013
Сообщений: 17
Печаль Создание фигуры по условию

Я запускаю макрос из ячейки, с текстом.
Идет проверка, если фигура с таким именем (как содержание ячейки) уже есть на листе, то фигура выделяется.
Иначе создается новая фигура (например прямоугольник) с таким именем, как содержание ячейки.

Что то не смог найти процедуру поиска фигур.
И фигуры могут иметь одинаковое имя, как с этим быть.

Заранее спасибо.
GAS1979 вне форума Ответить с цитированием
Старый 10.10.2014, 17:58   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Что то не смог найти процедуру поиска фигур.
Код:
dim sha as shape
On Error Resume Next
set sha = ActiveSheet.shapes(ActiveCell.value)
if sha is nothing then msgbox "Фигура не найдена"
Цитата:
И фигуры могут иметь одинаковое имя, как с этим быть.
а тут сложнее
лучше такого не допускать изначально - а то потом никак не определите, какая нужная, а какая нет
EducatedFool вне форума Ответить с цитированием
Старый 10.10.2014, 18:13   #3
GAS1979
Пользователь
 
Регистрация: 22.04.2013
Сообщений: 17
По умолчанию

Спасибо, работает, дальше уже разберусь
GAS1979 вне форума Ответить с цитированием
Старый 13.10.2014, 12:35   #4
GAS1979
Пользователь
 
Регистрация: 22.04.2013
Сообщений: 17
По умолчанию

Не определяет, что фигуры нет.
Без цикла, все работает.

Цитата:
Dim sha As Shape
On Error Resume Next
For i = 2 To 12

n = Cells(i, 1).Value
Set sha = ActiveSheet.Shapes(n)
x = Cells(Cells(i, 1).Left + 1).Left
y = Cells(i, 1).Top

If sha Is Nothing Then
ActiveSheet.Shapes.AddShape(msoShap eRectangle, x, y, 90, 78).Select
Selection.ShapeRange.Name = n
Selection.Name = n
End If

Next i
GAS1979 вне форума Ответить с цитированием
Старый 13.10.2014, 13:44   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

это что за код?
Код:
x = Cells(Cells(i, 1).Left + 1).Left
так не будет работать...

попробуйте такой вариант:
Код:
Sub test()
    Dim sha As Shape, n As String
    On Error Resume Next
    For i = 2 To 12

        n = Cells(i, 1).Value
        Set sha = Nothing: Set sha = ActiveSheet.Shapes(n)
        
        x = Cells(i, 2).Left
        y = Cells(i, 1).Top

        If sha Is Nothing Then
            With ActiveSheet.Shapes.AddShape(msoShapeRectangle, x, y, 90, 78)
                .ShapeRange.Name = n
                .Name = n
            End With
        End If
    Next i
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 13.10.2014, 14:06   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

применительно к Ексель, функция
x = Cells(Cells(i, 1).Left + 1).Left
определена на промежутке для і от 1 до Rows.count
и равно 0 для любых значений і
проверить можно так:
Код:
for i = 1 to rows.count
  msgbox  "при i = " & i & "   x = " & Cells(Cells(i, 1).Left + 1).Left
next
ее можно упростить и сразу записать х = 0.

Цитата:
это что за код?
а что задумывал автор, когда писал это знает только он один
VBA не читает мысли, считает то, что написано, а не то, что задумано посчитать
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 13.10.2014, 14:14   #7
GAS1979
Пользователь
 
Регистрация: 22.04.2013
Сообщений: 17
По умолчанию

x = Cells(Cells(i, 1).Left + 1).Left - эта функция работает
ActiveSheet.Shapes.AddShape(msoShap eRectangle, x, y, 90, 78).Select - тут создаю фигуру справа от ячейки Cells(i, 1)

Set sha = ActiveSheet.Shapes(n) - не отрабатывала эта функция

Теперь этот код работает, поправил только выделенное красным

Цитата:
Dim sha As Shape
On Error Resume Next
For i = 2 To 12

n = Cells(i, 1).Value + "_Об"
Set sha = Nothing: Set sha = ActiveSheet.Shapes(n)
x = Cells(Cells(i, 1).Left + 7).Left
y = Cells(i, 1).Top

If sha Is Nothing Then
ActiveSheet.Shapes.AddShape(msoShap eRectangle, x, y, 90, 78).Select
Selection.ShapeRange.Name = n
Selection.Name = n
End If

Next i
Спасибо
GAS1979 вне форума Ответить с цитированием
Старый 13.10.2014, 14:28   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
x = Cells(Cells(i, 1).Left + 1).Left - эта функция работает
выражение
Код:
х = i^2 - i*i
тоже работает и в результате х будет всегда равен 0, как и здесь:
Код:
x = Cells(Cells(i, 1).Left + 1).Left
у Вас записано мудренее, но результат-то стабилен = 0.
я предложил упростить это сразу до
Код:
х = 0
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 13.10.2014, 14:32   #9
GAS1979
Пользователь
 
Регистрация: 22.04.2013
Сообщений: 17
По умолчанию

Вы не правы, выдает значение при i=2: x=318; y=15.75
При i=3: x=318; y=30.75
...

Все то, что и надо
GAS1979 вне форума Ответить с цитированием
Старый 13.10.2014, 14:49   #10
GAS1979
Пользователь
 
Регистрация: 22.04.2013
Сообщений: 17
По умолчанию

С этим все разобрался. Создает недостающие фигуры.
Теперь еще, можно ли как то вывести весь список фигур на листе. Мне надо найти лишние фигуры.
GAS1979 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание своего класса в Delphi 7 - фигуры для шахматной доски electric Компоненты Delphi 18 24.10.2013 15:06
Фигуры с++ katu_nja Помощь студентам 0 20.04.2013 12:20
Создание 3d фигуры labuda01 Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 05.06.2012 22:58
Движение одной фигуры,вслед изменения высоты другой фигуры. 7vlad37 Microsoft Office Excel 3 21.07.2011 18:01
Создание текстовых полей по условию vandrouny Общие вопросы .NET 1 13.10.2010 14:53