powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выборка из последовательных диапазонов
10 сообщений из 10, страница 1 из 1
Выборка из последовательных диапазонов
    #39801453
j-ester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Я в VBA новичок, на работе больше приходится строить выборки на SQL, отчеты в PHP.

Встала задача сделать Макрос, который обрабатывает большую таблицу данных, например:

123456 | 01.01.2018 | вата | синяя | ..........
123456 | 01.11.2018 | пакля | красная | ..........
123456 | 01.07.2016 | вата | зеленая | ..........

654321 | 01.05.2017 | веревка | синяя | ..........
654321 | 01.06.2017 | пакля | синяя | ..........
654321 | 01.07.2017 | вата | зеленая | ..........

333333 | 01.02.2018 | пакля | красная | ..........
333333 | 01.03.2018 | веревка | синяя | ..........
333333 | 01.04.2018 | вата | зеленая | ..........

Мне необходимо выбрать для диапазонов данные вложенно. Допустим для всех 123456 найти максимальную Дату, потом для одинаковых значений выбрать только синий ну и так далее....

В принципе алгоритм всегда будет одинаковым, мне хочется понять как сделать самое начало - то есть как получить ДЛЯ КАЖДОГО дипапазона строчку с максимальной датой - допустим скопировать эти строки на новый лист (уже научился создавать листы =) )


Поиском находил варинаты с импортом екселя в БД и последующими запросами получать нужные выборки. Возможно так будет проще ? Но с Акцесом я как то тоже не дружу, имеется SQL сервер. Вопрос в том, что это надо делать пользователям, а я сейчас загоняю данные в SQL через SQL IMPORT MASTER, пользователи с таким не справятся и у них нет полномочий.

Потому хотелось бы Макросом реализиовать такое.


И еще вопрос - когда я хотел сделать что-то на PHP, первые запросы поиска выводили меня на сайт с примерами, где мне ну вот совсем все понятно. Пример - https://www.php.net/manual/ru/function.isset.php

Есть ли подобные справочники для VBA?? Я не смог найти чего то вменяемого в интернете или похожего.
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39801532
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К диапазону на листе Excel можно обращаться так же, как к таблице БД. Выполнять запросы, получать результаты...
В крайнем случае - есть функции листа, в т.ч. и сортировка диапазона.
Но делать всё это вручную? фэ-э-э.
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39801539
j-ester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Это всё чудесног, но есть пример работы по моему вопросу ?

Допустим в С++ я мог получить адрес переменной, и потом в цикле сравнивать значение по адресу со следующим элементом.

Тут же вообще какой то Ад
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39801583
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
j-esterAkina,

Допустим в С++ я мог получить адрес переменной, и потом в цикле сравнивать значение по адресу со следующим элементом.



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  Set XL = New Excel.Application
        Set XLW = XL.Workbooks.Open(rst!pathper, False, False)
        XLW.Activate
        Set WS = XLW.Worksheets("Model")
        
            XL.Visible = False
            For i = 2 To 1000
                If WS.Cells(i, 1) = "" Then
                   If WS.Cells(i, 1) = 1 Then Stop
                   rrr = "A" & i
                   WS.Range(rrr).Activate
                   WS.Range(rrr).Select '
                   WS.Range(rrr).Hyperlinks.add Anchor:=WS.Range(rrr), Address:=cardp & "\" & numb3 & "-" & numb0 & "-" & numb & ".pdf", TextToDisplay:=numb3 & "-" & numb0 & "-" & numb & ".pdf"
                   Exit For
                End If
                If Len(WS.Cells(i, 1)) > 8 Then
                    If WS.Cells(i, 1) = numb3 & "-" & numb0 & "-" & numb & ".pdf" Then
                        rrr = "A" & i
                        WS.Range(rrr).Activate
                         WS.Range(rrr).Select
                        WS.Range(rrr) = numb3 & "-" & numb0 & "-" & numb & ".pdf"
                        WS.Range(rrr).Hyperlinks.add Anchor:=WS.Range(rrr), Address:=cardp & "\" & numb3 & "-" & numb0 & "-" & numb & ".pdf", TextToDisplay:=numb3 & "-" & numb0 & "-" & numb & ".pdf"
                        Exit For
                    End If
                End If
            Next i


Вот кусок моего кода , который в цикле в зависимости от значения ячейки выполняет операцию......
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39801857
j-ester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

Какая жесть.... Но спасибо, буду разбираться... Тут есть что позаимствовать.
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39801867
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
j-esterЕсть ли подобные справочники для VBA??
А как же?
Справочник по VBA для Office .
Справочник по Microsoft DAO .

j-esterесть пример работы по моему вопросу ?
Код: vbnet
1.
2.
3.
4.
SELECT F1 AS [Категория],F3 AS [Дата актуализации],F4 AS [Субкод]
FROM [Лист1$A1:D5] IN 'C:\Temp\f1.xls'[Excel 12.0; HDR=No; IMEX=1]
WHERE F2 LIKE '*w*'
ORDER BY F1,F4 DESC;
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39802063
j-ester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо большое!! Буду разбираться.
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39802582
j-ester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Снова требуется помощь!

