Страницы: 1
RSS
Конфликт макросов
 
Пытался найти решение в других темах,но увы, либо не нашел, либо не понял......

Есть 2 макроса:
Макрос1 - борется со вставками, разрешая только вставку значений.
Макрос2 - переносит данные(определенные ячейки) из одного файла (любого) в свой файл (1.xlsm)

Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'Макрос1 - для вставка только значений
    If Application.CutCopyMode Then
        Application.EnableEvents = 0
        Application.Undo: Target.PasteSpecial xlPasteValues
        Application.EnableEvents = -1
    End If
End Sub
Код
Sub S4itivanie() 'Макрос2 - копирование из книги

Set ImaKnig1 = ThisWorkbook

ImaKnig2 = Application.GetOpenFilename _
                ("Excel files(*.xls*),*.xls*", 1, "Выбрать Excel файлы для передачи данных", , False)
If VarType(ImaKnig2) = vbBoolean Then
        Exit Sub
End If

ImaKnig3 = Dir(ImaKnig2)

If BookOpenClosed((ImaKnig3)) Then
 Workbooks(ImaKnig3).Worksheets("Спецификация").Range("A2:J23").Copy
 ImaKnig1.Activate
 Sheets("Спецификация").Range("A2").Select
 ActiveSheet.Paste
 Range("A2").Select
 Application.CutCopyMode = False
 
 Else
  Workbooks.Open (ImaKnig2)
  Workbooks(ImaKnig3).Worksheets("Спецификация").Range("A2:J23").Copy
  ImaKnig1.Activate
  Sheets("Спецификация").Range("A2").Select
  ActiveSheet.Paste
  Range("A2").Select
  Application.CutCopyMode = False
  Workbooks(ImaKnig3).Close (False)
  
End If
End Sub

'функция, предназначенная для проверки, открыта или закрыта рабочая книга.
Function BookOpenClosed(wbName As String) As Boolean
    Dim myBook As Workbook
    On Error Resume Next
        Set myBook = Workbooks(wbName)
    BookOpenClosed = Not myBook Is Nothing
End Function

Так вот, во время работы Макроса2, когда он вставляет значения  в "свой файл", его перехватывает Макрос1 и тут то происходит глюк...Как я понял глючит: Application.Undo: Target.PasteSpecial xlPasteValues - т.к. не может отменить действие Макроса2.

Думал отключить обработку событий, чтоб Макрос1 не срабатывал, но это вызвало другую ошибку
Код
Application.EnableEvents = False
ActiveSheet.Paste
Application.EnableEvents = True


Вопросы:
1. Можно как то отключать Макрос1 при выполнении Макроса2 (откл. из Макроса2)
2. Может есть другой вариант Макроса1 - для вставки только значений (облазил инет ничего не нашел)
 
Цитата
apawa написал:
но это вызвало другую ошибку
какую?
По сути, все можно сделать чуть проще и чуть правильнее:
Код
Sub S4itivanie() 'Макрос2 - копирование из книги
    Dim ImaKnig1 As Workbook
    Dim ImaKnig3 As String, ImaKnig2
    Dim IsNeedClose As Boolean
    
    Set ImaKnig1 = ThisWorkbook
    ImaKnig2 = Application.GetOpenFilename _
                    ("Excel files(*.xls*),*.xls*", 1, "Выбрать Excel файлы для передачи данных", , False)
    If VarType(ImaKnig2) = vbBoolean Then
        Exit Sub
    End If
    
    ImaKnig3 = Dir(ImaKnig2)
    If ImaKnig3 <> "" Then 'проверяем, что эта книга есть по этому пути
        Application.EnableEvents = False
        If Not BookOpenClosed((ImaKnig3)) Then
            IsNeedClose = True 'флаг, что книгу надо закрыть
            Application.Workbooks.Open ImaKnig2
        End If
        Application.Workbooks(ImaKnig3).Worksheets("Спецификация").Range("A2:J23").Copy ImaKnig1.Sheets("Спецификация").Range("A2")
        If IsNeedClose Then
            Application.Workbooks(ImaKnig3).Close False
        End If
        Application.EnableEvents = True
    End If
End Sub
 
'функция, предназначенная для проверки, открыта или закрыта рабочая книга.
Function BookOpenClosed(wbName As String) As Boolean
    Dim myBook As Workbook
    On Error Resume Next
        Set myBook = Workbooks(wbName)
    BookOpenClosed = Not myBook Is Nothing
End Function
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал: какую?
Цитата
runtime error 1004
application-defined or object-defined error
когда запускаю с кнопки, то бывает ошибка 400
Она возникает когда я добавляю Application.EnableEvents.
 
Цитата
apawa написал:
то бывает ошибка 400
ну вообще в общем случае ошибка 400 это невозможность отобразить в модальном режиме форму, т.к. на данный момент уже запущена другая форма в модальном режиме. Можете привести текст ошибки? В моем коде тоже самое?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
я как буду у ПК, скину тогда сам файл...вдруг я что-то не так понял.
нет, ваш код я еще не пробовал, пытался понять почему у меня ошибка(((
 
В файле на странице "Начало" есть 2 кнопки:

"Копировать в файл" - копирует лист "Спецификация" в новый файл
"Перенос данных....." - наоборот должна копировать данные на лист "Спецификация" из созданного, вот тут то и происходит сбой....

Если создать новый файл, и в него вставить эти макросы (1 и 2) все работает.
 
Вы не заметили, что у Вас там ошибка возникает, т.к. вставить данные пытаетесь в объединенную ячейку? Копируйте без заголовков и не создавайте себе проблем:
Код
Application.Workbooks(ImaKnig3).Worksheets("Спецификация").Range("A5:J23").Copy
        ImaKnig1.Sheets("Спецификация").Range("A5").PasteSpecial xlPasteValues
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Вы не заметили, что у Вас там ошибка возникает, т.к. вставить данные пытаетесь в объединенную ячейку?
В файле Опыты.xlsm  диапазон вроде B5:G705 и вставляем это с ячейки "B5":

Код
Workbooks(ImaKnig3).Worksheets("Спецификация").Range("B5:G705").Copy
 ImaKnig1.Activate
 Sheets("Спецификация").Range("B5").Select
 Application.EnableEvents = False 'отключаете обработку событий (чтоб не срабатывала вставка только значений)(Application.Undo)
 ActiveSheet.PasteSpecial Paste:=xlPasteValues
 Range("B5").Select
 Application.EnableEvents = True 'включаете обработку событий

может я не то понял, но объединеных ячеек не нашел (кроме B3), но туда я не вставляю
 
Так. Мой код Вы пробовать так и не хотите - так зачем помощи просите? У Вас в коде ошибки обращения.
Например:
Код
ImaKnig1.Activate
Sheets("Спецификация").Range("B5").Select
Что здесь написано? Активировать книгу ImaKnig1. А потом сразу выделить ячейку на листе "Спецификация". А как это произойдет, если книга активируется на листе "Начало"? Надо сначала уж тогда лист активировать.
Далее. Если уж даже выделили - у Вас при выделении срабатывает код на событие Calcualte. Который сбрасывает буфер обмена, что делает вставку значений невомзожным.
Посмотрите уже внимательнее на мой код. У меня там отключение событий сделано ДО ЛЮБЫХ этих событий. Либо уж разберитесь какие события Вам нужны и копируйте после них. Да и копировать можно без перехода на книги - это я тоже показал. Что Вам мешает делать так?
Код
Application.EnableEvents = False 'отключаете обработку событий (чтоб не срабатывала вставка только значений)(Application.Undo)
  Workbooks.Open (ImaKnig2)
  Workbooks(ImaKnig3).Worksheets("Спецификация").Range("B5:G705").Copy
'  ImaKnig1.Activate
'  Sheets("Спецификация").Range("B5").Select
  ImaKnig1.Sheets("Спецификация").Range("B5").PasteSpecial Paste:=xlPasteValues
'  Range("B5").Select
  
  Application.CutCopyMode = False 'очистка буфера обмена
  Workbooks(ImaKnig3).Close (False)
  Application.EnableEvents = True 'включаете обработку событий
не будет и ошибок и действий меньше.
Настоятельно рекомендую ознакомиться:
Как обратиться к диапазону из VBA
Select и Activate - зачем нужны и нужны ли?

P.S. Если уж выкладываете коды и файлы, то хоть жизненно приближенными их делайте. А то файлы 1 и 2 содержат объединенные ячейки и в этих файлах Вы в них КОПИРУЕТЕ. Я же не просто так написал - я тоже опирался именно на эти файлы. Кто ж знал, что напишите Вы одно, а делаете другое?  :)  
Изменено: Дмитрий(The_Prist) Щербаков - 26.01.2021 09:03:32
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо огромное вам! Ваш код сработал идеально! :)

Только я не совсем понял в чем ошибка в моем коде (он корявие и длиннее)....
сейчас пробегусь по нему заново, прочту ваши ссылки и может соображу)))
Страницы: 1
Наверх