2015-10-23 6 views
1

Я разработал небольшой макрос VBA в Excel, который должен добавить значения ячеек в строке 15 к значениям ячеек в строке 6 во время смены рабочей книги (в моем случае введите число в строке 15 и нажатие на вкладку).Excel 2016 разбивает ранее работающий макрос VBA

Первоначально я разработал и использовал его в Excel 2013, после чего перешел на Mac и с тех пор использовал его в Excel для Mac 2011. Теперь я установил Excel для Mac 2016, и внезапно макрос не работает Больше не работай.

Это сценарий:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Range("C15:H15")) > 0 Then 
      Call copySub 
    End If 
End Sub 

Sub copySub() 
    Sheets("sheet1").Protect , UserInterFaceOnly:=True 
    For i = 3 To 8 
     Cells(6, i).Value = Cells(6, i).Value + Cells(15, i).Value 
     Cells(15, i).Value = 0 
    Next i 
End Sub 

Когда я введите значение и нажмите вкладку в Excel 2016, я получаю ошибку во время выполнения 91 «Переменная объекта или переменная блока не установлен». Ошибка, кажется, происходит в строке:

Cells(6, i).Value = Cells(6, i).Value + Cells(15, i).Value 

Я также пытался сохранить сумму в переменной перед назначением его Cells(6, i).Value, но это не помогло.

Microsoft изменила логику защиты листа, особенно с параметром UserInterFaceOnly, установленным на true? Или что здесь происходит?

Надеюсь, вы можете мне помочь.

Спасибо, chuky

+0

добавить ссылку на лист, например. 'Таблицы (« Sheet1 »). Cells (6, i) .value = ...' – SeanC

+0

Спасибо за идею SeanC, но она все еще не работает ... – chuky

+0

Ваш макрос не работает в Excel 2007, но ошибка включена 'If ​​Intersect ...' line. Кроме того, даже с исправленным, он заканчивается бесконечным циклом, так как каждое изменение, которое вы делаете в 'copySub', снова вызовет макрос события. Вы уверены, что объясняете вещи такими, какие они есть? Является ли макросом события в модуле кода Sheet1, или он находится на другом листе? –

ответ

2

, что вы скопировали этот код правильно ли вы? В любой версии Excel она не будет работать.

Ваши проблемы таковы:

  1. Intersect возвращает Range объект, так что ваш код будет бросать ошибку 91.
  2. Вероятнее всего, в вашей строке Sheets("sheet1").Protect ... произошла ошибка, так как это, вероятно, называется «Sheet1». Если это так, это вызовет ошибку 91.
  3. Если вы изменили имя рабочего листа на «sheet1», это приведет к ошибке 91.
  4. Почему вы защищаете лист только от Worksheet_Change. Это действительно должно быть сделано в Workbook_Open? И если вы это сделаете, как пользователь меняет ячейки без определенных ячеек, не имеющих защиты?

Непонятно, какие рабочие листы вы имеете в виду и где выполняется процедура copySub. Я обновил ваш код, так как он устраняет основные ошибки и записывается в качестве возможности назначить ваш рабочий лист - вам придется настроить его по своему усмотрению. Удачи.

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim ws As Worksheet 

    Set ws = Target.Worksheet 
    If Not Intersect(Target, ws.Range("C15:H15")) Is Nothing Then 
     Call copySub(ws) 
    End If 
End Sub 

Sub copySub(ws As Worksheet) 
    ws.Protect , UserInterFaceOnly:=True 
    Application.EnableEvents = False 
    For i = 3 To 8 
     ws.Cells(6, i).Value = ws.Cells(6, i).Value + ws.Cells(15, i).Value 
     ws.Cells(15, i).Value = 0 
    Next i 
    Application.EnableEvents = True 
End Sub 
+0

Короткий ответ: теперь он работает, спасибо!Длинный ответ: да, я скопировал его правильно, кажется странным, что он сработал, хотя ... Я также изменил название рабочей таблицы, потому что на самом деле это называется «Ratingen» ... У меня еще есть еще один вопрос : мне нужно передать в рабочий лист в качестве параметра? Потому что я прикрепил кнопку к югу, и теперь это уже не работает. Но я могу жить с этим ... – chuky

+0

Хорошо, я проверил его, и мне не нужно проходить на листе. Сейчас все работает. Еще раз спасибо :) – chuky

Смежные вопросы