Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/603: Рейтинг темы: голосов - 603, средняя оценка - 4.69
 Аватар для Апострофф
9909 / 3931 / 742
Регистрация: 11.10.2011
Сообщений: 5,911
27.03.2013, 13:19
Студворк — интернет-сервис помощи студентам
StepInLik, это не баг.
Для модальной формы код должен выглядеть примерно так-
Visual Basic
1
2
3
4
 UserForm_Форма.StartUpPosition = 0
 UserForm_Форма.Left = 50
 UserForm_Форма.Top = 50
 UserForm_Форма.Show
ибо по Вашему варианту 3, 4 и 5-я строки выполнятся только после закрытия модальной формы, что вполне логично.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2013, 13:19
Ответы с готовыми решениями:

Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
В этой теме перечень полезных тем для начинающих. Обсуждение введите в самих темах. Для включения темы в этот перечень - напишите...

Обсуждение темы "Готовые решения, примеры и рекомендации начинающим на WPF"
Тема для обсуждения, критики, предложения изменений и дополнений темы https://www.cyberforum.ru/wpf-silverlight/thread2384523.html

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

126
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
16.04.2013, 16:26  [ТС]
А вы знали, что evaluate вызывает вашу функцию 2 раза?

создаем модуль, пишем:
Visual Basic
1
2
3
Public Function ZZZ()
 Debug.Print "вызов"
End Function
вызываем:
Visual Basic
1
2
3
Private Function qwe()
 Call Evaluate("=ZZZ()")
End Function
получаем:
вызов
вызов


в результате, все ваши оптимизации на скорость - на смарку ... а протоколирование на ZZZ (как пример) - в дублях.
2
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
16.04.2013, 16:35
Да, неожиданно. А так: Evaluate "ZZZ()+ZZZ()" - тоже 2 раза,
так: Evaluate "ZZZ()+ZZZ()+ZZZ()" - 3 раза.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
16.04.2013, 18:30  [ТС]
(описанные ниже проблемы возникают редко, мы встречались с ними на x64 разрядных корпоративных версиях офиса)
1.
Допустим, что формула некоторого правила условного форматирования будет выглядеть как "=И(A1="нет";A2="да")".
Написанная нами строка формулы условного форматирования возвращается (через .FormatConditions.Item(i1&).Formula1) с наименованиями формул в русской локализации т.е. "И" и "ИЛИ" (в виде "=И(A1="нет";A2="да")").
Так вот, если строку условного форматирования мы получили (как показано ранее) в русской локализации, иногда передать ее обратно (.FormatConditions.Add Type:=CLng(dType$), Formula1:=[формула]) нужно уже в английской локализации (т.е. "=AND(A1="нет";A2="да")").

2.
Допустим, для создания правил условного форматирования мы создали некоторую функцию "fФункцияСозданияПравилаУсловногоФормати рования"
И если мы запускаем функцию "fФункцияСозданияПравилаУсловногоФормати рования" через IDE процедурой запуска функции, то все работает как должно. Строку формулы передаем как "=AND(A1="нет";A2="да")".
А вот если мы запускаем ту же функцию через evaluate("=fФункцияСозданияПравилаУсловн огоФорматирования()"), то передавать в .FormatConditions.Add иногда надо ту же формулу, только уже с заменой ";" на "," - т.е. ""=AND(A1="нет",A2="да")"
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,454
Записей в блоге: 1
03.10.2013, 17:01
Окно Immediate:
Visual Basic
1
Debug.Print 255*400
или любое место в коде:
Visual Basic
1
Dim n!: n=255*400
вызывает ошибку Overflow
255.001*400 '-уже не вызывает
1
 Аватар для Апострофф
9909 / 3931 / 742
Регистрация: 11.10.2011
Сообщений: 5,911
03.10.2013, 18:21
Visual Basic
1
2
Debug.Print 255*400 'Overflow
Debug.Print 255*400& 'No Overflow
Это можно назвать багом, но с натяжкой - Бэйсик пытается вернуть результат мат. операции с формате, в котором возможно представить наибольшее число из участвующих в операции.
В первом случае это Integer, во втором - Long.