Подскажите - разобрался чуть чуть с обходом:

Выделяю диапазон для поиска границ:

Код: vbnet
1.
All = ActiveSheet.Range("C1", ActiveSheet.Range("C65536").End(xlUp)).Select




Просто считаю:

Код: vbnet
1.
Cnt = Selection.Rows.Count




Рабочий код далее:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
'''''''' Рабочий код
Set rFndRng = ActiveSheet.Columns(3).Find("*", , xlFormulas, xlWhole)
RowStart = rFndRng.Address
RowEnd = 0
CntAll = 0
CntNotEmpty = 1
CntMassiv = 0
Olo = 0
For Each cell In Selection
'RowStart = cell.Address
'MsgBox "CntAll: " & CntAll & " Olo: " & Olo & " RowStart: " & RowStart & " RowEnd: " & RowEnd & " CntMassiv " & CntMassiv & " CntNotEmpty " & CntNotEmpty
CntAll = CntAll + 1
    
    
    'Счетчик заполнения ячеек: 6 3 3 4
    If IsEmpty(cell.Value) = False Then
    
    CntNotEmpty = CntNotEmpty + 1
    Dia1 = cell.Value
    'Получаем значение предыдущей ячейки:
    Dia2 = cell.Offset(1, 0).Value
    
' Если ячейки не равны, значит новый диапазон
        If Dia1 <> Dia2 Then
        
        Olo = cell.Address
        
        
        RowEnd = cell.Address
        
     
        CntMassiv = CntMassiv + 1
        RowStart = cell.Offset(-CntNotEmpty, 0).Address
        
        
        'Генерируем переменную для заливки диапазонов разных цветов
        
'Раскрашиваем - работает
         ''MyValue = Int((16 * Rnd) + 1)
        ''Range(RowStart, RowEnd).Interior.ColorIndex = MyValue
        
'Получаю номера строк из адреса ячейки
        StartRow = Split(RowStart, "$")(2)
        EndRow = Split(RowEnd, "$")(2)

'Пытаюсь выделить этот диапазон чтоб потом в нем искать максимальную дату - ОШИБКА
        Range("StartRow:EndRow").Select
        ''MsgBox "StartRow: " & StartRow & " EndRow: " & EndRow
        
        
        'Сбрасываем счетчик
        CntNotEmpty = -1
        
        
        End If

    End If


Next



Подскажите:

1) Как работает указатель в данном языке при обходе выделенных ячеек - если я в цикле с начала получаю Начало и конец диапазона и пытаюсь выделить его - он сбросит указатель активной ячейки в общем цикле ?

2) Может лучше и правильнее сформировать .... двумерный массив с диапазонами и потом брать от туда координаты, выделять и в выделенном искать максимальную дату в соседнем столбце ? Оно вообще так умеет ?


Пока у меня верно раскрашиваются диапазоны (В ОДНОМ СТОЛБЦЕ - я выделил столбец) , то есть границы я получаю верно .


Все это применительно для таблицы:

123 08.04.2014 Вася
123 09.09.2017 Коля
123 20.04.2015 Миша
123 11.11.2016 Женя
123 12.12.2017 Петро
123 13.04.2017
456 01.01.2009 Катя
456 05.03.2009 Маша
456 05.03.2011 Таня
888 06.07.2010 Женя
888 10.10.2011 Оля
888 12.12.2007 Алена
999 11.11.2011 Света
999 10.11.2011 Алена
999 08.11.2011 Маша
999 09.11.2011 Катя
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39803009
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
j-ester
Код: vbnet
1.
2.
'Пытаюсь выделить этот диапазон чтоб потом в нем искать максимальную дату - ОШИБКА
        Range("StartRow:EndRow").Select

Сделайте как в последующей строке
Код: vbnet
1.
Range(StartRow & ":" & EndRow).Select

и ошибки не будет.
А лучше приложите файл с двумя листами: что есть и что надо получить. В т.ч. с поиском максимума и т.д.
...
Рейтинг: 0 / 0
Выборка из последовательных диапазонов
    #39803163
j-ester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский,

На листе надо - сгруппированные столбцы , с отбором ПО МАКСИМАЛЬНОЙ ДАТЕ.

При условии что столбец с числами заполнен.

Для некоторых, например двух показателей надо выносить на отдельные листы.


Ми мысли:
1)обойти и получить границы диапазонов для каждого кода - сделал.

2) В каждом диапазоне пройтись и найти максимальную дату (при условии что поле с числом не пустое) и скопировать на новый лист
Вот тут уже сложновато мне.

3) Насоздавать листы для определенных показателей из массива

4) сделать выборку и скопировать в свои листы нужные данные
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выборка из последовательных диапазонов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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