Юрий М написал: Кстати, с ячейкой D5 тоже проблема )
Да, верно проблема вообще с примыкающими ячейками (т.е. со всех четырех сторон)
(я не хотел в вопросе увеличивать объем поэтому сосредоточился только на одном варианте который собственно мне и мешал - ну если кратко для порядка то у меня имеется анализатор листов который помечает проблемные ячейки вот такими диагональными границами, чтобы не менять заливку, или шрифты и прочее - как правило этот эффект с границами не очень заметен ибо большая часть проблемных ячейки исправляются прямо в них, но вот попались варианты исправления когда правильную верхнюю ячейку протягивают по неправильной вот и проявился эффект )
Ігор Гончаренко написал: задумайтесь о дырах в собственной логике,
1. Задумался (еще до написания поста) и не нашел
2. Скопируйте в произвольное место ячейку D3 до! выполнения макроса сдвиньте с нее курсор - вы увидите в наличии все границы 2.1 проверьте наличие границ у ячеек D3,D4 (ПКМ->формат ячеек->границы)- вы увидите что у обоих ячеек есть все границы по контуру
3. Выполните макрос 3.1 проверьте наличие границ у ячеек D3,D4 (ПКМ->формат ячеек->границы)- вы увидите что у обоих ячеек есть все границы по контуру (да точно так как и в п 2.1)
4. Снова скопируйте в произвольное место ячейку D3, сдвиньте с нее курсор и вы не увидите нижней границы у вновь скопированной ячейки
5) "выполните макрос, отметьте Д3 принудительно установите в ней нижнюю границу, копируйте, что видно?" Если загляните в макрос то увидите там закоментированную строчку Cells(3, 4).Borders(xlEdgeTop).LineStyle = xlContinuous Как нетрудно догадаться эта строчка принудительно устанавливает нижнюю границу в D3 для компенсации обнаруженного эффекта
И последнее Я вообще спросил в первом посте может ли кто-то объяснить этот эффект. То мне начинают советовать чего то не делать, что я и так не делаю, то начинают говорить, что мол у меня дефекты в логике, то что я чуть что эксель обвиняют не желая даже немного подумать Ну и зачем это? Если по существу нечего ответить ну так и вообще говорить ничего не надо
Уважаемый гуру! Я далеко не "сразу" обвинил Эксель, да и не обвиняю его Я порылся в интернетах, обнаружил, что эффект наличия границы в свойствах и отсутствия ее при копировании ячейки иногда встречается, попроводил всякие эксперименты на нескольких версиях Excel и только потом написал этот пост, приложив файл и описав ситуацию.
Ігор Гончаренко написал: как сказал А.Эйнштейн "все в этом мире относительно"
Выражаетесь Вы весьма цветисто, но может по существу что то скажете? 1) В своем коде я не трогаю границ D3 и даже не трогаю верхнюю границу D4 2) Даже если бы я там чего то тронул все равно остается неясность почему Excel говорит, что нижняя граница есть но не отрисовывает ее?
При установке из VBA!!! диагональных границ в ячейке (D4), ячейка (D3) расположенная над той, в которой устанавливаются диагональные границы, каким то образом теряет нижнюю границу При копировании ячейки D3 в другое место листа или к примеру протягивании ячейки D3 вниз на D4 это хорошо видно При этом в свойствах ячейки эта граница отмечается как установленная и наличествующая
Этого эффекта нет при установке этих диагональных границ вручную Эффект этот есть как в версии 2010 так и в 2019
Мы привыкли пользоваться макрорекордером для получения результата желаемых действий и дальнейшего использования этих действий в VBA
Но если мы запишем макрос смены цвета листа ярлыка на "нет цвета" получим такой макрос...
Код
Sub Макрос1()
'
' Макрос1 Макрос
'
Sheets("Лист1").Select
With ActiveWorkbook.Sheets("Лист1").Tab
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With
End Sub
и попробуем его выполнить, то получим ошибку "Subscript out of range" Недолгое расследование выясняет, что вместо xlAutomatic надо использовать xlColorIndexNone, в чем конечно прослеживается некая логичность "нет цвета" как то лучше соотносится с xlColorIndexNone, чем xlAutomatic
Таким образом получается что макрорекордер записывает не столько сами действий сколько, как бы сказать, отражения этих действий, и вот конкретно в этой ситуации "отражение" какое-то не то
Теперь собственно вопрос - можно ли где то прочитать как внутри устроен макрорекоррдер Excel-а и система записи команд с его помощью?
Нет не совсем так Я наверное недостаточно подробно пояснил в первом своем посте Речь идет не о ссылка в формулах, а о гиперссылках привязываемых к ячейке
Гиперссылки привязываемые к ячейка, можно разделить на фиксированные и динамические
- Фиксированные это гиперссылки привязываемые вручную прямо на листе (ПКМ->ссылка) или в VBA функцией Hyperlinks.Add Эти ссылки видны в коллекции Hyperlinks
- Динамические гиперссылки это ссылки формируемые функцией ГИПЕРССЫЛКА, причем сама эта функция может сложным образом входить в другую функцию с выборами, сложно формируемыми адресами, указывать на другие листы или книги и прочее. Кстати говоря Эксел для таких сложных фуекций даже не сообразит формат поменять на тот, который используется для гиперссылок. Эти ссылки не видны в коллекции Hyperlinks
Так вот при копировании такого листа в новый лист нового файла ссылки в формулах с этими гиперссылки будут смотреть на источник и если вы разорвете связи то в ячейках останется только текстовые значения а гиперссылки удаляться. Т.е. выражения "заморозятся данные" относится не к самой гиперссылки (линку) а к тому, вы увидите в ячейке
Я прикрепил файл для иллюстрации
Однако я нашел способ такого копирования, а точнее получения адреса вот такой динамической ссылки. Заключается он в том, что ячейку надо скопировать в Word (радость то какая - при такой операции Word вычисляет таки актуальный адрес ссылки и превращает ее в фиксированный), далее проверить коллекцию Hyperlinks уже объекта Word
Конечно в таком виде работает довольно таки медленно, но при желании можно усовершенствовать, например объект wdApp сделать статическим и не каждый раз создавать/разрушать, это весьма прилично ускорит работу, если надо много ячеек обработать Проверено на Excel/Word 2019 (да и не забыть подключить Microsoft Object Library )
Код
' Получаем адрес гиперссылки
Function GetLink(r As Long, c As Long) As String
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
If Cells(r, c).Value = Empty Then
GetLink = ""
Exit Function
End If
Cells(r, c).Copy
Set wdApp = CreateObject("Word.Application")
wdApp.Documents.Add
Set wdDoc = wdApp.Documents(1)
wdApp.Visible = False
wdDoc.Range.PasteExcelTable False, False, False
' Теперь найдем ссылку в коллекции Hyperlinks Word-локумента word
If wdDoc.Hyperlinks.Count = 0 Then
GetLink = ""
Else
GetLink = wdDoc.Hyperlinks(1).Name
End If
wdDoc.Close (wdDoNotSaveChanges)
wdApp.Quit (wdDoNotSaveChanges)
End Function
Формул много, они разнообразны, ячейки из которых конструируется формула в течении дня могут поменяться, в них могут собраться другие имен страниц и т.д. (сам эти ячейки тоже вычисляемые)
В конечном итоге желательно лист насыщенный такими формулами периодически переносить в другую книгу, без привязки к источнику, отправлять по почте и прочее (т.е. просто скопировать то лист можно, но останутся связи с исходным файлом, если же скопировать только значения то сгенерированные формулами гиперссылки потеряются)
Т.е. в перенесенном листе формулы уже не требуются но требуется оставит результат их работы т.е. гиперссылки может кто-то подсказать как это сделать?
А вот с 2010 интересно - ранее в ней была возможность переключения между офлайн и онлайн справками а сейчас при переключении на онлайн пишет, что мол пользуйтесь автономной справкой а онлайн не работает (...Поддержка Excel 2010 завершается Перейдите на Microsoft 365, чтобы работать удаленно с любого устройства и продолжать получать поддержку.)
Совершенно нормально работает online помощь по VBA в 2019-ый - все быстро и как ожидалось Черт его знает - то ли временный глюк какой-то, то ли что то вроде желания пересадить на 2019 (с другой стороны при все уважении к сообществу разработчиков в Office не думаю что это такой уж большой сегмент среди потребителей)
Ситуация Комп с установленными W10 pro и MS Office 2013. Все обновления сделаны. Никаких внешних антивирусов не установлено
При попытке получить в редакторе помощь по нажатию F1 какая то явно неправильная работа (не зависит от файла, не зависти от браузера та же истоия что в Edge что в Хроме, не зависит от включенного-отключенного Defender-а)
Вся эта эксельная автоматика таким образом распространяется на более сложные ситуации чем описано по вышеприведенной ссылке.
Существенно, что она срабатывает когда в ячейку что то вводится (прямо данные или формула или даже происходит изменение цвета заливки или цвета шрифта при условном форматировании!) и формат в этой целевой ячейке выставлен общий.
Таким образом если мы поставим в ячейках с формулой формат числовой то эксель уже не будет менять там формат
Я попробовал несколько вариантов и похоже все подтверждается
Конечно неплохо бы где-то найти подробное описание всей этой автоматики, но "хватит и пяти"
Суть проблемы (Excel 2010) - в ячейку с формулой автоматически переносятся форматы из влияющих ячеек
Предположим у нас очищены форматы во всей таблице (см. приложенный файл) В ячейке B7 формула - =СУММ(A3:A5) В ячейке B8 формула - =A3+A4+A5
Если я установлю формат в ячейке A3 в денежный, то при установке курсора в ячейку B7 и Enter (ну как бы ввели формулу) формат ячейки B7 меняется на денежный. Тоже самое и для ячейки B8. Но!!! Если я сброшу все форматы в таблице и снова такое проделаю но уже я ячейкой A4, то формат в ячейке B7 поменяется а ва ячейке B8 нет!!! Очистка форматов в ячейках A3:A5 и дальнейшем "редактировании" формул в B7 и B8 уже не меняет формат в B7 и B8
Тоже самое произойдет при установке формата числовой. Он тоже передет в ячейки И
Ситуация еще более сложная так так зависит еще и от последовательности установок форматов. Например, если я установлю формат в A3 числовой и щелкну по B7 то в B7 установится фомат числовой, а если затем я установлю формат в A3 денежный и щелкну по B7 то в B7 останется фомат числовой Однако если я установлю формат в A3 числовой а затем поменяю его на денежный и щелкну по B7 то в B7 установится фомат денежный
Может ли кто-то обьяснить такое поведение Экселя и где это отключить?