Защита ячеек в Excel, но позволяет им быть измененными сценарием VBA

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
58
задан braX 29 May 2018 в 18:59
поделиться

3 ответа

Попытайтесь использовать

Worksheet.Protect "Password", UserInterfaceOnly := True

, Если параметр UserInterfaceOnly имеет значение true, код VBA может изменить охраняемые ячейки.

87
ответ дан Joe 24 November 2019 в 18:54
поделиться

Можно изменить лист через код путем принятия этих мер

  • , Оставляют без защиты
  • , Изменяют
  • , Защищают

В коде, которым это было бы:

Sub UnProtect_Modify_Protect()

  ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password"
'Unprotect

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

  ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password"
'Protect

End Sub

слабость из этого метода - то, что, если код прерван и обработка ошибок не получает его, рабочий лист можно было бы оставить в незащищенном состоянии.

код мог быть , улучшился путем принятия этих мер

  • , Повторно защищают
  • , Изменяют

код, чтобы сделать, это было бы:

Sub Re-Protect_Modify()

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
 UserInterfaceOnly:=True
'Protect, even if already protected

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

End Sub

Этот код возобновляет защиту на рабочем листе, но с набором ‘UserInterfaceOnly’ к истинному. Это позволяет коду VBA изменять рабочий лист при сохранении рабочего листа защищенным от ввода данных пользователем через UI, даже если выполнение прервано.

Эта установка , проиграл , когда рабочая книга закрыта и вновь открыта. Защита рабочего листа все еще сохраняется.

, Таким образом, код 'Перезащиты' должен быть включен в начале любой процедуры, которая пытается изменить рабочий лист или может просто быть выполнена однажды, когда рабочая книга открыта.

16
ответ дан Robert Mearns 24 November 2019 в 18:54
поделиться

<забастовка> я не думаю, что можно установить любую часть листа, чтобы быть доступными для редактирования только VBA , но можно сделать что-то, что имеет в основном тот же эффект - можно оставить рабочий лист без защиты в VBA, прежде чем необходимо будет внести изменения:

wksht.Unprotect()

и повторно защищают его после того, как Вы будете сделаны:

wksht.Protect()

Редактирование: Похож на это обходное решение, возможно, решил непосредственную проблему Dheer, но для любого, кто сталкивается с этим вопросом/ответом позже, я был неправ относительно первой части своего ответа, как Joe указывает ниже. Вы можете защищать лист, чтобы быть доступными для редактирования VBA-только, но кажется, что опция "UserInterfaceOnly" может только быть установлена при вызове "Рабочего листа. Защитите" в коде.

2
ответ дан Kevin Crumley 24 November 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: