Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/334: Рейтинг темы: голосов - 334, средняя оценка - 4.86
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
24.12.2013, 11:43  [ТС] 41
1. Добавляем примечание на лист
2. Пишем и запускаем код:
Пишем код:
Visual Basic
1
2
3
4
5
6
7
8
Public Sub fqwe()
 Dim Ws As Worksheet
 For Each Ws In ThisWorkbook.Worksheets
  For Each IShape In Ws.Shapes
   IShape.Delete
  Next
 Next Ws
End Sub
и! переходя на лист видем: треугольничек примечания продолжает висеть. о! значит примечание живо! пробуем его отобразить и получаем: "Примечание не найдено". но треугольничек все так и висит. и ... если закрыть и открыть книгу - он исчезнет.
с т.зрения разработчика - все логично. но с т.зрения пользователя - нет. неужели сложно было повесить эвент на удаление шейпа примечания и при удалении его родного шейпа и удалять и само примечание? ... или если примечание - не шейп и не должно удаляться удалением шейпа, то почему тогда не запретить удаление шейпа примечания (или перевести его в другой объект или другой класс?)
Попробуем изменить удаленное примечание ... и о! оно оказывается пустым!

Добавлено через 7 минут
А если вы бросите на лист какой-либо ActiveX-объект, и дойдете вручную до строчки "IShape.Delete" и нажмете Shift+F8, то получите "Can't enter break mode at this time" с Continue или End'ом.
Где логика? все, дебаг закончен ... (логика может конечно и есть, но почему бы заранее и не проверить - есть ли в коде эвенты этого объекта, а если их нет - удалять без лишних проблем ... да собственно ... пусть они и есть и пусть они останутся подвязаны у тому объекту и до останова просто не становятся самостоятельными функциями ...)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2013, 11:43
Ответы с готовыми решениями:

Указать, почему программа останавливается на операторе Stop, найти пути решения проблемы
ВНИМАНИЕ! все что написано в данном сообщении - просьба прочитать внимательно!...

Проблемы с алгоритмом решения задачи
Нужно написать алгоритм решения задачи. Т.е. что и как делает прога, желательно...

USB устройство, проблемы и пути решения.
Народ, что делать с флешкой - сохраняю на ней файлы (форматы разные), после не...

Прошу помощи решения проблемы в перекрестном...
Ребята, прошу помощи. Есть перекрестный запрос: TRANSFORM Count(.TypObor)...

ФР Electrolube PRP, проблемы, подводные камни, решения
Не смог найти привычный POSITIV20, пришел довольствоваться тем что есть. Не...

118
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
25.12.2013, 20:46  [ТС] 42
А вы знали, что этот код не сработает:
Visual Basic
1
2
3
4
5
6
Public Function qwe1()
 Call qwe2(AddressOf qwe1)
End Function
 
Public Function qwe2(d As Long)
End Function
Ошибка "Expected Sub, Function, or Property" (почему перед "or" запятая?! грамотеи ...)
Уже давно ... факт присвоения имени функции результата функции, наводил на мысль, что имя функции для нее(!) - это лишь чистая переменная, через которую она возвращает результат. На данном примере в этом можно убедиться. Однако, вне тела функции, имя функции перестает быть просто переменной.

Добавлено через 1 час 14 минут
------------------------------------------------------------------------------
Расширение возможных событий листа до:
Visual Basic
1
2
3
4
5
[B]Public[/B] Sub Worksheet_MouseMove(ByVal Target As Range)
End Sub
 
[B]Public[/B] Sub Worksheet_MouseScroll(Old_ScrollColumn&, Old_ScrollRow&)
End Sub
Для запуска контроля событий - call fЗапускРасширенногоКонтроляСобытий_Mouse
Для останова контроля событий - call fОстановРасширенногоКонтроляСобытий_Mouse

(код модуля - во вложении)

Работает под:
- x32 (2003, 2007 и 2010 офисы)
- x64 (2003, 2007 и 2010 офисы)
под 2013 офис не работает!

Особенности:
1. Дебажить аккуратно! хук часто работает по тому коду, который был на момент запуска контроля событий! (т.е. все последующие изменения в процессе работы с кодом он не увидит!)
2. Может приводить к эксепту приложения при ЧРЕЗМЕРНОЙ нагрузке движений мыши и особенно скролла. Но это надо ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ постараться.

