powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Задачи со звездочкой * (только для настоящих профи)-2
25 сообщений из 142, страница 3 из 6
Задачи со звездочкой * (только для настоящих профи)-2
    #35588916
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KL (XL), спасибо!!! А я всё вокруг да около бродил...... :-))
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35588944
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут некоторые знают как я не люблю циклы в ВБА...... Посему предлагаю решить эту задачку вообще без цикла! :-)
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35589793
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даю подсказку: я не зря выше спрашивал как получить строку сумм столбцов массива... ;-) Это, так сказать, основная идея... Технику же выделения ячеек (столбцов) можно посмотреть тут .
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35589892
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-NikТут некоторые знают как я не люблю циклы в ВБА...... Посему предлагаю решить эту задачку вообще без цикла! :-)
Полного решения самой задачи всё равно не получится, ибо удалять-то формулой как?

Предлагаю немного переформулировать задачу:
"Получить список незаполненных столбцов массива (диапазона)"
В виде диапазонов ( "B:B,D:D,F:G,I:I" или "B1:B23,F1:F23" ), или по-другому, главное - чтобы затем
полученное значение позволило удалить данные диапазоны одним методом какого-либо объекта.
Исходим из того, что на листе - таблица с данными A1... (с подписями слева и сверху), кроме
таблицы, на листе присутствуют другие заполненные ячейки (границы таблицы желательно
определять "по концу" подписей строк и столбцов).
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35590065
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMA-NikТут некоторые знают как я не люблю циклы в ВБА...... Посему предлагаю решить эту задачку вообще без цикла! :-)
Полного решения самой задачи всё равно не получится, ибо удалять-то формулой как?

Предлагаю немного переформулировать задачу:
"Получить список незаполненных столбцов массива (диапазона)"
В виде диапазонов ( "B:B,D:D,F:G,I:I" или "B1:B23,F1:F23" ), или по-другому, главное - чтобы затем
полученное значение позволило удалить данные диапазоны одним методом какого-либо объекта.
Исходим из того, что на листе - таблица с данными A1... (с подписями слева и сверху), кроме
таблицы, на листе присутствуют другие заполненные ячейки (границы таблицы желательно
определять "по концу" подписей строк и столбцов).

