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

Вход

Регистрация

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

 

= Мир MS Excel/Изменение условий переноса данных - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Изменение условий переноса данных
Рита Дата: Пятница, 07.09.2012, 00:10 | Сообщение № 1
Группа: Гости
А вот ещё вопрос:
В общий файл нужно свести данные из нескольких других файлов(их число заранее неизвестно).
В имеющемся макросе, после ввода параметра получается значение, если оно удовлетворяет условию(так же введенному с клавиатуры), то данные переносятся в общий файл. Но данные добавляются, если человек ещё не добавлен в список и подходит по условию.

А как сделать так что бы переносил, только тех, кто во всех файлах удовлетворяет этому условию, а не к каком то одном????
Например, если оба получившихся параметра, у одного человека больше определенного числа, то переносим, если только в одном файле, то нет.

Код под спойлером:
 
Ответить
СообщениеА вот ещё вопрос:
В общий файл нужно свести данные из нескольких других файлов(их число заранее неизвестно).
В имеющемся макросе, после ввода параметра получается значение, если оно удовлетворяет условию(так же введенному с клавиатуры), то данные переносятся в общий файл. Но данные добавляются, если человек ещё не добавлен в список и подходит по условию.

А как сделать так что бы переносил, только тех, кто во всех файлах удовлетворяет этому условию, а не к каком то одном????
Например, если оба получившихся параметра, у одного человека больше определенного числа, то переносим, если только в одном файле, то нет.

Код под спойлером:

Автор - Рита
Дата добавления - 07.09.2012 в 00:10
Hugo Дата: Пятница, 07.09.2012, 00:44 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Заметил косячок в коде:
[vba]
Code
CurRow As Integer
Dim i As Integer
Dim ii As Integer
Dim x As Integer
Dim ILastrow As Integer
[/vba] нужно бы поменять на [vba]
Code
As Long
[/vba], а то когда-нибудь на больших таблицах/массивах будет ошибка.

P.S. вот кросс-тема на планете - там и файл есть, хотя это в общем ничего не даёт - я всё равно код не понял (хотя там есть часть написанного мною smile ) - почему запрос на каждом файле?
Да и вообще этот код отличается от того, который в файле на планете - тут например вообще нет заполнения словаря smile
http://www.planetaexcel.ru/forum.php?thread_id=44985

Т.е. я думаю этот код нужно на 90% переделать, на 50 дополнить.
На планете я поторопился, передумал - тот алгоритм не пойдёт...
Алгоритм значит вижу такой:
если нам нужно отобрать только тех, кто во всех файлах соответствует критериям -
1. запрашиваем критерии один раз до перебора файлов
2. перебираем все файлы и данные в них (заодно можно запомнить количество анализированных файлов, если эти данные позже будут нужны)
3. каждого нового работника заносим в словарь (только номер|имя), проверяем по критерию, ставим ему в Item метку true/false.
Думаю, самое простое - ставить 0, если не прошёл. Т.е. новому ставим 1, проверяем. Если не прошёл - то ставим 0.
Уже существующему проверяем Item - если там уже 0, то дальше не проверяем.
Т.е. в итоге все будут в словаре с результатом проверки.
4. после заполнения словаря его перебираем циклом - считаем тех, у кого в Item не 0 - сразу ставим им в Item порядковый номер.
5. объявляем массив для результатов по результату подсчёта в словаре.
6. снова цикл по файлам и данным - теперь сразу у каждого сотрудника проверяем в словаре его Item и по этому индексу копируем данные в массив результата.
Если нужны данные только из одного любого файла - то можно сразу ему Item обнулить, чтоб при следующей встрече уже его не брать.
Если нужны и другие данные в строку в результат - тут можно использовать подсчитанное общее количество файлов и их имена.

В общем, обычная "человеческая" логика - просмотрели данные всех претендентов, определили тех, у кого нет нигде "проколов" - теперь приглашаем их на собеседование smile
Сразу звать всех, чтоб выгнать неподходящих нельзя - неизвестно, сколько их всего будет, и какое помещение готовить smile


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеЗаметил косячок в коде:
[vba]
Code
CurRow As Integer
Dim i As Integer
Dim ii As Integer
Dim x As Integer
Dim ILastrow As Integer
[/vba] нужно бы поменять на [vba]
Code
As Long
[/vba], а то когда-нибудь на больших таблицах/массивах будет ошибка.