3.
При вызове Calculate(и любые Calculate) добавляйте:
Visual Basic
1
2
3
4
5
Call fОстановРасширенногоКонтроляСобытий_Mouse
On Error Resume Next
Calculate
On Error GoTo 0
Call fЗапускРасширенногоКонтроляСобытий_Mouse
On Error Resume Next - необходим т.к. в период Calculate бывает свал в эксепт по причине внутренней ошибки Excel'я из-за отработки хуков в момент Calculate.
4. Бывают свалы в момент переключения между листами, при изменении листа и при записи запись файла. Поэтому, вешайте аналогичный лок на Worksheet_Activate, на Worksheet_Change и связку Workbook_BeforeSave и Workbook_AfterSave. Но при хорошем контроле с отключением событий при переключении листов, перед сохранением и т.д. - все работает правильно.
P.S. Не работает в режиме совместимости в старых форматах файлов расширения xls.
0
Вложения
Тип файла: rar kernel_EventMouse.rar (2.9 Кб, 9 просмотров)
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
26.12.2013, 21:37  [ТС] 43
Если у вас большие таблицы и/или мелкий масштаб данных, то вы можете использовать следующую надстройку для создания перекрестия под курсором мышки, как на рисунке во вложении. При перемещении перекрестие будет смещаться. Удобно, если необходимо анализировать данные в одной строчке.
Код как под x32, так и х64 (под 2003, 2007 и 2010 офис - работает, под 2013 офис не работает!). Работает в связке с предыдущей надстройкой на событие листа.
Цвет и толщину линии - можно поправить в коде.
P.S. Пока не работает в режиме совместимости - т.е. формата xls в 2007 и 2010 офисах.
3
Миниатюры
Профессиональные проблемы, решения, рекомендации и ошибки  
Вложения
Тип файла: rar 2014.01.16 - Наработка.rar (80.6 Кб, 33 просмотров)
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
27.12.2013, 12:26  [ТС] 44
Если у вас с файлом(книгой) что-то "не то" ... - всегда делайте копию этого файла(книги) и уже все дальнейшие действия производите только с ее копией.
Из категории "странных и совершенно абсурдных" советов:

1. После работы макроса, сохранения и закрытия книги. При следующей попытке открытия этого файла, приложение Excel гибнет(вываливается в эксепт, виснит, просто бесследно исчезает ...).
Совет:
- Отключите макросы. Откройте этот файл. Если он открылся - перейдите в код, внесите любое изменение (добавьте пустую строку, пробел в любом месте ...). Сохраните и закройте файл. Включите макросы обратно и попробуйте открыть его вновь ...
- Если файл не открывается (или не открывается с отключенными макросами (см. выше)) ... (сначала с включенными, а затем с выключенными макросами)Попробуйте открыть этот файл на том компьютере, на котором было последнее сохранение этого файла, до момента возникновения проблемы (с открытием) и так же попробуйте внести какие-то изменения в код(см. выше)
- Если файл не открывается вновь ... попробуйте его открыть на компьютере с меньшим объемом оперативной памяти.
2. У вас файл больших размеров (с большим количеством данных и/или формул). Поработав с этим файлом, сохранив и закрыв его, пытаетесь открыть заново ... и получаете сообщение, что файл поврежден.
Совет: Не торопитесь его восстанавливать.
- (часто)Закройте это приложение и попробуйте открыть его в новом (другом)приложении Excel.
- (редко)Попробуйте перезагрузить компьютер.
3. Программный код файла(книги) был обновлен сторонним приложением(или произошло самообновление) и ... в этом файле работает старая программа, словно код не был обновлен и программа там совершенно другая.
Совет:
- Попробуйте открыть файл в другом приложении(закройте текущий и откройте новый Excel). Внесите любые изменения на любом листе (в любой ячейке). Сохраните и закройте файл. Попробуйте открыть его снова ...
4. При закрытии книги (чаще с макросами) приложение Excel гибнет (в любом режиме - с включенными и с выключенными макросами) ... (как правило, уже не излечимо)
Совет:
- Попробуйте пересохранить файл в другом формате (xlsb, xlsm) ... помогает до следующего сохранения.

Поверьте. Это не всегда, но работает )
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
10.01.2014, 11:55  [ТС] 45
В тему "как сделать 2 и более листов типа ЭтаКнига". Тема была описана ранее.
Есть еще один способ.
Создаем книгу, сохраняем ее.
Вставляем и запускаем:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Function qwe()
 Set FSO = CreateObject("Scripting.FileSystemObject")
 
 dИмяТекущейКниги$ = FSO.GetFileName(ThisWorkbook.FullName)
 For i1& = 1 To Application.VBE.VBProjects.Count
  If FSO.GetFileName(Application.VBE.VBProjects(i1&).Filename) = dИмяТекущейКниги$ Then
   dКодПроекта& = i1&
   Exit For
  End If
 Next i1&
 
 For Each Component In Application.VBE.VBProjects(dКодПроекта&).VBComponents
  If Component.Name = "ЭтаКнига" Then
   Component.Name = "qwe1"
  End If
 Next Component