Еще вариант, но без потери точности, как при 255.001*400
Visual Basic
1
Debug.Print 255.0*400 'No Overflow
2
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
22.10.2013, 14:08  [ТС]
Открываем чистую книгу. Делаем все как написано в qwe1(форму, мультипейдж, лейблы)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Function qwe1()
 UserForm1.Show
 UserForm1.MultiPage1.Page2.Label1.Font.Bold = True
 UserForm1.Label2.Font.Bold = True
End Function
 
Private Function qwe2()
 With UserForm1.Label2
  .Caption = "werwer"
  .Font.Bold = False
 End With
 
 With UserForm1.MultiPage1.Page2.Label1
  .Caption = "werwer"
  .Font.Bold = False
 End With
End Function
после qwe1 запускаем qwe2. ловим глюки! - болд первого лейбла(Label1) не меняется. если убрать Caption, то все славно. ощущение, что Caption - путь в один конец. со втором же - все работает на ура. (по версии 2010 офиса)
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
24.10.2013, 11:14
Цитата Сообщение от StepInLik Посмотреть сообщение
ловим глюки!
Ловил, но не поймал .

С уважением,
Aksima
Вложения
Тип файла: rar LabelsTest.rar (12.0 Кб, 26 просмотров)
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
24.10.2013, 15:55  [ТС]
Не стал разбираться с вашим файлом. Во вложении глючный.
Вложения
Тип файла: rar 2013.10.22 - test.rar (14.5 Кб, 26 просмотров)
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
25.10.2013, 17:51  [ТС]
1. создаем любой эксельный пустой файл - я делал xlsb. переименовываем открытый лист в "qwe". сохраняем, именуем.
2. создаем еще одну книгу и пишем:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub qwe()
 dПутьФайла$=
 
 With Application
  .Workbooks.Open Filename:=dПутьФайла$
  dИмяФайла$ = CreateObject("Scripting.FileSystemObject").GetFileName(dПутьФайла$)
  With .Workbooks(dИмяФайла$)
   For Each Ws In .Worksheets
    '
   Next Ws
   'Set Ws = .Worksheets("qwe")
  End With
  .Workbooks(dИмяФайла$).Save
  .Workbooks(dИмяФайла$).Close
 End With
End Sub
3. дописываем dПутьФайла$=
4. ставим точку останова на ".Workbooks(dИмяФайла$).Save"
5. ставим точку останова на последней строке "End With"
6. запускаем.
Наблюдаем в IDE:
останавливаемся на первой точке останова. в оснастке списка файлов у нас висит наш первый именнованный на "dПутьФайла$=" файл. правильно!
жмем F5
останавливаемся на второй точке останова. в оснастке списка файлов у нас висит наш первый именнованный на "dПутьФайла$=" файл. НЕ правильно! (мы предыдущей строкой закрываем этот файл! ".Workbooks(dИмяФайла$).Close") а он продолжает висеть!

что удалось выяснить:
если закомментить "For Each Ws In .Worksheets" - бага нет.
... это вроде как напоминаем беньджинг на Ws использования объекта, поэтому, эксель закрывает файл для пользователя, но держит внутри себя.
ан нет! - комментим "For Each Ws In .Worksheets" и открываем "'Set Ws = .Worksheets("qwe")"
проверяем! - на второй точке останова файл успешно исчезает в списке!

это о том, что какие-то странности с For Each в экселе. что-то он там не чистит или как-то уж жестко что-то бейнджит и не отдает (а потому не отпускает объект(счетчик использования переменной не обнуляется)).
P.S. что интересно, если разместить в первом файле код, то на второй точке останова (End With) эксель видит весь этот код. а вот свойства листов уже нет ...

фантазию последствий можно развить серьезную!
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
29.10.2013, 15:39  [ТС]
1. Создаем 1й файл ... и как-то его именуем. На первом листе размещаем ActiveX CheckBox(это даже не важно в плане объекта).
На этом же(первом) листе пишем код:
Visual Basic
1
2
3
Private Sub Worksheet_Change(ByVal Target As Range)
 a = 1 / 0
End Sub
Сохраняем, закрываем.
2. Создаем второй файл, пишем код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub CommandButton1_Click()
 dПутьФайла$ =  
 With Application
  .AutomationSecurity = msoAutomationSecurityLow
  .Workbooks.Open Filename:=dПутьФайла$
  dИмяФайла$ = CreateObject("Scripting.FileSystemObject").GetFileName(dПутьФайла$)
  
  With .Workbooks(dИмяФайла$).Worksheets(1)
   For Each ob In .OLEObjects
    ob.Delete
   Next
   .Range("A1") = "+"
  End With
 End With
