Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

Макрос не сортирует (вылетает) после перехода с офиса 2013 на 2016

Автор ABSh, 15.01.2020, 12:19:40

« назад - далее »

ABSh

Здравствуйте уважаемые форумчане!
Прошу помощи в правке макроса. Сам имею зачаточные знания ВБА, поэтому в основном записываю небольшие макросы через встроенный макрорекордер, могу слегка подкорректировать :(
Смысл макроса простой - приводит открытый файл в нужный вид, удаляя некоторые столбцы, вытаскивает из эталонного файла значения для сравнения, сортирует выделенное по дате/времени и копирует в новый файл.
После смены компьютера и перехода на офис 2016 макрос стал вылетать на этапе сортировки (строка подсвечена красным).

Sub withError()
'
' withError Макрос
'

'
   Columns("B:C").Select
   Selection.Delete Shift:=xlToLeft
   Columns("C:E").Select
   Selection.Delete Shift:=xlToLeft
   Columns("G:M").Select
   Selection.Delete Shift:=xlToLeft
   Columns("F:F").Select
   Selection.Cut
   Columns("B:B").Select
   Selection.Insert Shift:=xlToRight
   
   Range("G11").Select
   ActiveCell.FormulaR1C1 = "=ROUND((RC[-6]*1)&(RC[-5]*1),7)"
   Range("H11").Select
   ActiveCell.FormulaR1C1 = _
       "=VLOOKUP(RC7,'C:\[Медиаскоп текущий.xlsx]Лист1'!C1:C29,2,0)"
   Range("I11").Select
   Selection.NumberFormat = "[h]:mm:ss;@"
   ActiveCell.FormulaR1C1 = _
       "=VLOOKUP(RC7,'C:\[Медиаскоп текущий.xlsx]Лист1'!C1:C29,9,0)"
   Range("J11").Select
   ActiveCell.FormulaR1C1 = _
       "=VLOOKUP(RC7,'C:\[Медиаскоп текущий.xlsx]Лист1'!C1:C29,11,0)"
   
   lr = Cells(Rows.Count, 2).End(xlUp).Row
   Range("G11:J11").AutoFill Destination:=Range("G11:J" & lr), Type:=xlFillDefault
   Range("E11").Select
   Selection.NumberFormat = "General"
   ActiveCell.FormulaR1C1 = _
       "=IF(RC[5]=""Ролик"",""Ролик"",IF(RC[5]=""Спонсорская заставка"",""Спонсорская заставка"",IF(RC[5]=""Анонс: спонсорская заставка"",""Спонсорская заставка"",""Спонсор показа"")))"
   Range("E11").AutoFill Destination:=Range("E11:E" & lr), Type:=xlFillDefault
   
   
   Range("A11:F" & lr).Select
   [glow=red,2,300]ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear[/glow]      
   ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range("A11:A" & lr), _
       SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
       xlSortTextAsNumbers
   ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range("B11:B" & lr), _
       SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
       xlSortTextAsNumbers
   With ActiveWorkbook.ActiveSheet.Sort
       .SetRange Range("A10:F" & lr)
       .Header = xlYes
       .MatchCase = False
       .Orientation = xlTopToBottom
       .SortMethod = xlPinYin
       .Apply
   End With

   
   Selection.Copy
   Workbooks.Open Filename:="C:\Рыба1.xlsx"
   Range("B2").Select
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False
       
   ler = Cells(Rows.Count, 2).End(xlUp).Row
   lep = Cells(Rows.Count, 1).End(xlUp).Row
   Rows((ler + 1) & ":" & lep).Select
   Selection.Delete Shift:=xlUp
   Range("A1:G" & (ler + 2)).Select
   
   Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ЕОШИБКА(A1)"
   Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
   With Selection.FormatConditions(1).Interior
       .PatternColorIndex = xlAutomatic
       .Color = 65535
       .TintAndShade = 0
   End With
   Selection.FormatConditions(1).StopIfTrue = False

End Sub

[admin]Коды оформляйте тегами VBCode. п.п. 4.25 Правил форума[/admin]

ABSh

Забыл добавить - ошибка следующая:

Run-tine error '9':
Subscript out of range

Дмитрий Щербаков(The_Prist)

Файл приложите с данными. Не уверен, но может где-то в самом коде ошибка при определенных данных, которую 2013 "проглатывал", а 2016 отказывается. Но это не точно.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

ABSh


boa

После очередного обновления MSO у меня был глюк, когда Excel не понимал ActiveSheet
Я его обошел следующей конструкцией
вместоActiveWorkbook.ActiveSheet напишите Application.ActiveCell.Parent
Должно помочь.
У меня сейчас работают обе конструкции, но глюк имел место...

И еще, не используйте Селекты без надобности
строки
    Columns("B:C").Select
    Selection.Delete Shift:=xlToLeft

можно смело заменить на
Columns("B:C").Delete Shift:=xlToLeft
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра


ABSh

Увы, не помогло  :(
А большое количество Селектов остались от макрорекордера. В связи с неглубокими познаниями предпочитаю сильно не трогать то, что работает...

Дмитрий Щербаков(The_Prist)

Попробуйте добавить перед проблемной строкой такое:
Dim ws as worksheet
set ws = activecell.worksheet
'а это уже Ваш код с небольшими правками, учитывающими строки выше
ws.Sort.SortFields.Clear       
    ws.Sort.SortFields.Add Key:=Range("A11:A" & lr), _ 
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
        xlSortTextAsNumbers 
    ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range("B11:B" & lr), _ 
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
        xlSortTextAsNumbers 
    With ws.Sort 
        .SetRange Range("A10:F" & lr) 
        .Header = xlYes 
        .MatchCase = False 
        .Orientation = xlTopToBottom 
        .SortMethod = xlPinYin 
        .Apply 
    End With
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

ABSh

Дмитрий, ОГРОМНОЕ СПАСИБО!
Заработало!!! Естественно, после замены еще одного куска кода на переменную ws  ;)
Если не сложно, поясните с чем эта проблема может быть связана? С элементами ActiveX?

Дмитрий Щербаков(The_Prist)

#8
Нет, с определением объектов вроде ActiveSheet при обращении из кода. Это проблема была озвучена, для её правки выпускался fix, но ссылку сейчас дать не могу - лень искать :)
Кстати, настоятельно рекомендую ознакомиться: Select и Activate - зачем нужны и нужны ли?
В будущем может избавить от кучи проблем.
И элементы типа ActiveX я бы тоже настоятельно рекомендовал не использовать. Проблемы с ним были и весьма неприятные. Вот описание одной из них: Элементы ActiveX перестали работать или ведут себя непредсказуемо
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Яндекс.Метрика Рейтинг@Mail.ru