Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Excel подписвает при копировании ячеек, в дебаге функция - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Excel подписвает при копировании ячеек, в дебаге функция (Макросы/Sub)
Excel подписвает при копировании ячеек, в дебаге функция
rexar Дата: Пятница, 02.12.2016, 18:18 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Зависает excel при копировании, в дебаге направляет на функцию:
[vba]
Код

Public Function заголовоктекста(WRng As Variant, AddRng As Range, Limit As Integer, Optional Chr As String = "", Optional Bln As Boolean = True)

Application.Volatile True
If Len(WRng) > Limit Then
    Select Case Bln = False
        Case True
            заголовоктекста = WRng
        Case False
            заголовоктекста = "-"
    End Select
    Else
End If

For Each x In AddRng
     If Len(WRng & Chr & x) <= Limit Then
        заголовоктекста = WRng & Chr & x
        Exit Function
    Else
    End If
Next x

End Function
[/vba]

Как только удаляю эту функцию, перенаправляет на

[vba]
Код

Function ПереносСлов(Rng1 As Variant, lim1 As Integer)

On Error Resume Next
Application.Volatile True

Dim tt As String
Dim t As String
Dim t0 As String
Dim i As Integer

t = ""
tt = Trim(CStr(Rng1))

If Len(tt) < lim1 Then
    ПереносСлов = tt
    Exit Function
Else
End If

arr1 = VBA.Split(tt)

For i = LBound(arr1) To UBound(arr1)
    t0 = t
    t = t & " " & arr1(i)
    t = Trim(t)
    If Len(t) > lim1 Then
        ПереносСлов = t0
        Exit Function
    Else
    End If
Next i

End Function
[/vba]

Знатоки, подскажите пожалуйста, в чем проблема? :(

Без этих функций всё работает корректно, но они нужны


Сообщение отредактировал rexar - Пятница, 02.12.2016, 18:19
 
Ответить
СообщениеЗависает excel при копировании, в дебаге направляет на функцию:
[vba]
Код

Public Function заголовоктекста(WRng As Variant, AddRng As Range, Limit As Integer, Optional Chr As String = "", Optional Bln As Boolean = True)

Application.Volatile True
If Len(WRng) > Limit Then
    Select Case Bln = False
        Case True
            заголовоктекста = WRng
        Case False
            заголовоктекста = "-"
    End Select
    Else
End If

For Each x In AddRng
     If Len(WRng & Chr & x) <= Limit Then
        заголовоктекста = WRng & Chr & x
        Exit Function
    Else
    End If
Next x

End Function
[/vba]

Как только удаляю эту функцию, перенаправляет на

[vba]
Код

Function ПереносСлов(Rng1 As Variant, lim1 As Integer)

On Error Resume Next
Application.Volatile True

Dim tt As String
Dim t As String
Dim t0 As String
Dim i As Integer

t = ""
tt = Trim(CStr(Rng1))

If Len(tt) < lim1 Then
    ПереносСлов = tt
    Exit Function
Else
End If

arr1 = VBA.Split(tt)

For i = LBound(arr1) To UBound(arr1)
    t0 = t
    t = t & " " & arr1(i)
    t = Trim(t)
    If Len(t) > lim1 Then
        ПереносСлов = t0
        Exit Function
    Else
    End If
Next i

End Function
[/vba]

Знатоки, подскажите пожалуйста, в чем проблема? :(

Без этих функций всё работает корректно, но они нужны

Автор - rexar
Дата добавления - 02.12.2016 в 18:18
Alex_ST Дата: Пятница, 02.12.2016, 22:43 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну вы бы хоть указали, на какой строке вылетает и что при этом говорит дебаггер.
Но, не вдаваясь в суть Ваших макросов, чаще всего причиной подвисания является массовый пересчёт ячеек листов.
Чтобы избежать тормозов и подвисаний в самом начале процедуры отключите всё, что может тормозить: обновление экрана, вывод сообщений, обработка событий !!!, пересчёт листа !!!
[vba]
Код
With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba]
а по окончании - включите всё обратно:
[vba]
Код
With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
[/vba]
[offtop]У меня эти "волшебные слова", так же как и некоторые другие часто употребляемые выражения добавлены в список автозамены Punto Switcher'a и им назначены короткие аббревиатуры. Например, введённое app-true заменяется на With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
app-false - на With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: .Calculation = xlManual: End With
deb-pr - на Debug.Print
mbx - на MsgBox
и т.п. ОЧЕНЬ УДОБНО! РЕКОМЕНДУЮ.[/offtop]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Пятница, 02.12.2016, 22:46
 
Ответить
СообщениеНу вы бы хоть указали, на какой строке вылетает и что при этом говорит дебаггер.
Но, не вдаваясь в суть Ваших макросов, чаще всего причиной подвисания является массовый пересчёт ячеек листов.
Чтобы избежать тормозов и подвисаний в самом начале процедуры отключите всё, что может тормозить: обновление экрана, вывод сообщений, обработка событий !!!, пересчёт листа !!!
[vba]
Код
With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba]
а по окончании - включите всё обратно:
[vba]
Код
With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
[/vba]
[offtop]У меня эти "волшебные слова", так же как и некоторые другие часто употребляемые выражения добавлены в список автозамены Punto Switcher'a и им назначены короткие аббревиатуры. Например, введённое app-true заменяется на With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
app-false - на With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: .Calculation = xlManual: End With
deb-pr - на Debug.Print
mbx - на MsgBox
и т.п. ОЧЕНЬ УДОБНО! РЕКОМЕНДУЮ.[/offtop]

Автор - Alex_ST
Дата добавления - 02.12.2016 в 22:43
rexar Дата: Суббота, 03.12.2016, 10:51 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Alex_ST, дебагер направляет на саму функцию. на

[vba]
Код

Function ПереносСлов(Rng1 As Variant, lim1 As Integer)
[/vba]
 
Ответить
СообщениеAlex_ST, дебагер направляет на саму функцию. на

[vba]
Код

Function ПереносСлов(Rng1 As Variant, lim1 As Integer)
[/vba]

Автор - rexar
Дата добавления - 03.12.2016 в 10:51
rexar Дата: Суббота, 03.12.2016, 11:03 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Alex_ST, к сожалению не помогает :(
 
Ответить
СообщениеAlex_ST, к сожалению не помогает :(

Автор - rexar
Дата добавления - 03.12.2016 в 11:03
Udik Дата: Суббота, 03.12.2016, 13:42 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Может таки уже выложите файл-пример.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
СообщениеМожет таки уже выложите файл-пример.

Автор - Udik
Дата добавления - 03.12.2016 в 13:42
Alex_ST Дата: Суббота, 03.12.2016, 14:32 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Опять же не пытаясь догадаться, какие аргументы Вы сообщаете функциям и какие результаты ожидаете получить, а только рассматривая код и размерности переменных, можно сказать, что:
1. Зачем у Вас везде ставится Application.Volatile True ? Это скорее всего не обязательно, а работу тормозит сильно.
2. Функция ЗаголовокТекста в принципе может подтормаживать из-за прямого обращения к ячейкам листа в цикле. Функция ПереносСлов вообще работает только с переданными ей аргументами и не должна тормозить.
3. Ну и с If...Then/Else/End If с Select Case Вы что-то, похоже, перемудрили.
Попробуйте так:
И главный совет: Опция Option Explicit очень полезная штука, помогающая легко отловить ошибки. ОБЪЯВЛЯЙТЕ ВСЕ ПЕРЕМЕННЫЕ!



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеОпять же не пытаясь догадаться, какие аргументы Вы сообщаете функциям и какие результаты ожидаете получить, а только рассматривая код и размерности переменных, можно сказать, что:
1. Зачем у Вас везде ставится Application.Volatile True ? Это скорее всего не обязательно, а работу тормозит сильно.
2. Функция ЗаголовокТекста в принципе может подтормаживать из-за прямого обращения к ячейкам листа в цикле. Функция ПереносСлов вообще работает только с переданными ей аргументами и не должна тормозить.
3. Ну и с If...Then/Else/End If с Select Case Вы что-то, похоже, перемудрили.
Попробуйте так:
И главный совет: Опция Option Explicit очень полезная штука, помогающая легко отловить ошибки. ОБЪЯВЛЯЙТЕ ВСЕ ПЕРЕМЕННЫЕ!

Автор - Alex_ST
Дата добавления - 03.12.2016 в 14:32
Wasilich Дата: Суббота, 03.12.2016, 16:54 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
дебагер направляет на саму функцию. на
Откуда направляет? Из кода макроса? Так покажите его.
Вас же просили:
Ну вы бы хоть указали, на какой строке вылетает и что при этом говорит дебаггер.


Сообщение отредактировал Wasilich - Воскресенье, 04.12.2016, 01:15
 
Ответить
Сообщение
дебагер направляет на саму функцию. на
Откуда направляет? Из кода макроса? Так покажите его.
Вас же просили:
Ну вы бы хоть указали, на какой строке вылетает и что при этом говорит дебаггер.

Автор - Wasilich
Дата добавления - 03.12.2016 в 16:54
Alex_ST Дата: Суббота, 03.12.2016, 20:04 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Василич, подправь в посте автора первой цитаты, пожалуйста. Я такого не писАл :)
rexar, к стати, посмотрел повнимательнее на ПереносСлов чтобы выяснить корректность применения On Error Resume Next и понял, что кдинственное (кажется) возможное место возникновения ошибки - это команда arr1 = Split(tt), которая выдаст ошибку если в tt нет ни одного пробела.
Ну так это решается намного проще: делайте arr1 = Split(tt), а потом цикл по всем этементам массива кроме последнего.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеВасилич, подправь в посте автора первой цитаты, пожалуйста. Я такого не писАл :)
rexar, к стати, посмотрел повнимательнее на ПереносСлов чтобы выяснить корректность применения On Error Resume Next и понял, что кдинственное (кажется) возможное место возникновения ошибки - это команда arr1 = Split(tt), которая выдаст ошибку если в tt нет ни одного пробела.
Ну так это решается намного проще: делайте arr1 = Split(tt), а потом цикл по всем этементам массива кроме последнего.

