Страницы: 1
RSS
Выделение диапазона с использованием "именованного диапазона"
 
Здравствуйте!

Подскажите пожалуйста в чём ошибка? Намудрил я похоже  :)
Условия - есть заполненная таблица, Задача - определить ту её облать которая заполнена данными и очистить её.
Присвоил имя диапазону (из одной ячейки) test2. По моей логике, диапазон должен быть выделен от этой ячейки до (столбец = столбец test2 +1, строка = последняя заполненная в столбце test2)

Прошу прощения за несвоевременность, но внесу небольшие уточнения, очистить нужно только содержимое таблицы не трогая ничего остального, в таблице может быть заполнение весьма произвольное - все строчки, половина пустые, вообще одна в середине или в конце..
Изменено: Сливочный - 27.07.2016 07:53:43
 
Код
Range("J5").CurrentRegion.Offset(1).ClearContents
There is no knowledge that is not power
 
SuperCat, большое спасибо! Всё работает!
 
Цитата
Сливочный написал:
Задача - определить ту её облать которая заполнена данными и очистить её.
зачем мудрить, достаточно
Код
Worksheets("data").UsedRange.Offset(1, 0).ClearContents
Арфы - нет, возьмите бубен.
 
SuperCat, появились недостатки вашего метода  :( , даже два

1. если первые две ячейки в проверяемом столбце не заполнены, то очистка вообще не производится.
2. если и заполнена хотя бы первая ячейка, то при наличии пустых строк между данными в таблице макрос очищает всё до пустой строки.

Подозреваю что всё дело в CurrentRegion ..
Изменено: Сливочный - 27.07.2016 07:48:38
 
Udik, ваш вариант вообще как-то странно очищает.. нужно очистить данные именно в таблице не трогая ничего остального
 
Цитата
Сливочный написал: очистить нужно только содержимое таблицы не трогая ничего остального, в таблице может быть заполнение весьма произвольное - все строчки, половина пустые, вообще одна в середине или в конце
Приведите все описанные варианты заполнения таблиц на разных листах одной книги.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, такие варианты могут быть
Изменено: Сливочный - 27.07.2016 09:04:09
 
не знаю на сколько смог донести информацию, но, всё это должно работать в связке с именованной ячейкой test2, т.к. если прописать макрос на очистку со ссылкой на конкретные ячейки, то при добавлении/удалении строк/столбцов очистка будет уже не того что нужно
 
Цитата
JayBhagavan написал: Приведите все описанные варианты заполнения таблиц на разных листах одной книги.
Цитата
Сливочный написал: такие варианты могут быть
Недопонимание. Файл со всеми вариантами, что Вы описали приложите.
А вообще, тема касается "именованного диапазона", но что-то им тут и не пахнет...

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, файл почему-то сразу не приложился, сейчас есть в посте № 8, смотрите. А на счёт именованного диапазона - называется test2 и это всего лишь одна ячейка.

Вообще я думал каким-то образом данный код поможет Cells(Rows.cont, test2.Row).End(xlUp).Row + offset, но у меня не получилось корректно применить их  
Изменено: Сливочный - 27.07.2016 09:36:13
 
Сливочный, всё, что после шапки, должно быть очищено?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, да, но в пределах таблицы, стандартные методы хороши например

Код
Sub macro_mass1() ' очищает указанный диапазон 1 способ (любое смещение таблицы допускать нельзя)
    ThisWorkbook.Sheets("data").Range("J6:K21").ClearContents
End Sub
или
Код
Sub macro_mass2() ' очищает указанный диапазон 2 способ (любое смещение таблицы допускать нельзя)
    ThisWorkbook.Sheets("data").Range(Cells(6, 10), Cells(21, 11)).ClearContents
End Sub
или этот более приближенный к нужному результату
Код
Sub macro_mass3() ' очищает указанный диапазон 3 способ (любое смещение таблицы допускать нельзя)
    Range("J6:K" & Cells(Rows.Count, 10).End(xlUp).Row).ClearContents
End Sub
но они привязаны к конкретным ячейкам, и получается что смещать таблицу в книге уже нельзя, а если мне нужно добавить столбцы или строки левее или выше таблицы?

вариант предложенный SuperCat, был очень хорош
Код
Sub macro_mass4() ' очищает указанный диапазон 4 способ (допускается смещение таблицы)
    Dim test2 As Range
    Range("test2").CurrentRegion.Offset(1).ClearContents
End Sub
но он не срабатывает по причинам каким я описал выше
Цитата
Сливочный написал:
1. если первые две ячейки в проверяемом столбце не заполнены, то очистка вообще не производится.
2. если и заполнена хотя бы первая ячейка, то при наличии пустых строк между данными в таблице макрос очищает всё до пустой строки.
 
Сливочный, в таком случае нужен признак, который обозначает верхний левый угол таблицы, за что зацепиться макросу? Например, поле "длина".

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, понимаю, на этот счёт я полагал что именованный диапазон test2 будет признаком
 
Путём не хитрых совмещений методов решение нашлось!  Ура товарищи))
Код
Sub macro_mass3_2() ' очищает указанный диапазон 3 способ (любое смещение таблицы допускать нельзя)
    Dim a As Integer, b As Integer, c As Integer
    
    a = Range("test2").Column
    b = Range("test2").Row
    c = Cells(Rows.Count, a).End(xlUp).Row
    Range(Cells(b, a), Cells(c, a + 1)).ClearContents
End Sub
 
Сливочный, Хорошо вы сами с собой поговорили
There is no knowledge that is not power
 
SuperCat, если люди заняты не сидеть же мне на месте ровно  :D проблема сама собой не решится.

и сразу нашлась другая проблема.. (немного конкретизировал макрос) если выполнять макрос на листе где эта таблица, то всё нормально, если выполнять на другом листе, отличном от того где таблица, почему-то выдаёт ошибку.. в чём может быть проблема и как её решить?
Код
Sub macro_mass3_2() ' очищает указанный диапазон 3_2 способ (допускается смещение таблицы)
    Dim a As Integer, b As Integer, c As Integer
        a = ThisWorkbook.Sheets("data").Range("test2").Column
        b = ThisWorkbook.Sheets("data").Range("test2").Row
        c = ThisWorkbook.Sheets("data").Cells(Rows.Count, a).End(xlUp).Row
        ThisWorkbook.Sheets("data").Range(Cells(b, a), Cells(c, a + 1)).ClearContents
End Sub
 
Код
Sub macro_mass3_2()
    Dim a As Integer, b As Integer, c As Integer
    With ThisWorkbook.Sheets("data")
        a = .Range("test2").Column
        b = .Range("test2").Row
        c = .Cells(.Rows.Count, a).End(xlUp).Row
        .Range(.Cells(b, a), .Cells(c, a + 1)).ClearContents
    End With
End Sub
There is no knowledge that is not power
 
Цитата
JayBhagavan написал:
нужен признак, который обозначает верхний левый угол таблицы, за что зацепиться макросу?
Не пойму, в чём проблема с привязкой? Ведь у автора именованный диапазон?

Цитата
Сливочный написал:
Присвоил имя диапазону
Код
Sub TestRange()
    MsgBox Range("MyRange").Cells(1, 1).Value
    MsgBox Range("MyRange").Address
End Sub
 
Юрий М, при запуске макроса на другом листе, почему-то выскакивала ошибка, а вот так всё работает, единственное что не нравится - то что операцию пришлось два раза прописать из-за условия if else, мелочь а не знаю как обойти, GoTo не хочу внедрять
Код
Sub report_clearcontent1() ' очищает указанный диапазон 3_2 способ (допускается смещение таблицы)
    Dim a As Integer, b As Integer, c As Integer
    Dim z As String
    
    If ThisWorkbook.ActiveSheet.Name = "data" Then
        a = ThisWorkbook.Sheets("data").Range("test2").Column
        b = ThisWorkbook.Sheets("data").Range("test2").Row
        c = ThisWorkbook.Sheets("data").Cells(Rows.Count, a).End(xlUp).Row
        ThisWorkbook.Sheets("data").Range(Cells(b, a), Cells(c, a + 1)).ClearContents
    Else
        Application.ScreenUpdating = False
        z = ThisWorkbook.ActiveSheet.Name
        Sheets("data").Activate
        
        a = ThisWorkbook.Sheets("data").Range("test2").Column
        b = ThisWorkbook.Sheets("data").Range("test2").Row
        c = ThisWorkbook.Sheets("data").Cells(Rows.Count, a).End(xlUp).Row
        ThisWorkbook.Sheets("data").Range(Cells(b, a), Cells(c, a + 1)).ClearContents
    
        Sheets(z).Activate
        Application.ScreenUpdating = True
    End If
End Sub
 
Проблемы из-за отсутствия привязки диапазонов к соотв. листу:
Код
with ThisWorkbook.Sheets("data")
        a = .Range("test2").Column
        b = .Range("test2").Row
        c = .Cells(.Rows.Count, a).End(xlUp).Row
        .Range(.Cells(b, a), .Cells(c, a + 1)).ClearContents
end with
Изменено: JayBhagavan - 27.07.2016 12:37:50

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, да, это было поправлено ранее.

Большое спасибо всем откликнувшимся! В очередной раз задача решена, надеюсь последний  :D
Страницы: 1
Наверх