Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Отсортировать данные по значению на разные листы - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Отсортировать данные по значению на разные листы
ZamoK Дата: Среда, 30.09.2015, 10:05 | Сообщение № 21
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Hugo, Смотрю я на этот код. Да он прекрасно работает, но что-то добавить в него %)
Номерация строк в Вашем коде копируется с листа ИТОГ - а желательно бы, чтоб она формировалась заново.
Лист данные вы закинули в библиотеку, а данные этой библиотеки нигде не выгружали - да?
Чесно говоря в Вашем коде я абсолютно ничего не понял, даже заполнить до конца лист Механический не смог :( - хоть застрелись.


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеHugo, Смотрю я на этот код. Да он прекрасно работает, но что-то добавить в него %)
Номерация строк в Вашем коде копируется с листа ИТОГ - а желательно бы, чтоб она формировалась заново.
Лист данные вы закинули в библиотеку, а данные этой библиотеки нигде не выгружали - да?
Чесно говоря в Вашем коде я абсолютно ничего не понял, даже заполнить до конца лист Механический не смог :( - хоть застрелись.

Автор - ZamoK
Дата добавления - 30.09.2015 в 10:05
Hugo Дата: Среда, 30.09.2015, 10:18 | Сообщение № 22
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Нумерацию без проблем можно сделать как угодно - просто заполняем b(i,1) значением i, а в элементы остальные копируем из a

[vba]
Код
b(i, 1) = i
For x = 2 To 4: b(i, x) = a(el, x): Next
[/vba]

Лист данные я закинул в словарь, даже в два чтоб проще было. Выгружать всё кучей никуда ведь не требуется, из этого словаря берём данные когда они нужны "точечно".
Что там непонятно не понимаю :)
Алгоритм выше описал, и в коде есть комментарии.
Схематично - сперва запоминаем какой номер куда нужно копировать, затем на какой лист какую строку нужно копировать, и уже затем копируем (через массивы для скорости).


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеНумерацию без проблем можно сделать как угодно - просто заполняем b(i,1) значением i, а в элементы остальные копируем из a

[vba]
Код
b(i, 1) = i
For x = 2 To 4: b(i, x) = a(el, x): Next
[/vba]

Лист данные я закинул в словарь, даже в два чтоб проще было. Выгружать всё кучей никуда ведь не требуется, из этого словаря берём данные когда они нужны "точечно".
Что там непонятно не понимаю :)
Алгоритм выше описал, и в коде есть комментарии.
Схематично - сперва запоминаем какой номер куда нужно копировать, затем на какой лист какую строку нужно копировать, и уже затем копируем (через массивы для скорости).

Автор - Hugo
Дата добавления - 30.09.2015 в 10:18
ZamoK Дата: Среда, 30.09.2015, 11:54 | Сообщение № 23
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Hugo, а как выдернуть из библиотеки данные столбца С (Материал) листа Данные на лист Механический, что-то я не разберусь никак?


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеHugo, а как выдернуть из библиотеки данные столбца С (Материал) листа Данные на лист Механический, что-то я не разберусь никак?

Автор - ZamoK
Дата добавления - 30.09.2015 в 11:54
Hugo Дата: Среда, 30.09.2015, 12:06 | Сообщение № 24
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
В СЛОВАРЯХ есть только те данные, которые туда поместили, т.е. из листов Sheets("Данные") код брал данные из первого и из пятого столбцов, других данных из Sheets("Данные") в словарях нет.
Если нужно сразу взять ещё что-то - то и берите, дописывайте код по аналогии. Но сперва нужно продумать что, зачем, куда, что потом с этим делать будете. Я пока пас, работа...


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеВ СЛОВАРЯХ есть только те данные, которые туда поместили, т.е. из листов Sheets("Данные") код брал данные из первого и из пятого столбцов, других данных из Sheets("Данные") в словарях нет.
Если нужно сразу взять ещё что-то - то и берите, дописывайте код по аналогии. Но сперва нужно продумать что, зачем, куда, что потом с этим делать будете. Я пока пас, работа...

Автор - Hugo
Дата добавления - 30.09.2015 в 12:06
ZamoK Дата: Среда, 30.09.2015, 13:43 | Сообщение № 25
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Вот представьте: Школа - 4 класс - Немецкий (и у Вас по нему 3-) - текст на 2 листа - большой словарь.
Вопрос: какова вероятность ?
Вот примерно такая ситуация :'(


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеВот представьте: Школа - 4 класс - Немецкий (и у Вас по нему 3-) - текст на 2 листа - большой словарь.
Вопрос: какова вероятность ?
Вот примерно такая ситуация :'(

Автор - ZamoK
Дата добавления - 30.09.2015 в 13:43
Hugo Дата: Среда, 30.09.2015, 13:59 | Сообщение № 26
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Ну уж что такое словарь все знают, кто в школе языки учил - есть слово, и есть его перевод. Перевод может быть как одно значение, так и набор/коллекция значений.
Знаем слово - по нему в словаре узнаём перевод.
Так и в scripting.dictionary - есть ключ, и к нему значение. В одном словаре это одно значение, в другом я сделал коллекцию значений.
Это основное, остальное техника применения...


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеНу уж что такое словарь все знают, кто в школе языки учил - есть слово, и есть его перевод. Перевод может быть как одно значение, так и набор/коллекция значений.
Знаем слово - по нему в словаре узнаём перевод.
Так и в scripting.dictionary - есть ключ, и к нему значение. В одном словаре это одно значение, в другом я сделал коллекцию значений.
Это основное, остальное техника применения...

Автор - Hugo
Дата добавления - 30.09.2015 в 13:59
ZamoK Дата: Среда, 30.09.2015, 14:23 | Сообщение № 27
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
техника применения
алгоритм ещё куда ни шло а вот с практикой вообще ...опа, поэтому и на этом спасибо, оставим этот вопрос. Раз
Я пока пас, работа...
,а других помощников нет - нет и причины развивать данную тему.
Всем отозвавшимся огромное спасибо!


Я не Гуру, но стремлюсь!
 
Ответить
Сообщение
техника применения
алгоритм ещё куда ни шло а вот с практикой вообще ...опа, поэтому и на этом спасибо, оставим этот вопрос. Раз
Я пока пас, работа...
,а других помощников нет - нет и причины развивать данную тему.
Всем отозвавшимся огромное спасибо!

Автор - ZamoK
Дата добавления - 30.09.2015 в 14:23
ZamoK Дата: Среда, 07.10.2015, 15:42 | Сообщение № 28
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Hugo, а если нужно чтоб Крепёж попадал ещё и на лист Покупные, т.е. на два листа одно и тоже



Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Среда, 07.10.2015, 15:43
 
Ответить
СообщениеHugo, а если нужно чтоб Крепёж попадал ещё и на лист Покупные, т.е. на два листа одно и тоже


Автор - ZamoK
Дата добавления - 07.10.2015 в 15:42
RAN Дата: Среда, 07.10.2015, 17:59 | Сообщение № 29
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Это захапистая часть кода, а за "попадал" отвечает раздающая. :D


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеЭто захапистая часть кода, а за "попадал" отвечает раздающая. :D

Автор - RAN
Дата добавления - 07.10.2015 в 17:59
Hugo Дата: Среда, 07.10.2015, 20:27 | Сообщение № 30
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Если
нужно чтоб Крепёж попадал ещё и на лист Покупные, т.е. на два листа одно и тоже
то это ломает всю логику кода.
Тогда проще в конце кода (перед End Sub) взять весь крепёж и скопировать под покупные, затем пройтись и поменять порядковые номера.
Заходим в крепёж, смотрим последнюю занятую строку - если больше 2х, то берём данные в массив.
Далее аналогично идём в покупные, смотрим строку, по результату в массиве меняем порядковые номера (или не меняем) и выгружаем.
Попробуйте реализовать, это не сложно.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеЕсли
нужно чтоб Крепёж попадал ещё и на лист Покупные, т.е. на два листа одно и тоже
то это ломает всю логику кода.
Тогда проще в конце кода (перед End Sub) взять весь крепёж и скопировать под покупные, затем пройтись и поменять порядковые номера.
Заходим в крепёж, смотрим последнюю занятую строку - если больше 2х, то берём данные в массив.
Далее аналогично идём в покупные, смотрим строку, по результату в массиве меняем порядковые номера (или не меняем) и выгружаем.
Попробуйте реализовать, это не сложно.

Автор - Hugo
Дата добавления - 07.10.2015 в 20:27
ZamoK Дата: Четверг, 08.10.2015, 08:45 | Сообщение № 31
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Попробуйте реализовать, это не сложно.

Доброго дня!
Писать коды не мастак,
именно поэтому я и пишу тут, самому знаю точно не под силу


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Четверг, 08.10.2015, 09:11
 
Ответить
Сообщение
Попробуйте реализовать, это не сложно.

Доброго дня!
Писать коды не мастак,
именно поэтому я и пишу тут, самому знаю точно не под силу

Автор - ZamoK
Дата добавления - 08.10.2015 в 08:45
ZamoK Дата: Пятница, 09.10.2015, 13:27 | Сообщение № 32
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Hugo, я конечно понимаю что вы люди занятые и помочь нет времени, но вот что я с вашей Hugo, помощью сляпал

конечно пришлось и верхнюю часть кода немного изменить и
(перед End Sub)
не тут чуть раньше получилось надо было вставить, результат вроде правильный, а вот с частью грамматики написания, правильно хоть или у меня вообще что-то не то получилось?
К сообщению приложен файл: 3122579.xlsm (46.8 Kb)


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Пятница, 09.10.2015, 14:26
 
Ответить
СообщениеHugo, я конечно понимаю что вы люди занятые и помочь нет времени, но вот что я с вашей Hugo, помощью сляпал

конечно пришлось и верхнюю часть кода немного изменить и
(перед End Sub)
не тут чуть раньше получилось надо было вставить, результат вроде правильный, а вот с частью грамматики написания, правильно хоть или у меня вообще что-то не то получилось?