Легко! Но будут ограничения по двум параметрам:
- длина текстовой строки как аргумента Range
- кол-во одновременно удаляемых областей

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub test()
    Dim rng As String, frm As String, txt As String
    'Для краткости исхожу из того, что есть фильтр.
    With Me.AutoFilter.Range: rng = .Offset( 1 ).Resize(.Rows.Count -  1 ).Address( 0 ,  0 ): End With
    frm = "=IF(COUNTIF(OFFSET(" & rng & ",,COLUMN(INDEX(1:1,,1):INDEX(1:1,,COLUMNS(" & rng & ")))-1,,1),""<>""),"""",ADDRESS(1,COLUMN(" & rng & "),4))"
    txt = Replace(Application.Trim(Join(Evaluate(frm), " ")), " ", ",")
    Intersect(Range(txt), Range(rng).EntireColumn).EntireColumn.Delete
End Sub
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35590070
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMПолного решения самой задачи всё равно не получится, ибо удалять-то формулой как?
Полное решение задачи согласно ее постановке не в отказе от макросов и удалении столбцов формулой, а в том, чтобы "...решить эту задачку вообще без цикла "
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35590354
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Полное решение задачи согласно ее постановке не в отказе от макросов и удалении столбцов формулой, а в том, чтобы "...решить эту задачку вообще без цикла "
Ну, это-то я понял. А вот если фильтра нет? Не буду же я накладывать фильтр только для того, чтобы анализировать данные "без цикла" :-)
А если такие варианты: "Получить список незаполненных столбцов массива (диапазона)"
1) VBA - без цикла.
2) Формулой.
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35590537
nporaMep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMKL (XL)Полное решение задачи согласно ее постановке не в отказе от макросов и удалении столбцов формулой, а в том, чтобы "...решить эту задачку вообще без цикла "
Ну, это-то я понял. А вот если фильтра нет? Не буду же я накладывать фильтр только для того, чтобы анализировать данные "без цикла" :-)
А если такие варианты: "Получить список незаполненных столбцов массива (диапазона)"
1) VBA - без цикла.
2) Формулой.

А стандартные функции экселя типа countif, counta и пр. разве не на циклах сделаны? :) Хоть и скрыты от кодеров.
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35590812
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nporaMepА стандартные функции экселя типа countif, counta и пр. разве не на циклах сделаны? :) Хоть и скрыты от кодеров.
На циклах, на чем же еще. Но суть именно в том, что не на VBA, а на C и быстрее во много раз.
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35590827
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMНу, это-то я понял. А вот если фильтра нет? Не буду же я накладывать фильтр только для того, чтобы анализировать данные "без цикла" :-)
В данной задаче нахождение исходного диапазона вторично. Способов масса и они все описаны в этом форуме. Фильтр был выбран мной для сокращения времени на написание примера.
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35590973
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот мои способа решения этой задачи....... ;-);-)
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35591944
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну что, друзья, тогда держите следующую задачу, ещё более интересную!!! :-))) Давно хотел её сделать, но не было никаких идей! А вот сейчас придумал ! И так, требуется сделать инвертирование выделения :-)) Разумеется, без единого цикла на ВБА :-)))) Количество областей - практически любое (в разумных пределах). Границы общей области инвертирования вычислить по текущим выделениям - т.е. вычислить из всех выделений самый левый исп. столбец, самую верхнюю исп. строку, самый правый охваченный столбец и самую нижнюю охваченную выделением строку. Разрешается использовать любое число промежуточных ячеек.
Задачи, тут две - без цикла на ВБА перебрать все выделения, найти их границы и определить общую область и вторая - проинвертировать выделения в полученной области. Кто решит хоть одну из этих задач без цикла - тоже выкладывайте :-)
Желаю успехов ! ;-))
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35592251
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-NikНу что, друзья, тогда держите следующую задачу, ещё более интересную!!! :-))) Давно хотел её сделать, но не было никаких идей! А вот сейчас придумал ! И так, требуется сделать инвертирование выделения :-)) Разумеется, без единого цикла на ВБА :-)))) Количество областей - практически любое (в разумных пределах). Границы общей области инвертирования вычислить по текущим выделениям - т.е. вычислить из всех выделений самый левый исп. столбец, самую верхнюю исп. строку, самый правый охваченный столбец и самую нижнюю охваченную выделением строку. Разрешается использовать любое число промежуточных ячеек.
Задачи, тут две - без цикла на ВБА перебрать все выделения, найти их границы и определить общую область и вторая - проинвертировать выделения в полученной области. Кто решит хоть одну из этих задач без цикла - тоже выкладывайте :-)
Желаю успехов ! ;-))
Только не говори, что ты сделал это так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub test()
    x = Selection.Address( 0 ,  0 )
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With Worksheets.Add
        .Range(x).Value =  1 
        Me.Activate
        Me.Range(.UsedRange.SpecialCells(xlCellTypeBlanks).Address( 0 ,  0 )).Select
        .Delete
    End With
    Application.DisplayAlerts = True
End Sub
Во-первых, это неинтересно
Во-вторых, ограничение в 255 знаков для текстовой строки как параметра Range()
В-третьих, ограничение в ~8.192 несмежных областей для SpecialCells
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35592357
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-NikНу что, друзья, тогда держите следующую задачу, ещё более интересную!!! :-))) Давно хотел её сделать, но не было никаких идей! А вот сейчас придумал ! И так, требуется сделать инвертирование выделения :-)) Разумеется, без единого цикла на ВБА :-)))) Количество областей - практически любое (в разумных пределах). Границы общей области инвертирования вычислить по текущим выделениям - т.е. вычислить из всех выделений самый левый исп. столбец, самую верхнюю исп. строку, самый правый охваченный столбец и самую нижнюю охваченную выделением строку. Разрешается использовать любое число промежуточных ячеек.
Задачи, тут две - без цикла на ВБА перебрать все выделения, найти их границы и определить общую область и вторая - проинвертировать выделения в полученной области. Кто решит хоть одну из этих задач без цикла - тоже выкладывайте :-)
Желаю успехов ! ;-))

Почему-то мне кажется что первая часть не очень сложная (хотя может и ошибаюсь, но сейчас некогда подумать)
А касательно второй части вопроса - другого варианта сделать это без цикла, кроме того что описан тут я не придумал
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35592658
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант решения первого подвопроса, обладает уже описанными выше недостатками на ограничение текстовой строки
Код: plaintext
Range(Replace(Selection.Address( 0 ,  0 ), ",", ":")).Select
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35592931
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот относительно "дешевый" вариант нахождения общей области выборки, который пришел мне на ум сегодня утром:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub SelectionQuadrant()
    With Selection
        colMax = Evaluate("1+MAX(" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & ")")
        colMin = Evaluate("1+MIN(" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & ")")
        rowMax = Evaluate("1+MAX(" & Replace(Replace(Replace(.EntireRow.Address( 0 ,  1 , xlR1C1), "R[", ""), "]", ""), ":", ",") & ")")
        rowMin = Evaluate("1+MIN(" & Replace(Replace(Replace(.EntireRow.Address( 0 ,  1 , xlR1C1), "R[", ""), "]", ""), ":", ",") & ")")
    End With
    Range(Cells(rowMin, colMin), Cells(rowMax, colMax)).Select
End Sub
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35593072
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, действительно, не плохо.... :-) Только его надо чуток подправить, а то аргуметов у МАКС() и МИН() может быть только 32, на сколько я понимаю (в офисах до 2003). Просто вложить полученное в { }:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub SelectionQuadrant()
    With Selection
    a = "1+MAX({" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & "})"
        colMax = Evaluate("1+MAX({" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & "})")
        colMin = Evaluate("1+MIN({" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & "})")
        rowMax = Evaluate("1+MAX({" & Replace(Replace(Replace(.EntireRow.Address( 0 ,  1 , xlR1C1), "R[", ""), "]", ""), ":", ",") & "})")
        rowMin = Evaluate("1+MIN({" & Replace(Replace(Replace(.EntireRow.Address( 0 ,  1 , xlR1C1), "R[", ""), "]", ""), ":", ",") & "})")
    End With
    Range(Cells(rowMin, colMin), Cells(rowMax, colMax)).Select
End Sub
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35593177
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-NikДа, действительно, не плохо.... :-) Только его надо чуток подправить, а то аргуметов у МАКС() и МИН() может быть только 32, на сколько я понимаю (в офисах до 2003). Просто вложить полученное в { }...
Или в (...):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub SelectionQuadrant()
    With Selection
    a = "1+MAX((" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & "))"
        colMax = Evaluate("1+MAX((" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & "))")
        colMin = Evaluate("1+MIN((" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & "))")
        rowMax = Evaluate("1+MAX((" & Replace(Replace(Replace(.EntireRow.Address( 0 ,  1 , xlR1C1), "R[", ""), "]", ""), ":", ",") & "))")
        rowMin = Evaluate("1+MIN((" & Replace(Replace(Replace(.EntireRow.Address( 0 ,  1 , xlR1C1), "R[", ""), "]", ""), ":", ",") & "))")
    End With
    Range(Cells(rowMin, colMin), Cells(rowMax, colMax)).Select
End Sub

Кстати, идея родилась именно с {...}, но перед отправкой в форум я счел это излишним, забыв об ограничении кол-ва параметров :-)
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35593286
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё-таки, ограничения всё равно остались те же..... :-( (для 2003 офиса). Проблема в том, что Selection.Address при достаточно большом количестве выделении выдаёт не полный набор адресов. Так, примерно 20-25 отдельных выделений и длина строки Selection.Address замирает, не растёт, при добавлении новых выделений.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub CommandButton1_Click()
Dim Rng As Range, colMax As Long, colMin As Long, rowMax As Long, rowMin As Long, Disp As Long
    With Selection
        colMax = Evaluate("1+MAX({" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & "})")
        colMin = Evaluate("1+MIN({" & Replace(Replace(Replace(.EntireColumn.Address( 1 ,  0 , xlR1C1), "C[", ""), "]", ""), ":", ",") & "})")
        rowMax = Evaluate("1+MAX({" & Replace(Replace(Replace(.EntireRow.Address( 0 ,  1 , xlR1C1), "R[", ""), "]", ""), ":", ",") & "})")
        rowMin = Evaluate("1+MIN({" & Replace(Replace(Replace(.EntireRow.Address( 0 ,  1 , xlR1C1), "R[", ""), "]", ""), ":", ",") & "})")
    End With
    Set Rng = Range(Cells(rowMin, colMin), Cells(rowMax, colMax))
    Disp = Application.Columns.Count - colMax
    Selection.Offset(, Disp).Value =  1 
    Rng.Offset(, Disp).SpecialCells(xlCellTypeBlanks).Offset(, -Disp).Select
    Rng.Offset(, Disp).ClearContents
End Sub
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35593510
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот вариант, который у меня был изначально.... :-)))))))) Тоже не учёл, что Selection.Address не даст полный перечень диапазонов.
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35595257
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фух! Наконец-то выкрутился из ограничения в 255 символов для Range и .Address !!! Правда, появилось другое ограничение - не должно быть никаких данных и форматирования в ячейках свыше 128 столбца и само выделение тоже не должно захватывать 128 столбец! :-((( Предлагаю взглянуть, что у меня получилось. В файле два способа. Первый не работает для сложных выделений.
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35598804
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну что, господа, готовы продолжить ? :-)) Домашнее задание: решить эту задачу без единого цикла на ВБА!
Рассматриваются такие ситуации:
Вариант 1: Подразумевается, что в искомый цвет окрашена либо вся строка, либо только определённый столбец (т.е. знаем где искать).
Вариант 2: Расположение ячейки, окрашенной искомым цветом, в строке неизвестно (либо может быть разным)

А теперь, к снаряду!! (а точнее, к клавиатуре!) :))
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35601718
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И, наконец,
Вариант 3: Найти и выделить не просто строки, а все ячейки, окрашенные в искомый цвет, без единого цикла на ВБА!!!
У меня получилось !!!!! При чём двумя способами!!!

Конечно, без кучи вспомогательных ячеек не обошлось, но ради такого дела - ничего не жалко...... !!! Любо глянуть! Во мгновение ока находится практически любое количество искомых элементов! (предполагается, что таблица (диапазон), где искать, заранее известен)
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35601824
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, один из методов решения варианта 3 невероятно простой! В нём нет ни единой формулы! Только обычные довольно часто используемые возможности экселя! Так что, рекомендую подумать над задачкой всем! Вы будете смеяться, когда увидите насколько он прост! А решив вариант 3, с лёгкостью решите первый и второй! :-)
...
Рейтинг: 0 / 0
Задачи со звездочкой * (только для настоящих профи)-2
    #35601987
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-NikФух! Наконец-то выкрутился из ограничения в 255 символов для Range и .Address !!! Правда, появилось другое ограничение - не должно быть никаких данных и форматирования в ячейках свыше 128 столбца и само выделение тоже не должно захватывать 128 столбец! :-((( Предлагаю взглянуть, что у меня получилось. В файле два способа. Первый не работает для сложных выделений.

а вот разбирали похожую тему - из предложенных способов два первых по скорости - с циклами..

http://www.sql.ru/forum/actualthread.aspx?tid=583442&pg=1

конечно, не все условия были протестированы.. но ограничений нет.
...
Рейтинг: 0 / 0
25 сообщений из 142, страница 3 из 6
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Задачи со звездочкой * (только для настоящих профи)-2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]