Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/334: Рейтинг темы: голосов - 334, средняя оценка - 4.86
Апострофф
Заблокирован
27.03.2013, 13:19 21
StepInLik, это не баг.
Для модальной формы код должен выглядеть примерно так-
Visual Basic
1
2
3
4
 UserForm_Форма.StartUpPosition = 0
 UserForm_Форма.Left = 50
 UserForm_Форма.Top = 50
 UserForm_Форма.Show
ибо по Вашему варианту 3, 4 и 5-я строки выполнятся только после закрытия модальной формы, что вполне логично.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2013, 13:19
Ответы с готовыми решениями:

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

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

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

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

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

118
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
16.04.2013, 16:26  [ТС] 22
А вы знали, что 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
Казанский
14308 / 5926 / 1570
Регистрация: 24.09.2011
Сообщений: 9,336
16.04.2013, 16:35 23
Да, неожиданно. А так: Evaluate "ZZZ()+ZZZ()" - тоже 2 раза,
так: Evaluate "ZZZ()+ZZZ()+ZZZ()" - 3 раза.
0
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
16.04.2013, 18:30  [ТС] 24
(описанные ниже проблемы возникают редко, мы встречались с ними на 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
5278 / 1351 / 320
Регистрация: 23.12.2010
Сообщений: 2,019
Записей в блоге: 1
03.10.2013, 17:01 25
Окно Immediate:
Visual Basic
1
Debug.Print 255*400
или любое место в коде:
Visual Basic
1
Dim n!: n=255*400
вызывает ошибку Overflow
255.001*400 '-уже не вызывает
1
Апострофф
Заблокирован
03.10.2013, 18:21 26
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
1
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
22.10.2013, 14:08  [ТС] 27
Открываем чистую книгу. Делаем все как написано в 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
Аксима
5846 / 1267 / 188
Регистрация: 12.12.2012
Сообщений: 990
24.10.2013, 11:14 28
Цитата Сообщение от StepInLik Посмотреть сообщение
ловим глюки!
Ловил, но не поймал .

С уважением,
Aksima
0
Вложения
Тип файла: rar LabelsTest.rar (12.0 Кб, 13 просмотров)
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
24.10.2013, 15:55  [ТС] 29
Не стал разбираться с вашим файлом. Во вложении глючный.
0
Вложения
Тип файла: rar 2013.10.22 - test.rar (14.5 Кб, 14 просмотров)
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
25.10.2013, 17:51  [ТС] 30
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
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
29.10.2013, 15:39  [ТС] 31
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
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
21.11.2013, 12:32  [ТС] 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
Аксима
5846 / 1267 / 188
Регистрация: 12.12.2012
Сообщений: 990
22.11.2013, 15:35 33
Нашел интересное несоответствие при выделении диапазонов вручную и программным путем. Обнаружить его можно следующим образом:
  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
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
22.11.2013, 20:07  [ТС] 34
Объяснить так и не смог. Причина где-то слишком глубоко в архитектуре самого 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 экселя ... кто попробует в других версиях - пожалуйста, отпишитесь)
0
Вложения
Тип файла: rar пример.rar (34.1 Кб, 12 просмотров)
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
26.11.2013, 13:51  [ТС] 35
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
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
28.11.2013, 19:02  [ТС] 36
продолжаем добрую традицию ...
Сегодня вновь невероятное сочетание операторов и компонентов кода, которые дают эксепшн.
Кода слишком много для публикации. Поэтому, кому интересно, смотрим архив во вложении.
Скажу для затравки, что это некоторое очень тонкое и странное сочетание программного кода, в котором даже удаление элементарного оператора присвоения совершенно нигде не используемой переменной класса приводит к тому, что "фокус" не появляется.

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

и, чудо! все компоненты файла в оснастке IDE перестроились и удалились все компоненты, которые только что висели! а самое главное! остановился интерпретатор! и останова(выполнения кода) на строке Stop уже нет!
почему?! не знаю ... есть ощущение, что ВОТ ПРИ ТАКОМ КОДЕ (ни строкой меньше!) при переходе на форму у Excel'я сносит крышу и он полностью переинициализирует какую-то собственную архитектуру и архитектуру интерпретатора.
и ведь в коде-то ничего совершенно противозаконного нет ... обидно
0
Вложения
Тип файла: rar архив.rar (35.0 Кб, 11 просмотров)
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
09.12.2013, 11:42  [ТС] 37
В продолжение темы Сравнение стоимостей.
Шока нет. Все логично. Однако, есть некоторые странности.
Так,
- 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. Продолжение будет.
0
Вложения
Тип файла: rar АнализСкоростей.rar (78.8 Кб, 22 просмотров)
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
11.12.2013, 15:11  [ТС] 38
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
StepInLik
1062 / 100 / 4
Регистрация: 19.12.2012
Сообщений: 423
19.12.2013, 17:47  [ТС] 39
Общий объем памяти 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
The_Prist
1302 / 283 / 63
Регистрация: 13.11.2008
Сообщений: 589
21.12.2013, 21:47 40
Цитата Сообщение от 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
21.12.2013, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2013, 21:47

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

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

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


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

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

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