Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
3 / 3 / 1
Регистрация: 28.09.2015
Сообщений: 271

Как макросом провести фигуру-линию - из центра одной ячейки в центр другой ячейки

03.09.2017, 13:38. Показов 3089. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, господа программисты.
Помогите разобраться.

На листе находятся две ячейки (я подкрасил их желтым и зеленым цветом)
Также на листе находится табличка B4:C5 с названиями адресов данных ячеек.

Как макросом провести автофигуру-стрелку по двум координатам - из центра ячейки F10 (желтого цвета) в центр ячейки J18 (зеленого цвета) ориентируясь на адреса из таблицы B4:C5 ?

(если сменить адреса ячеек B4:C5 в области и нажать на кнопку - то предыдущая линия сотрется и отобразится между двумя другими назначенными ячейками)
(это не отображение связей, а расположение линии между центрами двух ячеек)
Вложения
Тип файла: xls 234744.xls (31.0 Кб, 24 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.09.2017, 13:38
Ответы с готовыми решениями:

Изменение содержимого одной ячейки Datagridview после изменения другой ячейки
Здравствуйте. Есть Datagridview с 2 столбцами. Столбцы типа ComboBox. В 1 столбце уже забиты значения, 2 столбец пустой. Необходимо сделать...

Залить ячейки находящиеся на одной стороке с одинаковым текстом в другой ячейки находящейся в этой же строке
Здравствуйте. Вопрос от непонимающего. Как Залить ячейки находящиеся на одной стороке с одинаковым текстом в другой ячейки находящейся в...

Зависимость одной ячейки от значения другой ячейки
Дорого времени суток! Не могу найти решение своей задачи, суть задачи в следующем: есть значение в ячейки А1( оно может быть от 10...

9
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
03.09.2017, 19:55
Пример
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Arrow()
    With Range(Cells(5, 2).Value)
        iBeginX = .Left + (.Offset(0, 1).Left - .Left) / 2
        iBeginY = .Top + (.Offset(1, 0).Top - .Top) / 2
    End With
    With Range(Cells(5, 3).Value)
        iEndX = .Left + (.Offset(0, 1).Left - .Left) / 2
        iEndY = .Top + (.Offset(1, 0).Top - .Top) / 2
    End With
    With Shapes.AddLine(iBeginX, iBeginY, iEndX, iEndY).Line
        .ForeColor.RGB = RGB(50, 0, 128)
        .EndArrowheadLength = msoArrowheadLong
        .EndArrowheadStyle = msoArrowheadStealth
        .EndArrowheadWidth = msoArrowheadWide
    End With
End Sub
Добавлено через 26 минут
Вот с удалением предыдущей линии
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Arrow()
    With ActiveSheet
        If .Shapes.Count Then .Shapes(1).Delete
        With .Range(Cells(5, 2).Value)
            iBeginX = .Left + (.Offset(0, 1).Left - .Left) / 2
            iBeginY = .Top + (.Offset(1, 0).Top - .Top) / 2
        End With
        With .Range(Cells(5, 3).Value)
            iEndX = .Left + (.Offset(0, 1).Left - .Left) / 2
            iEndY = .Top + (.Offset(1, 0).Top - .Top) / 2
        End With
        With .Shapes.AddLine(iBeginX, iBeginY, iEndX, iEndY).Line
            .ForeColor.RGB = RGB(0, 0, 0)
            .EndArrowheadLength = msoArrowheadLong
            .EndArrowheadStyle = msoArrowheadStealth
            .EndArrowheadWidth = msoArrowheadWide
            .Weight = 1.5
        End With
    End With
End Sub
1
11 / 11 / 2
Регистрация: 30.08.2017
Сообщений: 40
03.09.2017, 20:09
Добрый вечер коллеги!

Вот это выражение выдает ошибку: "Run-time error '1004': Method 'Range' of object '_Global' failed":
Visual Basic
1
Range(Cells(5, 2).Value)
Считаю, что правильным будет следующий вариант:
Visual Basic
1
Range(Cells(5, 2),Cells(5, 2))
0
3 / 3 / 1
Регистрация: 28.09.2015
Сообщений: 271
03.09.2017, 20:29  [ТС]
Homarty , подскажите - как заставить этот макрос - не удалять кнопку, которая располагается на листе ?

(Как я понял - строчка If .Shapes.Count Then .Shapes(1).Delete - удаляет все автофигуры с листа)
0
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
03.09.2017, 23:21
yl3d,
Цитата Сообщение от yl3d Посмотреть сообщение
Как я понял - строчка If .Shapes.Count Then .Shapes(1).Delete - удаляет все автофигуры с листа
Нет, этот оператор удаляет только, указанный Шэйп, но дело в том, что номера (Item) после удаления меняются и при повторном запуске макроса автофигура становится первой и удаляется. Поставьте после первой строки следующие строки, а строку 3 удалите. И перед Cells в двух местах тоже поставьте точки .Cells( ). И всё должно быть хорошо

Visual Basic
1
2
3
4
     For I = .Shapes.Count To 1 Step -1
          S = .Shapes(I).Name
          If InStr(S, "Line") > 0 Or InStr(S, "Прямая") > 0 Then .Shapes(I).Delete
        Next
Добавлено через 23 минуты
Павел86, то, что вы считаете, это неправильно, ведь нужна не ячейка 5,2 а ссылка на ячейку, адрес которой находится в ней. можно было записать

Visual Basic
1
Range(Cells(5,2)) или Range([B5]) или Range(Range("B5"))
0
11 / 11 / 2
Регистрация: 30.08.2017
Сообщений: 40
04.09.2017, 04:55
Вы правы, не обратил внимания, что в ячейках содержаться адреса (ссылки на другие ячейки).
0
3 / 3 / 1
Регистрация: 28.09.2015
Сообщений: 271
04.09.2017, 08:08  [ТС]
Burk , почему-то не работает.
При вводе новых координат - предыдущая линия не стирается.
Вложения
Тип файла: xls 234744.xls (51.5 Кб, 14 просмотров)
0
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
04.09.2017, 09:22
yl3d, У меня всё работает, только удаление просходит не сразу. Чтобы было видно сразу, поставил оператор DoEvents после удаления. Также поставил в блоке удаления промежуточный вывод для проверки
Также рекомендую менять свойство Name на своё, а то все объекты со стандартными именами отличаются только номерами и эксель сохраняет эти номера даже при удалении объекта.
Я выбрал имя "Arrow" & ячейка начала & ячейка конца стрелки. Если вы это примете, то в условии If Instr можно оставить только первый оператор. В этом случае будут удаляться только линии, созданные через этот макрос, а не какие-то другие.
Пример в файле сделан без этих изменений, на файле, который вы прислали
Вложения
Тип файла: xls 234744Burk.xls (44.5 Кб, 36 просмотров)
0
3 / 3 / 1
Регистрация: 28.09.2015
Сообщений: 271
04.09.2017, 11:10  [ТС]
Burk , вот теперь все заработало.
Огромное спасибо.
0
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
04.09.2017, 18:05
yl3d, У меня и тогда работало, только не помню уже где был макрос на странице или модуле. Кстати, если макрос в коде страницы и убрать точки перед Cells, хотя вроде можно и так, ведь по умолчанию берется Activesheet, то вылетает по ошибке 1004, Если перенести в таком виде в модуль, то работает. Сам был удивлен такому глюку.
Совет - поставьте оператор DoEvents и после создания линии перед переименовыванием Шейпа. Так надежнее

Добавлено через 5 часов 46 минут
yl3d, я сейчас запустил чисто тот файл, который вы прислали во второй раз, ничего не меняя. Ваши множественные линии пропали и нарисовалась одна, заданная в ячейках. Может ваши настройки...хотя не представляю, что может быть.

Добавлено через 12 минут
yl3d, единственное, что пришло в голову - может надо перезагружать файл после сделанных изменений макроса
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.09.2017, 18:05
Помогаю со студенческими работами здесь

Извлечение части данных из одной ячейки макросом
Здравствуйте. Надо извлечь несколько данных находящихся в одной ячейке на разных позициях, не знаю как лучше объяснить: Арктикул: 5177...

Как задать ширину ячейки, равную четверти ширины другой ячейки
Добрый день Имеется Grid, надо задать ширину одной ячейки, равную четверти ширине другой. Подскажите, пожалуйста, как это сделать? ...

Как задать значение для ячейки в зависимости от значения другой ячейки
Здравствуйте! Подскажите, как задать значение для ячейки в зависимости от значения другой ячейки. Есть таблица с ячейками. Если значение...

Как правильно перейти от одной ячейки в excel к другой?
Товарищи, вопрос Решаю систему ДУ, получаю определенные выходные значения хочу вывести эти значение в excel для дальнейшей обработки ...

Приплюсовывание числа одной ячейки как минут к другой ячейке
Формат ячеек столбца B - часы:минуты. Задача стоит такая: ввожу в ячейку столбца C от руки число, соответствующее количеству минут,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru