Получение ошибки 1004 в коде, который работал после добавления нового кода

#excel #vba #byval

#excel #vba #бывал

Вопрос:

Я в тупике (не занимает много времени). У меня есть два фрагмента кода, которые, похоже, плохо работают вместе. Я бы хотел, чтобы они или нашли альтернативу. Первый — это код командной кнопки, который очищает содержимое и изменяет форматирование. Это работало отлично, пока я не добавил код «if value changes». Код изменения значения относится к ячейкам в диапазоне, где форматирование меняется с первого кода. Я полагаю, что это проблема. Коды по большей части используют именованные диапазоны. Я попытался использовать адреса ячеек, определяя диапазон в коде, защищая / снимая защиту и добавляя имя листа в диапазон.

Этот код отлично работает без кода «если значение изменится».

 Private Sub CommandButton2_Click()
    Sheets("PN Generation").unprotect Password:="1234"
    Range("SELECT").Value = 2
    Range("PNSELECT").ClearContents
    Range("SMC").ClearContents
    Range("ALL").Interior.ColorIndex = 35
    Range("ALL").Font.ColorIndex = 49
    Range("SMC").Interior.ColorIndex = 6
    Range("SMCD").Font.ColorIndex = 15
    Range("SMCD").Interior.ColorIndex = 15
    Call protect

End Sub
 

При использовании приведенного ниже кода приведенный выше код возвращает ошибку 1004, определенную приложением / объектом, начиная со строки 5 — «Диапазон («ВСЕ»).Интерьер.ColorIndex = 35. »

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D3")) Is Nothing Then
    
            If Range("PNI") = "G" Or Range("PNI") = "U" Or Range("PNI") = "L" Or Range("PNI") = "T" Then
            Sheets("Reverse Build").Range("MV").Copy
            Sheets("PN Generation").Range("PFLMV").PasteSpecial xlPasteValues
        End If
        
        If Range("PNI") = "A" Or Range("PNI") = "B" Or Range("PNI") = "C" Or Range("PNI") = "V" Or Range("PNI") = "AR" Then
            Range("LV").Copy
            Range("PF").PasteSpecial xlPasteValues
        End If
        
        If Range("PNI") = "S" Or Range("PNI") = "P" Then
            Range("SIN").Copy
            Range("PF").PasteSpecial xlPasteValues
        End If
        
        If Range("PNI") = "F" Then
            Range("BARE").Copy
            Range("PF").PasteSpecial xlPasteValues
        End If
        
        If Range("PNI") = "R" Then
            Range("LVU").Copy
            Range("PF").PasteSpecial xlPasteValues
        End If
       End Sub
 

Я хотел бы понять, почему я получаю ошибку и как исправить, предотвратить ошибку.

Комментарии:

1. Забыл упомянуть. диапазон имен «ВСЕ» равен D2: F4 и D7: F7. D3 является целевой ячейкой.

2. Вы тестируете только диапазон («PNI»), вы оценили возможность использования Select Case блока вместо связки If s?

3. Нет, но только потому, что мне не очень повезло в моих попытках использовать код выбора. Я понимаю концепцию, но я запутался в синтаксисе. Хотя это хорошая идея. Я попробую.

4. Хорошей новостью является то, что я смог заставить Select Case работать. Плохая новость в том, что это не остановило проблему. Я предполагаю, что проблема заключается в том, что когда код командной кнопки очищает ячейки, он запускает код ByValue до завершения кода командной кнопки. Имеет ли это смысл. Есть ли способ предотвратить это?

5. Application.EnableEvents = False Application.EnableEvents = True ?

Ответ №1:

Приложение.EnableEvents = False … Приложение.EnableEvents = True сработало.

Спасибо, БигБен. Вы должны знать, вы только что помогли фанату Bengals. lol