End Function
Сохраняем и переоткрываем книгу. ... и! получаем 2 листа типа ЭтаКнига ... )
Может чего-то не понимаю, но как можно было разрешать переименовывать этот "лист"? Как это прошло тестирование и/или почему не было протестировано перед выпуском продукта?
0
Sasha_Smirnov
5466 / 1309 / 143
Регистрация: 08.02.2009
Сообщений: 4,019
Записей в блоге: 29
10.01.2014, 16:22 46
Всё что не запрещено — разрешено! То есть на совести пользователей.
0
Surrogate
Ушел с CyberForum совсем!
868 / 177 / 25
Регистрация: 04.05.2011
Сообщений: 1,020
Записей в блоге: 110
14.01.2014, 11:50 47
Цитата Сообщение от StepInLik Посмотреть сообщение
Может чего-то не понимаю, но как можно было разрешать переименовывать этот "лист"? Как это прошло тестирование и/или почему не было протестировано перед выпуском продукта?
да, но при запуске кода в одном из листов такого типа вылетает ошибка '429' - ActiveX Component can't create object

Цитата Сообщение от Sasha_Smirnov Посмотреть сообщение
Всё что не запрещено — разрешено! То есть на совести пользователей.
Так что пользователю не разгуляться
может это как-то зависит от версии офиса ? я тестил на офисе 2010…
0
Миниатюры
Профессиональные проблемы, решения, рекомендации и ошибки  
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
14.01.2014, 12:35  [ТС] 48
Это в тему - как при включенных макросах, не изменяя код - обойти выполнение событий открытия книги ) - меняем имя листу "ЭтаКнига" на какое-то другое, сохраняемся и ... при следующем открытии создается пустой лист "ЭтаКнига", а прежние обработчики работать уже не будут.
Там все интереснее - поиграйте с именами, к примеру - сделайте модуль с именем "ЭтаКнига", попробуйте переименовать обычный лист в "ЭтаКнига" ... попробуйте сменить ему имя через раздел "Name" в оснастке свойств ... (у кого есть сразу и английская версия - посмотрите, что будет при попытке "отжать" это имя сразу в обеих локализациях)
Анализируя все эти затычки(со стороны Excl'я), пришел к выводу, что вооозможно в Майкрософт знают эту особенность поведения, но почему-то менять не хотят и не собираются, потому как - натыкали заглушек (и лист ЭтаКнига появляется всегда, но уже под какими-то другими именами ...)
на счет совести пользователя ... честно говоря, не хотел бы данную тему превращать в диалог рассуждений ... вижу здесь (как говорят) только "сок мозга" (и знаний ...)
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
31.01.2014, 10:57  [ТС] 49
Форматируем ячейку:
1. по горизонтали: по правому краю (отступ)
2. отступ: 1
вводим в эту ячейку 1(единички) одну за одной ... нажимаем "1", нажимаем "1", и т.д. ...
смотрим как они сначала нажимаются и образуется к примеру строка "111111", но потом, при нажатии очередной "1" в ячейке отражается строка "1". Пробуем экспериментировать дальше и наблюдаем разные другие глюки ...
Где логика?!
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
25.02.2014, 16:54  [ТС] 50
хотел сделать паузу, но треш постоянных косяков вбил последний гвоздь ...
Встаем в любую ячейку, что-то пишем подлиннее, форматируем "Выровнять текст по правому краю"
1. Нажимаем F2 ... смотрим, наслаждаемся как в ячейке отражается вся введенная строка с курсором в конце строки
(ESC)2. Нажимаем два раза мышью на ячейку ... смотрим, наслаждаемся как в ячейке отражается вся введенная строка с курсором на территории строки )))
(ESC)3. Жмем мышью в строке формул справа от строки ... и впадаем в бешенство, от того, что видно лишь первую часть строки ... а смешнее во всем этом то, что если нажать клавишу влево (для перемещения курсором в позицию между предпоследним и последним символом), то в ячейке отражена уже будет последняя часть строки ... где логика?! конечно, пипл схавает ...

Добавлено через 23 минуты
Из категории "не вредных советов". Если не хотите добить нервную систему пользователя, не ставьте:
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
 Application.EnableEvents = False
 If Len(Target.Formula) <> 0 Then
  Target.Formula = Target.Formula
 Else
  Target.Value = Target.Value
 End If
 Application.EnableEvents = True