Автор - Alex_ST
Дата добавления - 03.12.2016 в 20:04
Alex_ST Дата: Суббота, 03.12.2016, 20:25 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
И ещё: появилось у меня подозрение, что Split'ом и последующим Trim'ом в цикле по элементам массива Вы убираете задвоенные пробелы в середине стринга.
Так для этого же есть функция листа СЖПРОБЕЛЫ, которая удаляет не только пробелы в начале и конце стринга аргумента, но и все многократные пробелы в середине заменяет на одинарные.
Из VBA при необходимости её можно использовать, например, так [vba]
Код
sText = Application.WorksheetFunction.Trim(sText)
[/vba]или в сокращённой записи (но у некоторых почему-то иногда ругается) [vba]
Код
sText = Application.Trim(sText)
[/vba]Я, например, уже давным-давно у себя на панели сделал специальную кнопку для вызова такого макроса очистки выделенного диапазона от плодов трудов "специалистов", выравнивающих тексты в ячейках пробелами:
P.S. Select в конце процедуры, конечно не обязателен, но и стоит не просто так, а чтобы по окончании обработки были видны обработанные макросом ячейки



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Суббота, 03.12.2016, 20:28
 
Ответить
СообщениеИ ещё: появилось у меня подозрение, что Split'ом и последующим Trim'ом в цикле по элементам массива Вы убираете задвоенные пробелы в середине стринга.
Так для этого же есть функция листа СЖПРОБЕЛЫ, которая удаляет не только пробелы в начале и конце стринга аргумента, но и все многократные пробелы в середине заменяет на одинарные.
Из VBA при необходимости её можно использовать, например, так [vba]
Код
sText = Application.WorksheetFunction.Trim(sText)
[/vba]или в сокращённой записи (но у некоторых почему-то иногда ругается) [vba]
Код
sText = Application.Trim(sText)
[/vba]Я, например, уже давным-давно у себя на панели сделал специальную кнопку для вызова такого макроса очистки выделенного диапазона от плодов трудов "специалистов", выравнивающих тексты в ячейках пробелами:
P.S. Select в конце процедуры, конечно не обязателен, но и стоит не просто так, а чтобы по окончании обработки были видны обработанные макросом ячейки