Автор - ZamoK
Дата добавления - 09.10.2015 в 13:27
Hugo Дата: Суббота, 10.10.2015, 17:45 | Сообщение № 33
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Доброго дня, ZamoK.
Получилось правильно, но так Вы выполняете много лишних действий - два лишних раза берёте данные в массив, два лишних раза их перебираете в цикле, и всё только чтоб в итоге докопировать данные из одного листа в другой.
Если всего данных не много - это быстро, ну а если там поп полмиллиона на каждом листе будет?
Ну и ещё по мелочи два раза делаете одно и тоже с третьм словарём, что лишнее в этом случае и в общем лишнее пока вообще, т.к. он не используется.

Я предлагаю просто дописать в конце моего варианта перед End Sub вот это:
[vba]
Код
    'Тогда проще в конце кода (перед End Sub) взять весь крепёж и скопировать под покупные...
    Dim il&    'дообъявить нужно...
    'Заходим в крепёж, смотрим последнюю занятую строку - если больше 2х, то берём данные в массив.
    With Sheets("Крепёж")
        il = .Cells(.Rows.Count, 1).End(xlUp).Row
        If il > 2 Then    'значит есть что копировать
            a = Range(.[A3], .Range("D" & il)).Value

            'Далее аналогично идём в покупные, смотрим строку, по результату в массиве меняем порядковые номера (или не меняем) и выгружаем.
            With Sheets("Покупные")
                il = .Cells(.Rows.Count, 1).End(xlUp).Row
                If il > 2 Then    'значит нужно менять номера, ибо копировать будем ниже
                    For i = 1 To UBound(a): a(i, 1) = il - 2 + i: Next
                End If
                .Cells(il + 1, 1).Resize(UBound(a), 4) = a
            End With

        End If
    End With

End Sub
[/vba]

Есть правда одна ерунда, которую парой слов кода не победить, и думаю это косяк офиса - изначально данные выгружаются из массива строкового типа (делал чтоб не искажало номера типа 753513.001), а затем копируются с листа на лист через массив variant - и измененённые порядковые номера форматируются на листе в любом случае как числа. Если напрягает - можно что-то придумать (что замедлит процесс)...
Ну или используйте свой вариант.
Можно пойти третьим путём - в первый словарь заносить перечень листов для каждого номера, строкой или тоже коллекцией - но это тоже замедлт процесс, да и код станет сложнее.


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Суббота, 10.10.2015, 17:48
 
Ответить
СообщениеДоброго дня, ZamoK.
Получилось правильно, но так Вы выполняете много лишних действий - два лишних раза берёте данные в массив, два лишних раза их перебираете в цикле, и всё только чтоб в итоге докопировать данные из одного листа в другой.
Если всего данных не много - это быстро, ну а если там поп полмиллиона на каждом листе будет?
Ну и ещё по мелочи два раза делаете одно и тоже с третьм словарём, что лишнее в этом случае и в общем лишнее пока вообще, т.к. он не используется.

Я предлагаю просто дописать в конце моего варианта перед End Sub вот это:
[vba]
Код
    'Тогда проще в конце кода (перед End Sub) взять весь крепёж и скопировать под покупные...
    Dim il&    'дообъявить нужно...
    'Заходим в крепёж, смотрим последнюю занятую строку - если больше 2х, то берём данные в массив.
    With Sheets("Крепёж")
        il = .Cells(.Rows.Count, 1).End(xlUp).Row
        If il > 2 Then    'значит есть что копировать
            a = Range(.[A3], .Range("D" & il)).Value

            'Далее аналогично идём в покупные, смотрим строку, по результату в массиве меняем порядковые номера (или не меняем) и выгружаем.
            With Sheets("Покупные")
                il = .Cells(.Rows.Count, 1).End(xlUp).Row
                If il > 2 Then    'значит нужно менять номера, ибо копировать будем ниже
                    For i = 1 To UBound(a): a(i, 1) = il - 2 + i: Next
                End If
                .Cells(il + 1, 1).Resize(UBound(a), 4) = a
            End With

        End If
    End With

End Sub
[/vba]

Есть правда одна ерунда, которую парой слов кода не победить, и думаю это косяк офиса - изначально данные выгружаются из массива строкового типа (делал чтоб не искажало номера типа 753513.001), а затем копируются с листа на лист через массив variant - и измененённые порядковые номера форматируются на листе в любом случае как числа. Если напрягает - можно что-то придумать (что замедлит процесс)...
Ну или используйте свой вариант.
Можно пойти третьим путём - в первый словарь заносить перечень листов для каждого номера, строкой или тоже коллекцией - но это тоже замедлт процесс, да и код станет сложнее.

Автор - Hugo
Дата добавления - 10.10.2015 в 17:45
ZamoK Дата: Понедельник, 12.10.2015, 12:29 | Сообщение № 34
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Hugo, большое спасибо за разъяснения,
делал чтоб не искажало номера типа 753513.001
формат столбца как текст решает проблему, а в остальном супер. Спасибо!!!


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеHugo, большое спасибо за разъяснения,
делал чтоб не искажало номера типа 753513.001
формат столбца как текст решает проблему, а в остальном супер. Спасибо!!!

Автор - ZamoK
Дата добавления - 12.10.2015 в 12:29
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!