P.S. вот кросс-тема на планете - там и файл есть, хотя это в общем ничего не даёт - я всё равно код не понял (хотя там есть часть написанного мною smile ) - почему запрос на каждом файле?
Да и вообще этот код отличается от того, который в файле на планете - тут например вообще нет заполнения словаря smile
http://www.planetaexcel.ru/forum.php?thread_id=44985

Т.е. я думаю этот код нужно на 90% переделать, на 50 дополнить.
На планете я поторопился, передумал - тот алгоритм не пойдёт...
Алгоритм значит вижу такой:
если нам нужно отобрать только тех, кто во всех файлах соответствует критериям -
1. запрашиваем критерии один раз до перебора файлов
2. перебираем все файлы и данные в них (заодно можно запомнить количество анализированных файлов, если эти данные позже будут нужны)
3. каждого нового работника заносим в словарь (только номер|имя), проверяем по критерию, ставим ему в Item метку true/false.
Думаю, самое простое - ставить 0, если не прошёл. Т.е. новому ставим 1, проверяем. Если не прошёл - то ставим 0.
Уже существующему проверяем Item - если там уже 0, то дальше не проверяем.
Т.е. в итоге все будут в словаре с результатом проверки.
4. после заполнения словаря его перебираем циклом - считаем тех, у кого в Item не 0 - сразу ставим им в Item порядковый номер.
5. объявляем массив для результатов по результату подсчёта в словаре.
6. снова цикл по файлам и данным - теперь сразу у каждого сотрудника проверяем в словаре его Item и по этому индексу копируем данные в массив результата.
Если нужны данные только из одного любого файла - то можно сразу ему Item обнулить, чтоб при следующей встрече уже его не брать.
Если нужны и другие данные в строку в результат - тут можно использовать подсчитанное общее количество файлов и их имена.

В общем, обычная "человеческая" логика - просмотрели данные всех претендентов, определили тех, у кого нет нигде "проколов" - теперь приглашаем их на собеседование smile
Сразу звать всех, чтоб выгнать неподходящих нельзя - неизвестно, сколько их всего будет, и какое помещение готовить smile

Автор - Hugo
Дата добавления - 07.09.2012 в 00:44
Рита Дата: Суббота, 08.09.2012, 15:54 | Сообщение № 3
Группа: Гости
То есть словарь нужен 1?
Условия необходимо вводить для каждого файла, потому что они разные!
 
Ответить
СообщениеТо есть словарь нужен 1?
Условия необходимо вводить для каждого файла, потому что они разные!

Автор - Рита
Дата добавления - 08.09.2012 в 15:54
Рита Дата: Суббота, 08.09.2012, 16:24 | Сообщение № 4
Группа: Гости
Что то у меня вообще ничего теперь не переносится!
 
Ответить
СообщениеЧто то у меня вообще ничего теперь не переносится!

Автор - Рита
Дата добавления - 08.09.2012 в 16:24
Hugo Дата: Суббота, 08.09.2012, 17:26 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Словарь один.
Код выше можно использовать частично - там есть ошибки, поэтому так, как он написан здесь сейчас, он работать не будет.
Вообще тут ещё непонятно одно условие задачи - первая версия, для которой я писал первый код, сперва проверяла уже присутствующих в таблице, и дописывала только новых. Т.е. при повторном запуске лишь дописывала новых.
Т.е. если Вам теперь нужно делать проверку на критерий - то нужно понять, что делать с уже записанными ранее.
Или их там быть не может, или их стираем и записываем всех с проверкой заново, или работаем как написано.
Т.е. если уже Иванов в таблице - тогда его не проверяем вообще (ставим ему в Item 0 и из новых файлов ничего не импортируем).