Автор - Alex_ST
Дата добавления - 03.12.2016 в 20:25
rexar Дата: Суббота, 03.12.2016, 21:58 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Alex_ST, Дебагер пишет code execution has been interrupted. Срабатывает абсолютно на любой строке
 
Ответить
СообщениеAlex_ST, Дебагер пишет code execution has been interrupted. Срабатывает абсолютно на любой строке

Автор - rexar
Дата добавления - 03.12.2016 в 21:58
rexar Дата: Суббота, 03.12.2016, 21:59 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Alex_ST, попробовал Вашу функцию, к сожалению не работает :(
 
Ответить
СообщениеAlex_ST, попробовал Вашу функцию, к сожалению не работает :(

Автор - rexar
Дата добавления - 03.12.2016 в 21:59
rexar Дата: Суббота, 03.12.2016, 22:03 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Не понимаю, может это у меня что с excel, потому, что удалил все функции, которые писал выше, всё нормально, через некоторое время при копировании ячейки та же проблема, но направляем уже на простейшую функцию...
 
Ответить
СообщениеНе понимаю, может это у меня что с excel, потому, что удалил все функции, которые писал выше, всё нормально, через некоторое время при копировании ячейки та же проблема, но направляем уже на простейшую функцию...

Автор - rexar
Дата добавления - 03.12.2016 в 22:03
Pelena Дата: Суббота, 03.12.2016, 22:23 | Сообщение № 13
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
code execution has been interrupted

Посмотрите здесь
Почитайте там статью по ссылке


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
code execution has been interrupted

Посмотрите здесь
Почитайте там статью по ссылке

Автор - Pelena
Дата добавления - 03.12.2016 в 22:23
Alex_ST Дата: Суббота, 03.12.2016, 22:38 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
направляем уже на простейшую функцию...
а вот это уже бывало...
При этом вылетать может на простейших стандартных встроенных функциях VB
Кажется проблемы были в референсах.
Проверьте, нет ли битых ссылок на библиотеки в Tools-References



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
направляем уже на простейшую функцию...
а вот это уже бывало...
При этом вылетать может на простейших стандартных встроенных функциях VB
Кажется проблемы были в референсах.
Проверьте, нет ли битых ссылок на библиотеки в Tools-References

Автор - Alex_ST
Дата добавления - 03.12.2016 в 22:38
rexar Дата: Воскресенье, 04.12.2016, 13:30 | Сообщение № 15
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Alex_ST, проверил, битых ссылок на библиотеки нет. Странно, сейчас вроде копирует нормально, без пересчёта, ничего не понимаю... %)
Спасибо большое! :)

А в чем ещё может быть проблема?
 
Ответить
СообщениеAlex_ST, проверил, битых ссылок на библиотеки нет. Странно, сейчас вроде копирует нормально, без пересчёта, ничего не понимаю... %)
Спасибо большое! :)

А в чем ещё может быть проблема?

Автор - rexar
Дата добавления - 04.12.2016 в 13:30
Alex_ST Дата: Воскресенье, 04.12.2016, 19:46 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Что копирует? Куда копирует? Никакого копирования в рассматривавшихся функциях нет!
Вообще не понятно, в составе какого проекта Вы их хотите использовать и какие операции производятся перед вызовом функций.
В процедурах рассматривавшихся здесь функций никаких тонкостей, которые могут вызвать зависание, нет.
Но Вы, похоже, работаете без Option Explicit, поэтому вполне возможно, что происходит пересечение переменных с другими, объявленными в проекте.
------------------------------------------------
Вы сначала пишете
копирует нормально, без пересчёта
но при этом абсолютно не поясняете, с использованием каких процедур? Ваших, выложенных в первом посте или одним из нескольких вариантов, исправленных мною?
А потом:
А в чем ещё может быть проблема?
Блин, я не понимаю, у Вас таки-заработало нормально или нет?



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 05.12.2016, 08:42
 
Ответить
СообщениеЧто копирует? Куда копирует? Никакого копирования в рассматривавшихся функциях нет!
Вообще не понятно, в составе какого проекта Вы их хотите использовать и какие операции производятся перед вызовом функций.
В процедурах рассматривавшихся здесь функций никаких тонкостей, которые могут вызвать зависание, нет.
Но Вы, похоже, работаете без Option Explicit, поэтому вполне возможно, что происходит пересечение переменных с другими, объявленными в проекте.
------------------------------------------------
Вы сначала пишете
копирует нормально, без пересчёта
но при этом абсолютно не поясняете, с использованием каких процедур? Ваших, выложенных в первом посте или одним из нескольких вариантов, исправленных мною?
А потом:
А в чем ещё может быть проблема?
Блин, я не понимаю, у Вас таки-заработало нормально или нет?

Автор - Alex_ST
Дата добавления - 04.12.2016 в 19:46
rexar Дата: Вторник, 06.12.2016, 18:20 | Сообщение № 17
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Alex_ST, удалил функцию заголовок и проверил на битые ссылки, сохранил в новом формате и всё, вроде сейчас всё работает. Огромное спасибо! :) удачи Вам в изучении excel и vba :)
 
Ответить
СообщениеAlex_ST, удалил функцию заголовок и проверил на битые ссылки, сохранил в новом формате и всё, вроде сейчас всё работает. Огромное спасибо! :) удачи Вам в изучении excel и vba :)

Автор - rexar
Дата добавления - 06.12.2016 в 18:20
Alex_ST Дата: Вторник, 06.12.2016, 20:48 | Сообщение № 18
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
удачи Вам в изучении excel и vba
я, конечно, понимаю, что как Excel, так и VBA в принципе на 100% непостижимы… Поэтому и мне наверняка есть ещё что там поизучать :D victory



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
удачи Вам в изучении excel и vba
я, конечно, понимаю, что как Excel, так и VBA в принципе на 100% непостижимы… Поэтому и мне наверняка есть ещё что там поизучать :D victory

Автор - Alex_ST
Дата добавления - 06.12.2016 в 20:48
rexar Дата: Пятница, 09.12.2016, 17:58 | Сообщение № 19
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Alex_ST, что-то ничего не понимаю, проблема опять появилась, хотя ничего не делал...
 
Ответить
СообщениеAlex_ST, что-то ничего не понимаю, проблема опять появилась, хотя ничего не делал...

Автор - rexar
Дата добавления - 09.12.2016 в 17:58
Alex_ST Дата: Пятница, 09.12.2016, 20:34 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
rexar, штатной гадалки сейчас на форуме нет.
А т.к. Вы упорно не отвечаете, какими из выложенных в топике процедур пользуетесь и для чего, то угадать почему и на чём зависает некому.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщениеrexar, штатной гадалки сейчас на форуме нет.
А т.к. Вы упорно не отвечаете, какими из выложенных в топике процедур пользуетесь и для чего, то угадать почему и на чём зависает некому.

Автор - Alex_ST
Дата добавления - 09.12.2016 в 20:34
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Excel подписвает при копировании ячеек, в дебаге функция (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!