End Sub
прописываем "dПутьФайла$ =" к первому файлу
Запускаем. Наблюдаем: "Ошибка деления" на строке ".Range("A1") = "+"" - (O!) - второго файла!
... не сохраняя закрываем первый файл(чтобы ActiveX объект остался на листе)
из кода второго файла удаляем строчки:
Visual Basic
1
2
3
For Each ob In .OLEObjects
 ob.Delete
Next
Запускаем. Наблюдаем: "Ошибка деления" на строке "a = 1 / 0" - (O!) - первого файла!

Вывод: при удалении объектов с листа у Экселя как-то подозрительно сносит крышу.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
21.11.2013, 12:32  [ТС]
Объединяем A1:C1. Пишем в этой объединенной ячейке "Total".
Выделяем столбец A
Устанавливаем правило условного форматирования "Форматировать только ячейки, которые содержат": если значение ячейки больше 3, то красим ячейку желтым цветом. ок, ок, ок.
Покрасилась объединенная ячейка. Как и должно быть.
... удаляем правило. Объединенная ячейка подкраску потеряла.
А теперь! Отменяем последнюю операцию. и видим, что подкрасилась не вся объединенная ячейка, а лишь ее первые 2 столбца, т.е. диапазон A1:B1. Пока не заставить обновить область этой ячейки ...
Мелочь, а приятно. (x64 2010)

Добавлено через 31 минуту
Мелочи, мелочи ...
Если при записи макроса при создании условного форматирования сначала нажать "Применить", а не "Ок", то макрос ничего не запишет.
Поправьте меня, если с т.зрения пользователя все так и должно быть.

Добавлено через 5 минут
Наболело.
Красим ярлычок в какой-то цвет. Записываем макрос "удаления цвета ярлычка".
Visual Basic
1
2
3
4
5
6
7
Sub Макрос1()
    Sheets("Лист1").Select
    With ActiveWorkbook.Sheets("Лист1").Tab
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
    End With
End Sub
опять ... Красим ярлычок в какой-то цвет и ... запускаем макрос. Получем "Subscript out of range" на ".ColorIndex = xlAutomatic" ... все логично, да ... но не приятно.

Добавлено через 24 минуты
напоследок.
Ставим на лист ActiveX: будь то ListBox, будь то CheckBox - не важно
для красоты, ListBox можно заполнить
Поперек, а луше, да - лучше прям под ListBox ставим курсор и жмем закрепление областей на ячейку.
и ловим глюки. Пытаемся поскроллировать(не обязательно) области и посмотреть, что Excel не только не дает выделить элементы ListBox'а, но и не обновляет его части, попавшие в другие области.
При том, что со своими "Элементами обновления форм" он ведет себя совершенно корректно.
Не понятно, почему нельзя было определять активность(хоть какую-то) пользователя со сторонним объектом и генерить обновление всех областей этого объекта.

Добавлено через 17 часов 59 минут
Мелочи.
Если за группируемой областью (внизу или справа) стоит скрытая область (строка или столбец), то значка "плюсик" не будет видно. Очевидно, что функциональность сгруппированной области не теряется, но ... есть пользователи, которые приходят в состояние шока "... ой, а что мне делать?! у меня плюсика не видно!!! ..." ... и согласитесь, поведение пользователя логично.
зачем же этот несчастный "плюсик" тогда делать, если его не показывать?!
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
22.11.2013, 15:35
Нашел интересное несоответствие при выделении диапазонов вручную и программным путем. Обнаружить его можно следующим образом:
  1. Объединяем в листе диапазон "A1:B1".
  2. Включаем запись макроса.
  3. Выделяем вручную первый столбец.
  4. Останавливаем запись макроса.
  5. После запуска записанного макроса выделенными окажутся два столбца: столбец "A" и столбец "B", хотя при записи макроса мы выделили только столбец "A".