Если для каждого файла свои условия - ну пусть, можно и так. Но тогда вероятно нужно показать, какой файл сейчас анализируется - иначе как понять, какие условия нужно вводить?


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеСловарь один.
Код выше можно использовать частично - там есть ошибки, поэтому так, как он написан здесь сейчас, он работать не будет.
Вообще тут ещё непонятно одно условие задачи - первая версия, для которой я писал первый код, сперва проверяла уже присутствующих в таблице, и дописывала только новых. Т.е. при повторном запуске лишь дописывала новых.
Т.е. если Вам теперь нужно делать проверку на критерий - то нужно понять, что делать с уже записанными ранее.
Или их там быть не может, или их стираем и записываем всех с проверкой заново, или работаем как написано.
Т.е. если уже Иванов в таблице - тогда его не проверяем вообще (ставим ему в Item 0 и из новых файлов ничего не импортируем).

Если для каждого файла свои условия - ну пусть, можно и так. Но тогда вероятно нужно показать, какой файл сейчас анализируется - иначе как понять, какие условия нужно вводить?

Автор - Hugo
Дата добавления - 08.09.2012 в 17:26
Рита Дата: Суббота, 08.09.2012, 17:47 | Сообщение № 6
Группа: Гости
есть одна таблица в которую сводятся данные из других файлов. а уже вот эти другие файлы формируются по разному. в каких то просто надо свести данные, и если нет человека, то добавить нового. а какие то файлы формируются по условию. так вот в этом файле в таблицу добавятся только те люди, у которые в некоторых других файлах удовлетворяют условию. так как данные сводятся за разное время, то условия для каждого файла разные, поэтому их каждый раз нужно водить, для каждого файла.
 
Ответить
Сообщениеесть одна таблица в которую сводятся данные из других файлов. а уже вот эти другие файлы формируются по разному. в каких то просто надо свести данные, и если нет человека, то добавить нового. а какие то файлы формируются по условию. так вот в этом файле в таблицу добавятся только те люди, у которые в некоторых других файлах удовлетворяют условию. так как данные сводятся за разное время, то условия для каждого файла разные, поэтому их каждый раз нужно водить, для каждого файла.

Автор - Рита
Дата добавления - 08.09.2012 в 17:47
Рита Дата: Воскресенье, 09.09.2012, 16:32 | Сообщение № 7
Группа: Гости
Вот если я правильно поняла: в открывшемся файле производим необходимые вычисления. в итоге, если человека нет в словаре и он удовлетворяет условию, то ставим ему 1, иначе - 0

If Len(a(i, cnstNom)) Then
If Not oDict.exists(a(i, cnstNom)) And GetCritValue(a, i, n) > k Then
oDict.Item(a(i, cnstNom)) = 1
Else
oDict.Item(a(i, cnstNom)) = 0
End If

Правильно?
 
Ответить
СообщениеВот если я правильно поняла: в открывшемся файле производим необходимые вычисления. в итоге, если человека нет в словаре и он удовлетворяет условию, то ставим ему 1, иначе - 0

If Len(a(i, cnstNom)) Then
If Not oDict.exists(a(i, cnstNom)) And GetCritValue(a, i, n) > k Then
oDict.Item(a(i, cnstNom)) = 1
Else
oDict.Item(a(i, cnstNom)) = 0
End If

Правильно?

Автор - Рита
Дата добавления - 09.09.2012 в 16:32
Рита Дата: Воскресенье, 09.09.2012, 16:33 | Сообщение № 8
Группа: Гости
или
If Len(a(i, cnstNom)) Then
If Not oDict.exists(a(i, cnstNom))
oDict.Item(a(i, cnstNom)) = 1
End If
If oDict.Item(a(i, cnstNom)) = 1 And GetCritValue(a, i, n) > k Then
oDict.Item(a(i, cnstNom)) = 1
Else
oDict.Item(a(i, cnstNom)) = 0
End If
 
Ответить
Сообщениеили
If Len(a(i, cnstNom)) Then
If Not oDict.exists(a(i, cnstNom))
oDict.Item(a(i, cnstNom)) = 1
End If
If oDict.Item(a(i, cnstNom)) = 1 And GetCritValue(a, i, n) > k Then
oDict.Item(a(i, cnstNom)) = 1
Else
oDict.Item(a(i, cnstNom)) = 0
End If

Автор - Рита
Дата добавления - 09.09.2012 в 16:33
Hugo Дата: Воскресенье, 09.09.2012, 17:20 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Думаю как-то так:
[vba]
Code
    If Len(a(i, cnstNom)) Then
            If Not oDict.exists(a(i, cnstNom)) Then    'если нет в словаре
                
                If GetCritValue(a, i, n) > k Then    'если прошёл сейчас проверку
                    oDict.Item(a(i, cnstNom)) = 1    ' ставим 1
                Else
                    oDict.Item(a(i, cnstNom)) = 0    ' иначе 0
                End If
                    
            Else    'если есть уже в словаре
                
                If oDict.Item(a(i, cnstNom)) = 1 Then    'если все предыдущие проверки прошёл
                    If Not GetCritValue(a, i, n) > k Then ' проверяем снова, если не прошёл
                        oDict.Item(a(i, cnstNom)) = 0 ' ставим 0
                    End If
                End If

            End If
        End If
[/vba]
Ну а потом перебираем словарь, всем прошедшим проверку ставим порядковые номера, затем уже из файлов тянем данные в массив по позициям этих номеров.
Чуть пока не ясно, что делать с теми, кто уже может быть есть в этом сводном - если будет такой вариант, то это можно доработать. Например , пусть у них в Item уже будут значения, больше 1, и тогда новым будем продолжать ставить номера дальше.
Тогда такие с номерами >1 проверяться не будут, а все новые можно будет выгрузить ниже (при копировании данных в массив скорректировать индекс на это макисмальное число уже занесённых клиентов.
Либо использовать в начале не 0/1, а -1/0 - т.е. непрошедшим ставим -1, прошедшим 0 (или словами false/true)
Затем всем с 0 ставим новые индексы в продолжение таблицы, и всех с такими индексами импортируем при втором проходе по файлам (после первого импорта скидываем Item в 0, чтоб из других файлов больше не брать).


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеДумаю как-то так:
[vba]
Code
    If Len(a(i, cnstNom)) Then
            If Not oDict.exists(a(i, cnstNom)) Then    'если нет в словаре
                
                If GetCritValue(a, i, n) > k Then    'если прошёл сейчас проверку
                    oDict.Item(a(i, cnstNom)) = 1    ' ставим 1
                Else
                    oDict.Item(a(i, cnstNom)) = 0    ' иначе 0
                End If
                    
            Else    'если есть уже в словаре
                
                If oDict.Item(a(i, cnstNom)) = 1 Then    'если все предыдущие проверки прошёл
                    If Not GetCritValue(a, i, n) > k Then ' проверяем снова, если не прошёл
                        oDict.Item(a(i, cnstNom)) = 0 ' ставим 0
                    End If
                End If

            End If
        End If
[/vba]
Ну а потом перебираем словарь, всем прошедшим проверку ставим порядковые номера, затем уже из файлов тянем данные в массив по позициям этих номеров.
Чуть пока не ясно, что делать с теми, кто уже может быть есть в этом сводном - если будет такой вариант, то это можно доработать. Например , пусть у них в Item уже будут значения, больше 1, и тогда новым будем продолжать ставить номера дальше.
Тогда такие с номерами >1 проверяться не будут, а все новые можно будет выгрузить ниже (при копировании данных в массив скорректировать индекс на это макисмальное число уже занесённых клиентов.
Либо использовать в начале не 0/1, а -1/0 - т.е. непрошедшим ставим -1, прошедшим 0 (или словами false/true)
Затем всем с 0 ставим новые индексы в продолжение таблицы, и всех с такими индексами импортируем при втором проходе по файлам (после первого импорта скидываем Item в 0, чтоб из других файлов больше не брать).

Автор - Hugo
Дата добавления - 09.09.2012 в 17:20
Рита Дата: Воскресенье, 09.09.2012, 17:33 | Сообщение № 10
Группа: Гости
Нет, в данном случае нужно выбрать тех, кто во всех файлах подходит по условию. Главное что бы в список не попали те, которые удовлетворяют условию только 1 раз.
Спасибо большое, сейчас по пробую
 
Ответить
СообщениеНет, в данном случае нужно выбрать тех, кто во всех файлах подходит по условию. Главное что бы в список не попали те, которые удовлетворяют условию только 1 раз.
Спасибо большое, сейчас по пробую

Автор - Рита
Дата добавления - 09.09.2012 в 17:33
Hugo Дата: Воскресенье, 09.09.2012, 19:13 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Ну так ведь и делаю - если один раз проверку не прошёл, то ему ставим 0, и больше таких даже не проверяем (нечего на них больше время тратить).


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНу так ведь и делаю - если один раз проверку не прошёл, то ему ставим 0, и больше таких даже не проверяем (нечего на них больше время тратить).

Автор - Hugo
Дата добавления - 09.09.2012 в 19:13
Рита Дата: Воскресенье, 09.09.2012, 20:14 | Сообщение № 12
Группа: Гости
Вроде работает правльно, но я только на небольшом примере проверяла. но написано как то неудачно:
 
Ответить
СообщениеВроде работает правльно, но я только на небольшом примере проверяла. но написано как то неудачно:

Автор - Рита
Дата добавления - 09.09.2012 в 20:14
Hugo Дата: Воскресенье, 09.09.2012, 20:32 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Я Ваш код под спойлер спрятал, а то страницу мотать долго... sad
Проверить код не могу - не знаю критериев sad
Но вижу логическую ошибку - надо ведь файлы по два раза перебирать, т.к. пока не просмотришь все, не известно - пройдёт человек все проверки или нет.
Или можно заносить в массив всех прошедших сразу проверку (как у Вас), а если позже придётся в Item поставить 0 - то и из массива их надо будет удалить. Можно просто стереть все данные, а перед ваыгрузкой переложить оставшихся в другой массив (уплотнить) и выгрузить уже его. Так кстати даже будет лучше, быстрее.
И этот код тогда особо менять не нужно, просто чуть доработать:
там, где
[vba]
Code
oDict.Item(a(i, cnstNom)) = 0    ' иначе 0
[/vba]
нужно добавить "чистку" массива b, а перед выгрузкой его "уплотнение".

Уже стал так пробовать делать - не пойдёт! Мы ведь до просмотра всех файлов не знаем, сколько будет "клиентов", и соотв. не знаем, какой массив b нам нужен.
Разве что задать его заведомо с запасом, например на 1000 (или 10000, смотря какая фирма) smile
Но я этого не знаю...

Хотя сделал ка зачёркнуто smile - вот попробуйте на 1000 клиентов.
Писал без проверки, так что результат не знаю...



webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеЯ Ваш код под спойлер спрятал, а то страницу мотать долго... sad
Проверить код не могу - не знаю критериев sad
Но вижу логическую ошибку - надо ведь файлы по два раза перебирать, т.к. пока не просмотришь все, не известно - пройдёт человек все проверки или нет.
Или можно заносить в массив всех прошедших сразу проверку (как у Вас), а если позже придётся в Item поставить 0 - то и из массива их надо будет удалить. Можно просто стереть все данные, а перед ваыгрузкой переложить оставшихся в другой массив (уплотнить) и выгрузить уже его. Так кстати даже будет лучше, быстрее.
И этот код тогда особо менять не нужно, просто чуть доработать:
там, где
[vba]
Code
oDict.Item(a(i, cnstNom)) = 0    ' иначе 0
[/vba]
нужно добавить "чистку" массива b, а перед выгрузкой его "уплотнение".

Уже стал так пробовать делать - не пойдёт! Мы ведь до просмотра всех файлов не знаем, сколько будет "клиентов", и соотв. не знаем, какой массив b нам нужен.
Разве что задать его заведомо с запасом, например на 1000 (или 10000, смотря какая фирма) smile
Но я этого не знаю...

Хотя сделал ка зачёркнуто smile - вот попробуйте на 1000 клиентов.
Писал без проверки, так что результат не знаю...


Автор - Hugo
Дата добавления - 09.09.2012 в 20:32
Рита Дата: Воскресенье, 09.09.2012, 21:51 | Сообщение № 14
Группа: Гости
Спасибо вроде работает так же. А если клиентов будет намного больше? какое максимальное значение можно использовать?
 
Ответить
СообщениеСпасибо вроде работает так же. А если клиентов будет намного больше? какое максимальное значение можно использовать?

Автор - Рита
Дата добавления - 09.09.2012 в 21:51
Hugo Дата: Воскресенье, 09.09.2012, 23:31 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Думаю можно и миллиард - лишь бы памяти для массива хватило.
Если серьёзно - не знаю. 10000 не хватит? Поставьте 100000.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеДумаю можно и миллиард - лишь бы памяти для массива хватило.
Если серьёзно - не знаю. 10000 не хватит? Поставьте 100000.

Автор - Hugo
Дата добавления - 09.09.2012 в 23:31
ikki Дата: Понедельник, 10.09.2012, 00:07 | Сообщение № 16
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
можно использовать ReDim Preserve
но, т.к. для двумерных размеров можно менять только вторую размерность, то нужна маленькая хитрость - положить массив "набок".

первый раз:
[vba]
Code
Redim b(1 to 4, 1 to 1000)
[/vba]

при достижении конца массива, добавляем, к примеру, еще 1000:
[vba]
Code
Redim Preserve b(1 to 4, 1 to ubound(b,2)+1000)
[/vba]

и так далее.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki


Сообщение отредактировал ikki - Понедельник, 10.09.2012, 00:09
 
Ответить
Сообщениеможно использовать ReDim Preserve
но, т.к. для двумерных размеров можно менять только вторую размерность, то нужна маленькая хитрость - положить массив "набок".

первый раз:
[vba]
Code
Redim b(1 to 4, 1 to 1000)
[/vba]

при достижении конца массива, добавляем, к примеру, еще 1000:
[vba]
Code
Redim Preserve b(1 to 4, 1 to ubound(b,2)+1000)
[/vba]

и так далее.

Автор - ikki
Дата добавления - 10.09.2012 в 00:07
Hugo Дата: Понедельник, 10.09.2012, 00:20 | Сообщение № 17
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Да, я как-то избегаю preserve, но тут оно в любом случае будет быстрее, чем два раза файлы читать.
С другой стороны, если "столбцов" всего 4, то можно эти данные сразу в item и держать, в строке. Или туда каждому массив поместить, на 4 значения.
Ведь у нас словарь клиентов уже есть, где держим индекс "привязанного" массива - так вот переносим данные сразу в словарь, и массив не нужен.
Ну а при выгрузке всё равно данные приходится перекладывать (заодно и массив можно перевернуть без transpose).
А для метки годится/брак можно в этом массиве иметь пятое поле (это если не хотим совсем данные выкидывать), или просто вместо массива кладём 0 (если данные и клиент больше не нужны).
В общем, можно ещё над кодом поработать и сделать его лучше - главное понять, как оно работает, и что именно нам нужно в итоге получить.

P.S. С утра посмотрел - строка
[vba]
Code
p = i - 4    'считаем присутствующих
[/vba]
лишняя. Как-то я вероятно хотел это употребить позже - но не употребил smile
Её можно смело убрать/закомментировать - на результат не влияет.

Переделал код на "без массива" - теперь у каждого свой маленький массив сразу в словаре.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеДа, я как-то избегаю preserve, но тут оно в любом случае будет быстрее, чем два раза файлы читать.
С другой стороны, если "столбцов" всего 4, то можно эти данные сразу в item и держать, в строке. Или туда каждому массив поместить, на 4 значения.
Ведь у нас словарь клиентов уже есть, где держим индекс "привязанного" массива - так вот переносим данные сразу в словарь, и массив не нужен.
Ну а при выгрузке всё равно данные приходится перекладывать (заодно и массив можно перевернуть без transpose).
А для метки годится/брак можно в этом массиве иметь пятое поле (это если не хотим совсем данные выкидывать), или просто вместо массива кладём 0 (если данные и клиент больше не нужны).
В общем, можно ещё над кодом поработать и сделать его лучше - главное понять, как оно работает, и что именно нам нужно в итоге получить.

P.S. С утра посмотрел - строка
[vba]
Code
p = i - 4    'считаем присутствующих
[/vba]
лишняя. Как-то я вероятно хотел это употребить позже - но не употребил smile
Её можно смело убрать/закомментировать - на результат не влияет.

Переделал код на "без массива" - теперь у каждого свой маленький массив сразу в словаре.

Автор - Hugo
Дата добавления - 10.09.2012 в 00:20
  • Страница 1 из 1
  • 1
Поиск:

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