Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2009, 16:58   #1
Fierce
Пользователь
 
Регистрация: 11.04.2009
Сообщений: 29
По умолчанию Переименование OLEObjects

При написании кода столкнулся с проблемой. На листе есть несколько элементов управления, в названиях которых меняется последние цифры. Нужно удалить все элементы, у которых цифра в конце например равна 1. А все элементы, у которых в конце цифра например 5, переименовать, заменить пятерку на единицу.
Вот код:
Код:
Dim iObject As OLEObject
For Each iObject In Me.OLEObjects
    If iObject.Name Like "*" & 1 Then
        iObject.Delete
    End If
Next

For Each iObject In Me.OLEObjects
    If iObject.Name Like "*" & 5 Then
        iObject.Name = Left(iObject.Name, Len(iObject.Name) - 1) & 1
    End If
Next
Вроде все правильно, только этот код или половину обьектов переименует, или вообще ничего не переименует. Почему так происходит?
Вложения
Тип файла: rar OLEObjects.rar (9.3 Кб, 9 просмотров)
Fierce вне форума Ответить с цитированием
Старый 24.04.2009, 17:04   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Вроде все правильно, только этот код или половину обьектов переименует, или вообще ничего не переименует
Да не вроде, а всё правильно.
У меня код работает в точности так, как ему и полагается.
(Excel 2003, WinXP sp2)

Могу лишь предложить чуточку сократить и ускорить код:
Код:
Private Sub Button_Click()
    Application.ScreenUpdating = False
    Dim iObject As OLEObject
    For Each iObject In Me.OLEObjects
        Select Case Right(iObject.Name, 1)
            Case 1: iObject.Delete
            Case 5: iObject.Name = Left(iObject.Name, Len(iObject.Name) - 1) & 1
        End Select
    Next
End Sub

Последний раз редактировалось EducatedFool; 24.04.2009 в 17:06.
EducatedFool вне форума Ответить с цитированием
Старый 24.04.2009, 17:26   #3
Fierce
Пользователь
 
Регистрация: 11.04.2009
Сообщений: 29
По умолчанию

За оптимизацию кода спасибо, вот только на моем экселе он тоже не работает так как надо (стоит office xp sp2). Буду пробовать на другом
Fierce вне форума Ответить с цитированием
Старый 24.04.2009, 18:51   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Нужно смотреть в пошаговом режиме. Какое имя OLEObject возвращается? И все ли имена компонентов проходят через цикл.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 25.04.2009, 17:00   #5
Fierce
Пользователь
 
Регистрация: 11.04.2009
Сообщений: 29
По умолчанию

Попробовал я на Excel 2003, эффект тот же. Причем заметил, если код такой:
Код:
Dim iObject As OLEObject
For Each iObject In Me.OLEObjects
    If iObject.Name Like "*" & 1 Then
        iObject.Delete
    End If
Next

For Each iObject In Me.OLEObjects
    If iObject.Name Like "*" & 5 Then
        iObject.Name = Left(iObject.Name, Len(iObject.Name) - 1) & 1
    End If
Next
Ну или тот, что предложил EducatedFool. Не переименовываеться ни один из объектов.

Если код немного переделать
Код:
Private Sub Button_Click()
Dim iObject As OLEObject
For Each iObject In Me.OLEObjects
    If iObject.Name Like "*" & 1 Then
        iObject.Delete
    End If
Next
Call ppp
End Sub

Sub ppp()
For Each iObject In Me.OLEObjects
    If iObject.Name Like "*" & 5 Then
        iObject.Name = Left(iObject.Name, Len(iObject.Name) - 1) & 1
    End If
Next
End Sub
То переименовываеться все, кроме крайнего правого комбобокса, он так и остаеться ComboBox5_5.

viter.alex А как просмотреть в пошаговом режиме?
Fierce вне форума Ответить с цитированием
Старый 25.04.2009, 19:20   #6
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

нажми F8 - пошаговое выполнение
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 25.04.2009, 21:49   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Fierce Посмотреть сообщение
viter.alex А как просмотреть в пошаговом режиме?
  1. На строчке, где начинается первый цикл, поставь курсор и нажми F9. Строка подсветится, а слева появится кружок. Это — Breakpoint, точка останова.
  2. Затем нажимаешь F5 (запуск программы). Когда выполнение программы дойдет этой строчки, то оно остановится, строка подсветится и слева появится стрелка, указывающая следующую строку кода, которая будет выполняться.
  3. Теперь в меню View выбираешь пункт Locals Window. Это для того, чтобы наблюдать за изменением значений объявленных переменных.
  4. А дальше выполняешь каждую строку кода, нажимая F8 (пошаговое выполнение), и смотришь, где у тебя логическая ошибка.
  5. Если тебе нужно отследить произвольное выражение, а не объявленной переменной, то для этого есть окно Watch: выдели выражение, которое хочешь отследить, нажми на нем правой кнопкой и выбери в меню пункт Add Watch
Дальше, я думаю, сам разберешься.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 26.04.2009, 00:02   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Запустите такой код:

Код:
Private Sub Button_Click()
    Application.ScreenUpdating = False: On Error Resume Next
    [a20:j500].ClearContents
    [a20] = "Имя объекта": [e20] = "Действие": [j20] = "Результат"
    Dim iObject As OLEObject, cell As Range
    For Each iObject In Me.OLEObjects
        Set cell = Range("a65000").End(xlUp).Offset(1)
        cell = "Найден объект:  " & iObject.Name
        Select Case Right(iObject.Name, 1)
            Case 1:
                cell(1, 5) = "Будем пытаться удалить объект ..."
                iObject.Delete
                Err.Clear: Debug.Print iObject.Name
                cell(1, 10) = IIf(Err.Number > 0, "Объект успешно удалён", "Не удалось удалить объект")
            Case 5:
                cell(1, 5) = "Будем пытаться переименовать объект ..."
                СтароеИмя = iObject.Name
                iObject.Name = Left(iObject.Name, Len(iObject.Name) - 1) & 1
                cell(1, 10) = IIf(СтароеИмя <> iObject.Name, "Объект успешно переименован", "Не удалось переименовать объект")
        End Select
    Next
End Sub
На листе увидите что-то вроде этого:
Цитата:
Имя объекта Действие Результат
Найден объект: ComboBox1_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox2_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox3_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox4_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox5_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox1_2
Найден объект: ComboBox2_2
Найден объект: ComboBox3_2
Найден объект: ComboBox4_2
Найден объект: ComboBox5_2
Найден объект: ComboBox1_3
Найден объект: ComboBox2_3
Найден объект: ComboBox3_3
Найден объект: ComboBox4_3
Найден объект: ComboBox5_3
Найден объект: ComboBox1_4
Найден объект: ComboBox2_4
Найден объект: ComboBox3_4
Найден объект: ComboBox4_4
Найден объект: ComboBox5_4
Найден объект: ComboBox1_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: ComboBox2_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: ComboBox3_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: ComboBox4_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: ComboBox5_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: Button
После выполнения кода сообщите о результатах его работы.
EducatedFool вне форума Ответить с цитированием
Старый 26.04.2009, 12:44   #9
Fierce
Пользователь
 
Регистрация: 11.04.2009
Сообщений: 29
По умолчанию

viter.alex Спасибо за разьеснения

EducatedFool
Цитата:
Имя объекта Действие Результат
Найден объект: ComboBox1_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox2_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox3_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox4_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox5_1 Будем пытаться удалить объект ... Объект успешно удалён
Найден объект: ComboBox1_2
Найден объект: ComboBox2_2
Найден объект: ComboBox3_2
Найден объект: ComboBox4_2
Найден объект: ComboBox5_2
Найден объект: ComboBox1_3
Найден объект: ComboBox2_3
Найден объект: ComboBox3_3
Найден объект: ComboBox4_3
Найден объект: ComboBox5_3
Найден объект: ComboBox1_4
Найден объект: ComboBox2_4
Найден объект: ComboBox3_4
Найден объект: ComboBox4_4
Найден объект: ComboBox5_4
Найден объект: ComboBox1_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: ComboBox2_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: ComboBox3_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: ComboBox4_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: ComboBox5_5 Будем пытаться переименовать объект ... Объект успешно переименован
Найден объект: Button
Но почему тогда не срабатывает, например, ComboBox1_1_Change() на переименованном объекте, да и в свойствах имя остаеться прежним?
Fierce вне форума Ответить с цитированием
Старый 26.04.2009, 13:21   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Замените в последнем макросе последнюю строку на такую:
Код:
cell(1, 10) = IIf(СтароеИмя <> iObject.Name, "Объект успешно переименован в " & iObject.Name, "Не удалось переименовать объект")
Тогда увидите, что получается в результате переименования:

Цитата:
Найден объект: ComboBox1_5 Будем пытаться переименовать объект ... Объект успешно переименован в ComboBox1_1
Найден объект: ComboBox2_5 Будем пытаться переименовать объект ... Объект успешно переименован в ComboBox2_1
Найден объект: ComboBox3_5 Будем пытаться переименовать объект ... Объект успешно переименован в ComboBox3_1
Найден объект: ComboBox4_5 Будем пытаться переименовать объект ... Объект успешно переименован в ComboBox4_1
Найден объект: ComboBox5_5 Будем пытаться переименовать объект ... Объект успешно переименован в ComboBox5_1
У меня всё работает как надо...
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переименование файла Патрон Общие вопросы Delphi 17 09.04.2008 16:50