Чтобы помочь тем, кто столкнулся с той же ситуацией, что и я, выкладываю свою наработку для корректного выделения i-го столбца с объединенными ячейками.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub ColumnSelect(ByVal i As Long)
    Dim col As Range, rng As Range, cell As Range, c As New Collection
    Set col = Columns(i)
    For Each rng In col.Cells
        If rng.MergeCells = False Then
            Set cell = rng
            Exit For
        End If
    Next rng
    For Each rng In Application.Intersect(col, ActiveSheet.UsedRange)
        If rng.MergeCells Then
            c.Add rng.MergeArea
            rng.UnMerge
        End If
    Next rng
    col.Select
    cell.Activate
    For Each rng In c
        rng.Merge
    Next rng
End Sub
С уважением,
Aksima
1
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
22.11.2013, 20:07  [ТС]
Объяснить так и не смог. Причина где-то слишком глубоко в архитектуре самого Excel'я.
Если кто сможет разобраться и сделать какое-то внятное предположение - буду благодарен.

(далее важно полное соответствие всех действий ниже описанным. и СТРОГО никаких других.)
Итак, КВЕСТ:
1. в отдельном приложении (Excel.exe) экселя cоздаем новую книгу (в этом приложении не должно быть открыто никаких других книг)
2. оставляем только "Лист1". остальные удаляем
3. в A1 этого листа пишем формулу ="qwe". выделяем A1 и всегда оставляем ее выделенной (больше не трогаем!)
4. в коде "Лист1" пишем:
Visual Basic
1
2
3
Private Sub qwe()
 ThisWorkbook.Worksheets("Bulk").Delete
End Sub
5. создаем класс "cClass". в коде пишем:
Visual Basic
1
2
Private Sub Class_Terminate()
End Sub
6. создаем класс "cMain". в коде пишем:
Visual Basic
1
2
3
4
5
6
7
8
Private dКоллекцияОтслеживаемыхЛистов As New Collection
 
Private Sub Class_Terminate()
End Sub
 
Public Function fРабочийЛист(dИмяРабочегоЛиста$)
 dКоллекцияОтслеживаемыхЛистов.Add Item:=New cClass, Key:=dИмяРабочегоЛиста$
End Function
7. создаем еще один лист. переименовываем его в "!"
8. в A1 этого листа пишем формулу ="qwe". выделяем A1 и всегда оставляем ее выделенной (больше не трогаем!)
9. на лист кидаем объект ActiveX - CheckBox. просто кидаем и больше ничего не делаем. (другие объекты не пробовал)
10. в коде листа пишем:
Visual Basic
1
2
3
4
5
6
Private dqwe As cMain
 
Private Sub Worksheet_Activate()
 Set dqwe = New cMain
 Call dqwe.fРабочийЛист("")
End Sub
11. лист "!" скрываем
12. СТРОГО: закрываем и книгу(с сохранением в xlsb) и эксель

// P.S.во вложении файл с состоянием всех выше описанных действий

13. открываем новое приложение. закрываем пустую книгу и открываем нашу
14. открываем лист "!" (через "показать скрытый лист")
15. перетягиванием(с Ctrl) из него создаем новый лист и переименовываем его в "Bulk"
16. лист "!" скрываем (остается открытыми "Лист1" и "Bulk")
17. переходим в код и по А5 запускем с "Лист1" функцию qwe

... все, Excel снесло крышу:
1. т.к. остался один "Лист1", то в нем видим в ячейке A1 (в строке формулы) постоянное монотонное мерцание - он постоянно ее перерисовывает
2. постоянная загрузка процессора экселем (% будет зависить от вашего проца - это м.быть и 100% и 50% и 25% ...)
3. пытаемся закрыть книгу. все хорошо. книга закрылась. но ... вот загрука проца - как была, так и осталась.
4. и само приложение само теперь не закрывается ... - только жестко, снятием приложения!

приз: +5 к опыту и полному недоумению
любые несоответствия действий могут привести к тому, что "фокуса" не будет. с именами можно поиграться, но вот с деструктором пустого класса - уже нет. код оптимизирован до минимума многими сотнями и сотнями вариантов запуска ...
есть ОЧЕНЬ смутные предположения, что:
1. при размещении объектов на листе, они как-то очень странно влияют на его уничтожение. возможно что-то остается висеть и после их формального удаления
2. при копировании листов, копируются они не очень чисто ... и ... размещенные сторонние объекты в дальнейшем сохраняют "призрачную" связь
3. ... все слишком и слишком смутно
Не понятно:
1. Какую роль играет пустой класс с пустым конструктором. при его удалении или замене "фокус" пропадает.
2. ... начал писать и понял, что писать бесполезно ... т.к. непонятно совершенно ничего!!!

(по мотивам 2010 64x экселя ... кто попробует в других версиях - пожалуйста, отпишитесь)
Вложения
Тип файла: rar пример.rar (34.1 Кб, 25 просмотров)
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
26.11.2013, 13:51  [ТС]
1. Открываем новую книгу.
2. На том листе, на котором пишем далее формулы, вставляем код:
Visual Basic
1
2
3
Private Function qwe()
 Stop
End Function
2. в A1 пишем =A2
3. в A2 пишем ="qwe"
4. в A3 пишем ="qwe" & A2
5. запускаем qwe ... встаем на Stop и переходим на лист
6. выделяем A3, F2, Enter
7. выдеяем A1 и нажимаем "стрелочку вниз, которая раскрывает строку формулы (справа от строки формулы)"

и видим в A1: ="qwe" & A2 (варианты проявления подобного глюка есть и другие ...)
не понимаю, неужели было сложно протестить такие элементарные вещи перед выпуском продукта, которым пользуются миллионы и миллионы людей!!!
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
28.11.2013, 19:02  [ТС]
продолжаем добрую традицию ...
Сегодня вновь невероятное сочетание операторов и компонентов кода, которые дают эксепшн.
Кода слишком много для публикации. Поэтому, кому интересно, смотрим архив во вложении.
Скажу для затравки, что это некоторое очень тонкое и странное сочетание программного кода, в котором даже удаление элементарного оператора присвоения совершенно нигде не используемой переменной класса приводит к тому, что "фокус" не появляется.

Итак, КВЕСТ:
1. Распаковываем архив
2. Открываем "ЗапускаемыйФайл.xlsb" и правим в qwe() значение dПутьФайлаСФормой$ = "ПроверяемыйФайл.xlsb" на полный путь к файлу с формой.
3. Запускаем qwe() по F5 ... код остановится на Stop в "ЗапускаемыйФайл.xlsb"
4. (видим в оснастке Project Explorer'а в IDE) ... да, файл "ЗапускаемыйФайл.xlsb" действительно открылся и почистился (модули пусты, как и должно быть ... и продолжают висеть(как это и было описано в этой теме, одним из постов ранее))
5. но ... в работе кода открываемого файла "ПроверяемыйФайл.xlsb" не участвует форма ... это не правильно
6. поэтому, мы пытаемся двойным кликом перейти на нее ...

и, чудо! все компоненты файла в оснастке IDE перестроились и удалились все компоненты, которые только что висели! а самое главное! остановился интерпретатор! и останова(выполнения кода) на строке Stop уже нет!
почему?! не знаю ... есть ощущение, что ВОТ ПРИ ТАКОМ КОДЕ (ни строкой меньше!) при переходе на форму у Excel'я сносит крышу и он полностью переинициализирует какую-то собственную архитектуру и архитектуру интерпретатора.
и ведь в коде-то ничего совершенно противозаконного нет ... обидно
Вложения
Тип файла: rar архив.rar (35.0 Кб, 23 просмотров)
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
09.12.2013, 11:42  [ТС]
В продолжение темы Сравнение стоимостей.
Шока нет. Все логично. Однако, есть некоторые странности.
Так,
- a = [A1] работает в 3 раза медленнее a = Range("A1")
- with практически не дает прироста - можно игнорировать
- lCase работает быстрее uCase
- DoEvents ... нет слов! отжимает так, что мало не кажется!
- как и ожидалось - скорость функции зависит не только от количества операций, но и от ее рамера! и может быть узким местом при серьезных скоростных требованиях
- интересно и то, что "Goto в обе стороны" чувствительно быстрее "GoSub + Return"
- For - существенно быстрее любого другого цикла
- и наконец!!! Long быстрее Integer и Dim Long аналогичен использованию "& без объявлений"
- во вложении другие вкусности

P.S. Функции вызовов во вложении стоят только в строках 28, 29 и 36, 27 т.к. файл был пересчитан и чтобы не слетели ранее насчитанные данные - вставлены значением ...
Среда и офис - 64х, памяти навалом, камень i3-2100
1. Велкам с критикой!
2. Описывать структуру не стал - по формулам (кто захочет) разобраться - минутное дело.
3. Продолжение будет.
Вложения
Тип файла: rar АнализСкоростей.rar (78.8 Кб, 41 просмотров)
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
11.12.2013, 15:11  [ТС]
1. создаем пустую книгу
2. пишем на листе код:
Visual Basic
1
2
3
4
5
Private Function qwe()
 While True
  DoEvents
 Wend
End Function
3. код запускаем
4. преходим в эту книгу и удаляем этот лист
5. сохраняем и закрываем эту книгу
6. открываем эту книгу
7. в IDE видим 2 листа типа "ЭтаКнига" ... с единой ссылкой на класс обработчик этого типа
Помощь в поиске оказана anny05.

Добавлено через 3 часа 38 минут
1. берем чистый лист.
2. встаем на C5
3. выделяем строчки с 5 по 20
4. скрываем выделенное
5. ползунок правого скролла плотно прижат к верху (вертикальной) линейки
6. нажимаем левой клавишей мыши на него ... и ... он отскакивает ...
ни при одном другом скрытии областей - такой петрушки не возникает. это нормально? если в моих рассуждениях ошибка - поправьте пожалуйста.

Добавлено через 51 минуту
Если ваш код работает по типу:
Visual Basic
1
2
3
Private Function qwe()
 While True: DoEvents: Wend
End Function
то примечания, указанные в ячейках листа при наведении на них указателя мыши - отражаться не будут (для отражения - надо выбрать "Показать или скрыть примечания").
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
19.12.2013, 17:47  [ТС]
Общий объем памяти Excel под формулы - ограничен. Т.е. если вы используете ну очень очень много формул в книге, то может возникнуть такая ситуация, когда один лишний символ в какой-то формуле приведет к зависанию Excel'я. Т.е. (повторяясь) есть какая-то область памяти (четко ограниченная, или какой-то общий объем) где "располагаются" все формулы ... и если вы перешли рубеж этой памяти, то приложение гибнет. Общий объем формул в книге НЕ БЕЗГРАНИЧЕН!
Для решения таких проблем:
1. Пишите формулы оптимально (см. множественные рекомендации по оптимизации этого процесса в поисковых системах)
2. Пишите специфические собственные маленькие и скоростные обработчики (под ваши задачи), т. как
(пример формулы поиска первого непустого значения с аббревиатурой "НП"="не пусто"). Пример:
Visual Basic
1
2
3
4
5
6
7
8
Public Function fНП(ParamArray Mas())
 For i& = 0 To UBound(Mas)
  If Len(Mas(i&)) > 0 Then
   fНП = Mas(i&): Exit Function
  End If
 Next i&
 fНП = ""
End Function
0
2062 / 491 / 134
Регистрация: 13.11.2008
Сообщений: 935
21.12.2013, 21:47
Цитата Сообщение от Aksima Посмотреть сообщение
Нашел интересное несоответствие при выделении диапазонов вручную и программным путем.
Чтобы помочь тем, кто столкнулся с той же ситуацией, что и я, выкладываю свою наработку для корректного выделения i-го столбца с объединенными ячейками.
Приведу иное решение данной проблемы - без коллекций и разобъединения/повторного объединения ячеек - это слишком затратно по времени, на мой взгляд.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub main()
    Call ColumnSelect(1)
End Sub
 
Sub ColumnSelect(ByVal i As Long)
    Dim col As Range, cell As Range
    Set col = Columns(i)
    For Each cell In col.Cells
        If cell.MergeCells = False Then
            Exit For
        End If
    Next cell
    Application.Goto Reference:=cell.Address(, , xlR1C1) & "," & "R1C" & i & ":R" & Rows.Count & "C" & i
End Sub
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.12.2013, 21:47
Помогаю со студенческими работами здесь

Бывший профессионал cs 1.6 просит решения проблемы
Зайду немного из далека. Мне вот уже под 30 лет, и как бы это смешно не звучало, я до сих пор в свободное от работы время играю в старую...

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

Проблемы с выводом решения на стандартный поток
Вот текст задания: Напишите программу, на вход которой даются четыре числа a, b, c и d, каждое в своей строке. Программа должна...

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru