Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/12: Рейтинг темы: голосов - 12, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
1

Поячейковое движение числа к конкретному адресу

30.01.2019, 15:05. Показов 2427. Ответов 24
Метки нет (Все метки)

Добрый день,.
Хотел задать вопрос про движение ячейки.

На листе есть одна ячейка с числом 88.
В таблицу AE5:AG5 вписаны : Целевая ячейка (C18), число которое надо двигать (88) и адрес ячейки которую занимает число 88 в настоящий момент.
Как за одно срабатывание макроса - передвинуть текст ячейки (цифра 88) - на одну ячейку к цели (к ячейке C18) ?

(В ячейке AH5 после каждого срабатывания - будет менятся адрес, поскольку число 88 - будет менять адрес, продвигаясь все ближе к цели)
0
Вложения
Тип файла: xls 1.xls (30.5 Кб, 3 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2019, 15:05
Ответы с готовыми решениями:

Поячейковое движение нескольких чисел
Доброго дня. Хотел задать вопрос про движение нескольких чисел по листу. На листе есть одна...

Перенос значения ячейки не по конкретному адресу, а в конец списка
Доброго времени суток. Помогите решить непростой вопрос. На листе находится ячейка C27 с неким...

Число по конкретному адресу
Добрый день. Скажите, пожалуйста, как можно вывести на экран 16-ричное число, которое находится по...

Обращение к конкретному адресу в памяти
Первый вопрос: как с помощью указателя увидеть содержимое по конкретному адресу, например, по...

24
818 / 449 / 79
Регистрация: 18.05.2016
Сообщений: 1,216
Записей в блоге: 4
31.01.2019, 16:40 2
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim target As Range, c88 As Range
Dim c As Range, cc As Integer, cr As Integer
Set target = ActiveSheet.Range(ActiveSheet.Range("ae5").Text)
Set c88 = ActiveSheet.Range(ActiveSheet.Range("ag5").Text)
If c88.Column >= target.Column Then
    cc = c88.Column - 1
Else
    cc = c88.Column + 1
End If
If c88.Row >= target.Row Then
    cr = c88.Row - 1
Else
    cr = c88.Row + 1
End If
Set c = ActiveSheet.Cells(cr, cc)
ActiveSheet.Range("ag5").Formula = c.Address
c.Formula = ActiveSheet.Range("af5").Text
Я где-то слыыыышал, что для построения кратчайшего пути используется теория графов Но я её не знаю
0
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
31.01.2019, 21:39  [ТС] 3
amd48, проверил макрос.
Но он как-то по необычной траектории ведет число, под каким-то углом.

Число должно проходить более-менее рядом по траектории (как показано на рисунке) - не отдаляясь от нее.
0
Миниатюры
Поячейковое движение числа к конкретному адресу  
Вложения
Тип файла: xls 1.xls (42.0 Кб, 0 просмотров)
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
31.01.2019, 21:39  [ТС] 4
amd48, проверил макрос.
Но он как-то по необычной траектории ведет число, под каким-то углом.

Число должно проходить более-менее рядом по траектории (как показано на рисунке) - не отдаляясь от нее.
0
818 / 449 / 79
Регистрация: 18.05.2016
Сообщений: 1,216
Записей в блоге: 4
01.02.2019, 07:48 5
Вот это и есть задача на поиск кратчайшего пути. У меня нет её решения. Никогда этим не занимался
0
1414 / 975 / 304
Регистрация: 11.07.2014
Сообщений: 3,464
01.02.2019, 10:30 6
SkyGreen, amd48, никакой задачи по поиску кратчайшего пути здесь не надо и обойдемся без теории графов, вполне достаточно знаний школьной тригонометрии. Если бы угол прямой был бы 45 градусов , то приведенный алгоритм дал бы хороший результат. А для общего случая посмотрите это (подправил макрос amd48)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub proba()
Dim target As Range, c88 As Range
Dim c As Range, cc As Integer, cr As Integer
Set target = ActiveSheet.Range(ActiveSheet.Range("ae5").Text)
Set c88 = ActiveSheet.Range(ActiveSheet.Range("ag5").Text)
a = (c88.Top + c88.Height / 2 - (target.Top + target.Height / 2)) / _
    (c88.Left + c88.Width / 2 - (target.Left + target.Width / 2))
If c88.Column >= target.Column Then
    cc = c88.Column - 1
Else
    cc = c88.Column + 1
End If
cr = Round(a * (cc - target.Column) + target.Row)
Set c = ActiveSheet.Cells(cr, cc)
ActiveSheet.Range("ag5").Formula = c.Address
c.Formula = ActiveSheet.Range("af5").Text
End Sub
Добавлено через 10 минут
ХОТЕЛ КАК ЛУЧШЕ
Кое-что переделывал на ходу и забыл проверить Удалите строки 6 и 7 и вместо них вставить
a = (c88.Row - target.Row) / (c88.Column - target.Column)
можно и не удалять, я прверю в чем дело, а просто эту строку поставить после 7 строки

Добавлено через 10 минут
ТОЛЬКО для вертикальной прямой это не сработает
0
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
01.02.2019, 11:05  [ТС] 7
Burk, поменял адрес итоговой ячейки - и макрос при перемещении - стал перемещать число не последовательно, а через две ячейки.
0
Миниатюры
Поячейковое движение числа к конкретному адресу  
1414 / 975 / 304
Регистрация: 11.07.2014
Сообщений: 3,464
01.02.2019, 14:33 8
SkyGreen, не вижу где две ячейки. по столбцам смещение идет на одну ячейку. Прошу присылать не миниатюры, а файл. Ваше кино мне ни о чём не говорит. Так как у вас при каждом запуске фактически меняется текущая ячейка, точность которой 1 ячейка, то могут накапливаться ошибки. Посылаю файл, в котором в таблицу заносится начальная ячейка (см.Лист3). В этом случае получается идеальный вариант. Потренируйтесь. Кстати, там была в моем послании приписочка, вы сделали замену?
0
Вложения
Тип файла: rar По ячейкам.rar (12.7 Кб, 1 просмотров)
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
01.02.2019, 14:41  [ТС] 9
Burk, в данном коде - сменил адрес конечной ячейки, запустил макрос - и макрос стал двигать число - не по одной ячейке - а сразу на несколько ячеек к цели (не последовательно, а скачком).

В файле - выделил те ячейки, которые проходятся при каждом шаге.
Между ними промежутки по пять пустых ячеек.
0
Вложения
Тип файла: rar По ячейкам(2).rar (14.1 Кб, 4 просмотров)
818 / 449 / 79
Регистрация: 18.05.2016
Сообщений: 1,216
Записей в блоге: 4
01.02.2019, 15:23 10
ещё одна редакция
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim target As Range, c88 As Range
Dim c As Range, cc As Integer, cr As Integer
Set target = ActiveSheet.Range(ActiveSheet.Range("ae5").Text)
Set c88 = ActiveSheet.Range(ActiveSheet.Range("ag5").Text)
If c88.Column > target.Column Then
    cc = c88.Column - 1
ElseIf c88.Column < target.Column Then
    cc = c88.Column + 1
Else
    cc = c88.Column
End If
If c88.Row >= target.Row Then
    cr = c88.Row - 1
Else
    cr = c88.Row + 1
End If
If c88.Column <> target.Column Then
    a = (c88.Row - target.Row) / (c88.Column - target.Column)
    cr = Round(a * (cc - target.Column) + target.Row)
End If
Set c = ActiveSheet.Cells(cr, cc)
ActiveSheet.Range("ag5").Formula = "=CELL(""адрес""," & c.Address & ")"
c.Formula = ActiveSheet.Range("af5").Text
пока вправо двигается прыжками
0
1414 / 975 / 304
Регистрация: 11.07.2014
Сообщений: 3,464
01.02.2019, 15:24 11
SkyGreen, может будете внимательно смотреть - начало W6, цель Z23, туда и ваши восьмерки пришли, всё правильно. От W до Z три колонки, значит должно быть всего три точки. Расстояния по колонкам (3) и строкам (18) разное.
Или вам больше нравится не совсем верное решение от amd? Или хотите поставить в пустые ячейки ваши восьмерки друг под другом? По-другому и не получится
0
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
01.02.2019, 15:34  [ТС] 12
amd48, у вас тоже число двигается скачками - по несколько ячеек за раз.
Число не должно двигаться скачками.
Только на одну ячейку в какую-либо сторону.
0
Вложения
Тип файла: rar По ячейкам(2)_.rar (14.5 Кб, 0 просмотров)
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
01.02.2019, 15:39  [ТС] 13
Цитата Сообщение от Burk Посмотреть сообщение
От W до Z три колонки, значит должно быть всего три точки.
Я не очень хорошо разбираюсь в vba, поэтому не очень понимаю что вы имеете ввиду.

Но до целевой ячейки 17 строк.
То есть это как минимум 17 точек получается.
0
1414 / 975 / 304
Регистрация: 11.07.2014
Сообщений: 3,464
01.02.2019, 16:01 14
SkyGreen, представьте себе, что на оси Х были бы только целые числа, а дробей не было совсем. Вот это и есть ваши колонки, нельзя задать ячейку в полколонки шириной. Вы чуточку поразмышляйте, прежде чем писать про мифические скачки. Если речь идет о заполнении пустых, то я вам предложил вариант.

Добавлено через 19 минут
А лучше всего смотреть, если общее число строк > числа столбцов, то двигаемся по строкам и рассчитываем столбцы, а если наоборот, то делается как сейчас.
0
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
01.02.2019, 16:12  [ТС] 15
Цитата Сообщение от Burk Посмотреть сообщение
А лучше всего смотреть, если общее число строк > числа столбцов, то двигаемся по строкам и рассчитываем столбцы
А это как сделать ?
0
1414 / 975 / 304
Регистрация: 11.07.2014
Сообщений: 3,464
01.02.2019, 16:58 16
Лучший ответ Сообщение было отмечено SkyGreen как решение

Решение

Цитата Сообщение от SkyGreen Посмотреть сообщение
А это как сделать ?
Да легко
1
Вложения
Тип файла: xls По ячейкам.xls (41.0 Кб, 1 просмотров)
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
01.02.2019, 17:08  [ТС] 17
Burk, вот теперь - то что нужно !

А можно как-нибудь стирать, предыдущие отметки числа ?
Чтобы на листе - двигалось только само число, без длинного хвоста за ним.
0
1414 / 975 / 304
Регистрация: 11.07.2014
Сообщений: 3,464
01.02.2019, 17:30 18
SkyGreen, можно всё, в том числе и это, но красиво это будет когда макрос будет запускаться не вручную, а через несколько секунд (функция OnTime) А пока проверьте ручной вариант
0
Вложения
Тип файла: xls По ячейкам.xls (42.0 Кб, 2 просмотров)
1414 / 975 / 304
Регистрация: 11.07.2014
Сообщений: 3,464
01.02.2019, 17:37 19
Кстати, вы заметили, что заполнение пустых произошло по виду также как я предлагал просто заполнить столбик восьмерками. Но зато сейчас и при чисто вертикальной линии программа вылетать не будет
0
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 139
01.02.2019, 17:38  [ТС] 20
Burk, число теперь двигается как нужно.
Но вот только почему-то свое исходное значение (по адресу W6 ) - не стирает.
Почему так происходит, ведь при начале движения - в ячейку AG5 - вписан именно адрес W6 ?

Или тут какая-то другая система ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2019, 17:38

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Создание файлов по конкретному адресу
Как сделать так, что-бы програма написаная на PascalABC.NET создавала файлы по конкретному пути а...

Задать переменную по конкретному адресу памяти
В emu8086 надо написать программу для суммирования элементов двух массивов и записать результат во...

Удалённый доступ RDP конкретному ip-адресу не из локальной сети
Здравствуйте, есть Windows Server 2008 R2, к которому можно подключиться из локальной сети с любого...

Обращение к конкретному биту числа
Доброго дня! Объясните, пож-та, вот такую запись, характеризующую обращение к конкретному биту...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.