Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2009, 14:00   #1
Tchert
 
Регистрация: 24.04.2009
Сообщений: 4
Вопрос Вопрос по макросу

Доброго всем времени суток! Недавно начал изучать макросы, так сказать, под долгу службы. Ибо весьма заинтересован в сокращении затрат времени на обработку массивов данных.
Проблема следующего содержания. Имеется массив данных. Ключевыми элементами в нем являются название пробы и содержания по элементам, которые к нему (к названию) относятся.
Задача макроса в том, чтобы перенести все пробы и привязанные к ним содержания на второй лист. Причем с транспонированием. Т.е. в исходнике всё шло в один столбец, а на новый лист данные последовательно переносятся в столбцы (в первой строке каждого столбца название пробы, а под ней - все относящиеся к ней содержания).
В виду отсутствия опыта программирования эту задачу я решил довольно-таки топорно. Посмотрев как макро-рекордер переносит первые пробы, я просто взял и дописал код для нужного количества проб. Затратил много времени, но в итоге для этого (и меньшего) количества проб макрос работает.
А теперь вопрос, уважаемые знатоки. Что делать, если переносить нужно другое количество содержаний по элементам. Мысль о том, чтобы каждый раз переписывать макрос, приводит меня в уныние... ))
Более того, меня терзают смутные сомнения, что мой громоздкий макрос можно написать намного короче и веселее.
Наконец, интересно было бы знать, возможно ли сделать так, чтобы перед выполнением задачи макрос однократно запрашивал количество проб (и количество элементов) и переносил данные исходя из этого?
Большое спасибо! ))
Для наглядности привожу архив с xml.
Sample.rar
Tchert вне форума Ответить с цитированием
Старый 24.04.2009, 15:20   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Что делать, если переносить нужно другое количество содержаний по элементам
Не проблема.
Вот только надо как-то объяснить макросу, где искать диапазон ячеек с элементами.
Вы не описали формат исходных данных, а это важно.
Лист с пробами формируется (заполняется) программно, или вручную?
Макрос надо встраивать в тот же файл, или сделать его в виде надстройки (чтобы он не был привязан к определённому файлу)?


Правильно ли будет решить задачу с применением такого алгоритма?

1) Макрос подсчитывает количество проб на исходном листе (подсчитав количество ячеек во 2-м столбце, в которых присутствует подстрока Proba)

2) Макрос подсчитывает количество изотопов в первой пробе (подсчитав количество ячеек во 1-м столбце, начиная с ячейки ниже Calibration File, и заканчивая последней ячейкой перед Sample ID)

Сразу вопросы:
во всех пробах количество изотопов одинаковое?
если количество одинаковое, то изотопы во всех пробах одни и те же?
если одни и те же, то в том же порядке?
(от этого во многом зависит способ решения задачи - либо обрабатывать исходные данные формулами, либо макросами)


3) На основании данных, полученных в пунктах 1 и 2, макрос создаёт новый лист в той же книге, выстраивая все найденные пробы по горизонтали, а изотопы - по вертикали.

4) Макрос заполняет таблицу соответствующими значениями.
Вопрос: надо ли как-то форматировать значения в новой таблице?

Цитата:
Более того, меня терзают смутные сомнения, что мой громоздкий макрос можно написать намного короче и веселее.
Можете за одним выложить здесь код своего макроса (вместе с файлом)

Цитата:
возможно ли сделать так, чтобы перед выполнением задачи макрос однократно запрашивал количество проб (и количество элементов) и переносил данные исходя из этого?
Конечно, возможно. Только зачем?
Макрос и сам сможет определить всё, что надо (если Вы укажете критерии)

И для наглядности не помешает файл с несколькими листами, на каждом из которых будут различные варианты данных с пробами (чтобы было на чём тестировать макрос)
EducatedFool вне форума Ответить с цитированием
Старый 25.04.2009, 19:11   #3
Tchert
 
Регистрация: 24.04.2009
Сообщений: 4
По умолчанию

Добрый день. Спасибо за ответ и внимание к моей проблеме.
За формат исходных данных прошу прощения. Система такая. Есть компьютер. К нему подключена установка (спектрометр), управляемая программно с компьютера. Данные с установки записываются программой, после чего она сохраняет эти данные в текстовый файл. Из последнего уже формируется лист xls.

Цитата:
Макрос надо встраивать в тот же файл, или сделать его в виде надстройки (чтобы он не был привязан к определённому файлу)?
Если это важно и если я Вас правильно понимаю, то было бы лучше, если бы он не был связан с определенным файлом, поскольку работать приходится каждый раз с новым листом.

Цитата:
Правильно ли будет решить задачу с применением такого алгоритма?
Да, совершенно правильно.

Цитата:
Сразу вопросы:
во всех пробах количество изотопов одинаковое?
если количество одинаковое, то изотопы во всех пробах одни и те же?
если одни и те же, то в том же порядке?
(от этого во многом зависит способ решения задачи - либо обрабатывать исходные данные формулами, либо макросами)
Для всех проб в пределах всего массива количество и порядок содержаний по изотопам всегда одинаково. Изотопы тоже всегда одни и те же. Таким образом шаг всегда один. Проблема лишь в том, что в одном массиве изотопов для каждой пробы может быть одно количество, а в другом - другое.

Цитата:
Вопрос: надо ли как-то форматировать значения в новой таблице?
Необходимо лишь округление содержаний до третьего знака после запятой, но это, надо полагать, мелочи.

Цитата:
Только зачем?
Макрос и сам сможет определить всё, что надо (если Вы укажете критерии)
Раз так, то тогда действительно незачем.

Цитата:
Можете за одним выложить здесь код своего макроса (вместе с файлом)
Разумеется. В прикрепленном архиве файл xls с четырьмя листами и три текстовых файла с макросами. В файле содержания находятся в столбце "F", названия проб в столбце "B".
1.txt - код макроса обработки.
Sn.txt - код макроса для обсчета содержаний олова, поскольку (в силу особенностей конструкции) спектрометр не позволяет их получить.
I.txt - код макроса для обсчета содержаний йода. По той же причине.
Формулы, по которым рассчитываются эти содержания, указаны на листе 1 и выделены зеленым цветом.
Еще я бы хотел обратить Ваше внимание на то, что исходные данные в excel располагаются на листах с именем "dzh(дата)". В них строки с первой по 259-ую (включительно) не используются, поэтому, когда я писал макрос, просто переносил все данные на "лист1" без них. Поэтому в прикрепленном файле на листах 1 и 2 то же, что и на листах "dzh", за исключением этих строк.

Arc.rar

Последний раз редактировалось Tchert; 25.04.2009 в 19:18.
Tchert вне форума Ответить с цитированием
Старый 25.04.2009, 23:08   #4
Tchert
 
Регистрация: 24.04.2009
Сообщений: 4
По умолчанию

Насколько я понимаю, ситуация усложняется тем, что названия проб могут быть разными (и kribot, и sadpp, и bcr), а последовательность их переноса на второй лист весьма важна.
Tchert вне форума Ответить с цитированием
Старый 26.04.2009, 01:54   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

1) Запускаете файл из вложения.
В строке главного меню Excel 2003 справа от пункта Справка появится новый пункт - Обработать данные

2) Отрываете файл Data.xls (или любой другой с аналогичными данными)

3) Активируете лист с именем "dzh(дата)" (макрос обрабатывает только те листы, имя которых начинается с символов dzh)

4) Нажимаете кнопку Обработать данные

Макрос создаёт новый лист с таблицей в нужном формате.


Будут вопросы или пожелания по работе макроса - обращайтесь.

PS: В исходном файле Sample.xls Вы пожелали, чтобы на итоговый лист попадали данные из столбца G (Вы его выделили цветом)
Однако в файле Data.xls формулы, судя по Вашим макросам, заносятся в столбец F, следовательно, в итоговую таблицу должны попадать данные из этого столбца.

Я выбрал для итоговой таблицы столбец F. Если что, исправить это недолго (поменять одну цифру в макросе)
Вложения
Тип файла: rar Tchert.rar (14.9 Кб, 11 просмотров)
EducatedFool вне форума Ответить с цитированием
Старый 26.04.2009, 16:26   #6
Tchert
 
Регистрация: 24.04.2009
Сообщений: 4
По умолчанию

Игорь, большое спасибо! Вы очень помогли!
Так же благодарен Вам за комментарии в коде!
Цитата:
Однако в файле Data.xls формулы, судя по Вашим макросам, заносятся в столбец F
Дело в том, что в файле sample.xls я привел данные в более простом виде. Зная, какими командами пользоваться при написании макроса для sample, я мог бы попробовать использовать их для тех файлов, с которыми работаю. То есть идти от простого к сложному. Но, просмотрев код, я пришел к выводу, что это оказалось бы весьма не просто.

Последний раз редактировалось Tchert; 26.04.2009 в 16:45.
Tchert вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как по макросу скопировать название имени фала в ячейку?? kievlyanin Microsoft Office Excel 8 16.04.2009 21:16
Ошибка пр обращении к макросу tae1980 Microsoft Office Excel 3 04.04.2009 14:38
Нужна помощь по макросу VBA corematt Microsoft Office Word 14 27.02.2009 11:03
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
Пользовательская форма к макросу Flangini Microsoft Office Excel 6 23.04.2008 13:39