End Sub
Отмена действий отменяется ) ... и все что не сделает пользователь - будет на его совести )
0
Казанский
14257 / 5916 / 1568
Регистрация: 24.09.2011
Сообщений: 9,314
01.04.2014, 09:07 51
Не работает Workbooks.Open внутри процедуры Workbook_BeforeSave
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
05.06.2014, 16:28  [ТС] 52
Если ваша книга не открывается по какой-то причине (валится эксель) ... на разных компьютерах с разным объемом оперативной памяти ...
- попробуйте ее открыть в Excel запущенном в защищенном режиме (редко, но иногда помогает) - ЗАЖИмаете клавишу Ctrl и далее по ярлыку экселя ... он некоторое время подумает и потом спросит "Excel обнаружено, что нажата клавиша CTRL. Запустить Excel в безопасном режиме?"

Добавлено через 12 минут
Допустим, вы хотите написать свою функцию(формулу), которая как-то отрабатывает при вызове с листа и ей передаете какое-то значение ссылкой на другую книгу ...
На листе: =qwe([temp.xlsx]Лист!$A$1)
Код:
Visual Basic
1
2
3
Public Function qwe(a)
 Stop
End Function
- работает!
Далее, закрываем temp.xlsx ... получаем на листе =qwe('D:\Temp\[temp.xlsx]Лист'!$A$1)
- тоже работает!

ок ... теперь все заново, но только передаем диапазон =qwe('D:\Temp\[temp.xlsx]Лист'!$A:$G)
... смотрим на Stop значение переменной a - получем: "Error 2036"
Вывод: если из другой книги надо подтянуть одну ячейку - передается ее значение - просто Sting(Long, ...), если передается рейнч - должен создаться объект, на основе каких-то данных "находящихся в доступе" ... а т.к. книга закрыта - данные вне доступа ... (кто объяснит это более научным и/или более правильным языком?)
2
Hugo121
6292 / 2391 / 406
Регистрация: 19.10.2012
Сообщений: 7,079
09.06.2014, 18:53 53
Не согласен. Я вижу в a массив! Только если не целиком столбцы передавать, а ограниченный диапазон. Вот это почему так?
Visual Basic
1
2
3
4
Public Function qwe(a)
    Stop
    qwe = a
End Function
А так даже вытягивает данные, если ввести сразу в диапазон как формулу массива.
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
03.07.2014, 12:41  [ТС] 54
Действительно - с рейнджем работает, а со столбцом уже нет - что еще раз подтверждает основной смысл ветки. Кто знает причину столь странного поведения, когда массив по рейнджу создается, а по столбцу - нет (при закрытом файле экселя-источнике данных)?

Еще одна изюминка объекта нашей страсти:
- кидаем на лист пару объектов ActiveХ
- смотрим у каждого по отдельности правой клавишей мыши спиок элементов меню. у каждого есть "Свойства"
- выделяем несколько объектов с "Ctrl", смотрим контекстное меню - полная идентификация объектов как рисованных
- (очевидно) при этом, если окно "Свойства" держать открытым и выделить объекты с "Ctrl" - увидим общий список свойств этих объектов ...
Все очевидно - и как и почему ... и видимо, с т.зрения разработчиков экселя - это логично ... только логика эта кажется немного странной ... ну почему это нельзя было проработать и сделать как для людей?!

Добавлено через 1 час 44 минуты
Наша красавица жжет. Отвечал по теме Как исправить проблему видимости элементов ActiveX на картинке?
И в конце столкнулся с тем, что при закрытии программы, когда выскочило окно "Сохранить Да/Нет", ответив "Да" - после клика СРАЗУ повел мышь в сторону ...
Напомню, код:
Visual Basic
1
2
3
4
5
6
Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 For Each a In Application.ThisWorkbook.Worksheets(Name).Shapes
  a.Visible = False
  a.Visible = True
 Next
End Sub
и что вы думаете?! ... код события свалился. Оказалось, что при закрытии файла, объекты с листа начинают уже удаляться, но события на них все еще работают!!!
Так, Application.ThisWorkbook.Worksheets(Name).Shapes.Count не 0 (сколько у вас было объектов? = 2 ... 3 - не важно), но объектов уже нет!!! и событие на эти отсутствующие объекты продолжают работать!!!
Почему бы не удалять объекты после полной работы интерпритатора? Видимо, это не логично ...
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
11.07.2014, 16:15  [ТС] 55
Конечно, это придирка ...
Ставим проверку данных со списком, снимаем флаг "Игнорировать пустые ячейки".
Пробуем - выбираем какое-то значение и жмем Del. - Del'ом значение удалились (почему? мы же убрали игнор пустых ячеек, а соответственно, она не должна быть пустой!) ... ладно, выбираем какое-то значение еще раз, жмем backspace много раз до Empty и заканчиваем Enter'ом ... и что же? вводимое значение не может быть пустым.
Ну так почему бы не написать (перевести) "Игнорировать пустые значения" (вместо ячейки!) - или "Игнорировать ввод пустого значения"?
Если речь идет про ячейки, то почему в результате (пользовательских действий) Del'ом - она может быть пустой, а вот бакспейсом - не может ... почему (с т.зрения пользователя) одна клавиша и способ очистки ячейки "круче" другого?!
Речь не идет про то - почему (все понятно) ... а вот с т.зрения обычного пользователя - это не логично!
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
15.07.2014, 14:34  [ТС] 56
Допустим, у вас в таблице есть столбец, в котором по строкам объединены некоторые ячейки и по этим объединенным ячейкам, вам необходимо фильтровать данные всей таблицы.
Если навесить фильтр на такие столбцы, то фильтр будет работать не корректно - часть фильтрованных значений будет оставаться видимыми.
Для корректной работы такой задачи:
- слева от столбца с объединенными значениями вставьте дополнительный столбец
- в который в каждой строке пропишите значения, содержащиеся в ячейках справа (в том числе и объединенных ячеек)
- объедините две ячейки этих двух столбцов над данными (там, где будут располагаться курсоры выбора фильтров)
- установите фильтр
- скройте добавленный столбец

теперь фильтр будет работать корректно
0
Hugo121
6292 / 2391 / 406
Регистрация: 19.10.2012
Сообщений: 7,079
17.07.2014, 14:29 57
По объединённым ячейкам - есть способ оставить значения в этих ячейках - тогда и фильтр, и например ВПР() будет работать корректно. Делается это копированием формата с объединённой ячейки на необъединённые с данными. Почему это нельзя было сделать при стандартном объединении?...
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
17.07.2014, 14:59  [ТС] 58
Hugo121, совершенно не понял вас. Вы имели в виду ситуацию с картинки? Опишите пожалуйста подробнее.
Что вы имеете в виду, говоря "Делается это копированием формата с объединённой ячейки на необъединённые с данными." - т.е. в добавляемый столбец или во все остальные столбцы таблицы?
Что вы подразумеваете под "стандартным объединением"?
0
Изображения
 
Hugo121
6292 / 2391 / 406
Регистрация: 19.10.2012
Сообщений: 7,079
17.07.2014, 16:15 59
Ну вот например на этой картинке выше - берёте копируете формат объединённой единицы поверх жёлтых единиц (стандартно кисточкой), а двойки поверх жёлтых двоек. Теперь столбец "заголовок 2" можно удалить, использовать как основной жёлтый столбец.
А "стандартное объединение" - это когда стандартно выделяют диапазон и жмут "<-a->"
1
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
18.07.2014, 13:44  [ТС] 60
Согласен. Альтернативный способ (мои коллеги от него отказались потому, что пользователь в процессе работы со столбцом может менять области объединения ячеек и значения в них, а в дополнительном столбце можно указать формулу, которая будет всегда корректно отрабатывать на фильтр).
Вариант с объединенной ячейкой в строке фильтра дает возможность работать с дополнительными значениями фильтруемого столбца, например ">10", "отбракованные по спецификации" или наоборот, если оригинальный фильтруемый столбец содержит ОРИГИНАЛЬНЫЕ введенные пользователями данные (с разными символами плавающей точки, с пробелами и т.д.) - по фильтру (в доп. столбце) вы можете предложить организовать фильтрование по правильным (скорректированным) числовым значениям.

Добавлено через 20 часов 15 минут
Если ваш xlsx(xlsm) файл стал весить слишком много, то для сокращения его размера:
1. распакуйте (тем же раром)
2. запакуте все получившиеся после распаковки файлы (тем же раром) с параметром максимального алгоритма сжатия (в формате zip-архива)
3. переименуйте полученный файл-архив в файл с прежним расширением xlsx(xlsm)
- наслаждайтесь Excel-файлом меньшего размера (обратите внимание, что после следующего сохранения Excel он снова вырастет)
0
18.07.2014, 13:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 13:44

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

BDE - ошибки и решения
Доброго всем дня. Нужна помощь/совет. Есть программа на Delphi, исходников...

Реестровый триал(ошибки и решения)
Привет, всем. Пишу свою программу. Ну и создал даже модуль триала через реестр,...


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

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

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