Страницы: 1
RSS
Из выделенного диапазона вычесть столбец
 
Здравствуйте еще раз!  :)  
Как из выделенного диапазона вычесть самый левый столбец?
В моем примере я выделяю столбцы А, В и С- и выдается адрес А1:С17. А необходимо, чтобы выводилось В1:С17.
 
Код
[А1:С17].resize(,[А1:С17].columns.count-1).offset(,1)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, спасибо!!))
 
подозреваю что если в RefEdit1 выделить столбцы B и C то получите результат не тот который ожидаете.
 
V, в том-то и дело, что я пишу прогу, где в начале используется исходный диапазон А1:С17, а потом создается другой диапазон, где левый столбец отрезается.. но я уже разобралась с этим вопросом)
 
зачем тогда использовать RefEdit1.
Код
вместо двух строчек
Set a = range(RefEdit1.Value)
Set b = range(a.Address).CurrentRegion 
достаточно одной 
Set b = range("A1").CurrentRegion 
пока что по коду RefEdit1 ни на что не влияет.
Изменено: V - 26.11.2014 15:10:24
 
V, каждый раз пользователь выбирает новый диапазон. откуда я угадаю, какой он следующий диапазон выберет? Для этого и нужен RefEdit
 
JayBhagavan, а как поступить с "рваными диапазонами"? Допустим, я через Ctrl выделяю столбцы А, В, Е, F. Или D, G, H, I.
И мне надо отобразить адреса, за исключением первого столбца из выделенного диапазона?
Вот как "вычленить" первый столбец из диапазона - знаю.
Я делаю так

Код
a.areas(1).columns(1).address
 


А как указать оставшуюся часть диапазона без первого столбца - не знаю...
Может, какой метод есть, который исключает заданный интервал? Помогите, пожалуйста!
 
Oda412, у меня нет опыта работы с такими диапазонами. Навскидку, перебираете все области и сохраняете в переменную все адреса областей, кроме первой.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Попробовал.
Код
Sub jjj()
adrs = ""
i = 0
For Each ars In Selection.Areas
    If i > 0 Then adrs = adrs & "," & ars.Address
    i = i + 1
Next ars
adrs = Mid(adrs, 2)
Debug.Print Range(adrs).Address
End Sub

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Может быть так..

Код
Sub tt()
    Dim r As Range, rr As Range, n&, i&
    Set r = Range("A1:A10, D1:D10, F1:F10")    'ваши выделенные
    n = r.Areas.Count
    For i = 2 To n
        Debug.Print r.Areas(i).Address
    Next
    Set rr = Union(r.Areas(n - 1), r.Areas(n))    'искомое
    rr.Select
    'rr.Areas(1).Select
    'rr.Areas(2).Select
End Sub
 
 
Сократил:
Код
Sub jjj2()
adrs = Selection.Address
Debug.Print adrs & " ---> " & Mid(adrs, InStr(1, adrs, ",") + 1)
End Sub
Замечание, если столбцы выбираю не последовательно (например, $K:$K,$I:$I,$M:$M,$G:$G,$O:$O), то из областей уберётся первая выделенная, т.е. $K:$K. Таким образом, следует изменить алгоритм отсечения первой области, если оно Вам надо.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Маугли, но так удалит первую область. А если в ней 2 столбца?
не помню, в объединенном Range Areas идут слева направо, или как записаны? Если первое, то тогда надо проверять в первой Area число столбцов, и дальше уже решать, что резать.
F1 творит чудеса
 
Максим Зеленский, я ж описал, на практике проверив, как идут ареас. ;)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Еще вариант..
Код
Sub tt()
    Dim r As Range, rr As Range, n&, i&, k&
    Set r = Range("A1:A10, C1:C10,D1:D10, F1:F10")    'бьем специально по колонкам
    k = 1   ' № исключаемый
    n = r.Areas.Count
    Set rr = r.Areas(IIf(k >= n, 1, k) + 1)   ' созлаем первый
    For i = 1 To n - IIf(k >= n, 1, 0)
     If i <> k Then Set rr = Union(rr, r.Areas(i)) 'клеим
    Next
    rr.Select    'искомое
End Sub
 
Изменено: Маугли - 27.11.2014 12:35:35 (поправил)
 
JayBhagavan, да, не заметил под кодом  :)

ну вот так можно (потренировал коллекции, использовал немного код Маугли)
Сортируем Areas по первым столбцам, убираем или обрезаем первую Area, остальное объединяем.
Скрытый текст


Можно и проще - выясняем, в какой Area наименьший номер первого столбца, запоминаем порядковый номер этой Area, а затем объединяем в новый Range все остальные Areas + обрезанная запомненная.
Скрытый текст


Единственно, если в первом слева столбце будет два выделения, уберется первое... Но это мне уже лень дорисовывать.
F1 творит чудеса
 
Поупражнялся:
Код
Sub jjj3()
adrs = Selection.Address
arr = Split(adrs, ",")
tmp = ""
Do
    sorted = False
    For i = LBound(arr) To UBound(arr) - 1
        If arr(i) > arr(i + 1) Then tmp = arr(i): arr(i) = arr(i + 1): arr(i + 1) = tmp: sorted = True
    Next i
Loop While sorted
adrs = Join(arr, ",")
Debug.Print adrs & " ---> " & Mid(adrs, InStr(1, adrs, ",") + 1)
End Sub
Было $K:$K,$I:$I,$M:$M,$G:$G,$O:$O, стало $I:$I,$K:$K,$M:$M,$O:$O. За сортировку простите - как умею. :*)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Всем большое спасибо, у меня получилось :)
Страницы: 1
Наверх