Диапазон удаляется при переназначении

#vba #range #declaration

Вопрос:

Привет, я новичок в VBA и мне было интересно, почему, когда я сбрасываю свой диапазон, все в пределах диапазона удаляется. Разве мы не должны переназначать диапазоны в VBA? Строка, в которой возникает проблема, заключается supervisor_range = .Range(Cells(2, 1), .Range("A" amp; .Rows.Count).End(xlUp)) в том, что все имена на изображении ниже удаляются.

введите описание изображения здесь

 Sub remove()
    Dim supervisorsheet As Worksheet
    Set supervisorsheet = Worksheets("supervisor")
    
    Dim supervisor_range As Range
    Dim cell As Range
    
    last_row = supervisorsheet.Cells.SpecialCells(xlCellTypeLastCell).Row
    
    Set supervisor_range = supervisorsheet.Range(Cells(2, 1), Cells(last_row, 1))
    supervisor_range.RemoveDuplicates Columns:=1, Header:=xlNo
    
    With supervisorsheet        
        supervisor_range = .Range(Cells(2, 1), .Range("A" amp; .Rows.Count).End(xlUp))
    End With
End Sub
 

Ответ №1:

Этот

 supervisor_range = .Range(Cells(2, 1), .Range("A" amp; .Rows.Count).End(xlUp))
 

не устанавливает переменную supervisor_range в заданный диапазон. Вместо этого вы копируете значения диапазона в диапазон, на который ссылается supervisor_range .

Если вы хотите установить переменную в диапазоне, вам нужно использовать ключевое слово Set

 Set supervisor_range = .Range(Cells(2, 1), .Range("A" amp; .Rows.Count).End(xlUp))
 

без Set следующих 2 строк они идентичны!

 supervisor_range = .Range(Cells(2, 1), .Range("A" amp; .Rows.Count).End(xlUp))
supervisor_range.Value = .Range(Cells(2, 1), .Range("A" amp; .Rows.Count).End(xlUp)).Value
 

Ответ №2:

В дополнение к существующему ответу, я не совсем понимаю, почему вы делаете то, что делаете, — определяете диапазон cel, расширяете его, определяете его снова…

Вот упрощенная версия вашего кода, которая делает именно то, что должна — удаляет дубликаты из заданного диапазона:

 Sub remove()

    Dim supervisorsheet As Worksheet
    Set supervisorsheet = Worksheets("supervisor")
    
    Dim supervisor_range As Range
    
    With supervisorsheet
        last_row = .Cells(.Rows.Count, 1).End(xlUp).Row
    
        Set supervisor_range = .Range(Cells(2, 1), Cells(last_row, 1))
        supervisor_range.RemoveDuplicates Columns:=1, Header:=xlNo
    End With
End Sub