Страницы: 1
RSS
Выборочный перенос данных со смещением на строку
 
Всем доброго времени суток.    
Обращаюсь за помощью к знающим людям.  
1. Вожусь третий день с проблемой переноса данных с листа "new_form" на лист "Информация". После внесения нового клиента на листе "new_form", необходимо, чтобы он был написан на нижеследующей строке листа "Информация" и так для каждого нового клиента.  
Пробовал писать макрос. Последовательно проводя операцию по принципу "Скопировал > Перешел на лист "Информация"> Вставил в нужную ячейку >Вернулся за следующим значением на "new_form"> Скопировал > Перешел на лист "Информация" и действие повторялось до последнего введенного значения.  ИТОГ: не переходит на новую строку, возможно не правильно совершал какое либо действие...  
2. Понимаю, что следует проверять заполняемость ячеек - ведь, исполнитель может по какой-то причине не ввести второй или третий номер телефона и т.д. Возможно, следует заполнить пустующую строку какой-то информацией? (Можно оставить слова, которые написаны для образца). Следовательно, необходимо где-то их хранить, а затем копировать обратно, а не очищать строки. Дополнительный код - расход ресурсов компьютера и времени на просчет...    
 
Возможно заморачиваюсь, не спорю.    
 
Находил различные варианты, но, на моем компьютере они или не работали, а если и работали, то частично.  
Ведь в любом деле есть масса ньюансов... Одним словом, буду признателен за помощь.
 
Что-то мне кажется - много лишнего.  
Последнюю строку Вы нашли. ID=iLastRow-1. Или возможны пропуски номеров или ручное редактирование? Тогда да, определяйте max.  
А так - нашли последнюю строку - заполняйте данными. Зачем там цикл - не понял. Писать ведь всё равно надо в последнюю пустую, а не после максимального номера.  
Формат можно вручную задать по всему листу, или кодом в проблемные ячейки до или после занесения данных.
 
Начал было заполнять массив - устала рука. Посмотрите комментарии в коде - должно быть понятно.
 
{quote}{login=Hugo}{date=15.09.2010 02:36}{thema=}{post}Что-то мне кажется - много лишнего.  
Последнюю строку Вы нашли. ID=iLastRow-1. Или возможны пропуски номеров или ручное редактирование? Тогда да, определяйте max.  
А так - нашли последнюю строку - заполняйте данными. Зачем там цикл - не понял. Писать ведь всё равно надо в последнюю пустую, а не после максимального номера.  
Формат можно вручную задать по всему листу, или кодом в проблемные ячейки до или после занесения данных.{/post}{/quote}  
СПАСИБО огромное, что ответили. Дело в том, что я не писал этот код, а нашел в сети и оптимизировал под себя. Ручное редактирование на втором листе хотел исключить. То, что какую-то ячейку не заполнят, я предполагал. Например: напишут только один телефон или одно хобби...    
Касательно поиска строки, я не понял, для себя лично, как осуществить автоматическое добавление нумерованной строки с каждым клиентом. Цикл - возможно фрагмент кода от проверки чего-то (логическое умозаключение) я не программист, и сталкиваюсь с этим видом деятельности час от часу! Хотя очень об этом жалею - математика трезвит!СПАСИБО!
 
Так ведь вот  
   iLastrow = Cells(Rows.Count, 1).End(xlUp).Row + 1 ' находим последнюю непустую строку  
При каждом запуске кода это значение будет определяться заново. Более того, если это поставить в цикл - при каждом проходе будет определяться. И если в цикле добавлены данные - iLastrow будет изменяться.  
Про "не заполнят" - можно сперва пройтись по ячейкам и проверить. Но вот что делать, если есть пустые - это Вам решать. Только ругаться или дальше не пускать или другие значения подставить (например "Не заполнено")
 
Про нумерованную строку забыл. Смотрите, у Вас данные заносятся в строку например 6 с ID=5. Т.е. всегда на единицу меньше. Значит ID=iLastRow-1. Если конечно ничего вручную не будет корректироваться - например кого-то удалят, а этот номер нужно присвоить другому.
 
{quote}{login=Hugo}{date=15.09.2010 03:43}{thema=}{post}Про нумерованную строку забыл. Смотрите, у Вас данные заносятся в строку например 6 с ID=5. Т.е. всегда на единицу меньше. Значит ID=iLastRow-1. Если конечно ничего вручную не будет корректироваться - например кого-то удалят, а этот номер нужно присвоить другому.{/post}{/quote}  
Подсказка очень своевременная. Впоследствии, будет создаваться дополнительная форма, возможно не одна, для расширения возможностей по анализу. Но уже в этой, я приспособлю еще одну ячейку - "статус контрагента" - которая и обусловит его состояние. Думаю, в зависимости от актуальности, этот контрагент может не отображаться в списке. СПАСИБО!
 
{quote}{login=nilem}{date=15.09.2010 03:15}{thema=}{post}Начал было заполнять массив - устала рука. Посмотрите комментарии в коде - должно быть понятно.{/post}{/quote}  
Заполнил я массив, появилась новая непонятность. Вносятся строки, но есть смещение информации - перепробовал указывать всевозможные строки и столбцы... не получается, или в коде Вы намеренно указали не совсем верный диапазон??? А затем, количество значений? Ведь я же не программист - просто логически (мне, так кажется, по крайней мере) мыслящий человек... Но дело не в этом. Как строится логика выборки в указанном Вами диапазоне? Каким образом определить номера нужных мне ячеек? Или придется переопределять? Не получиться, что я нарушу массив??? :) Буду благодарен за ответ! Все равно, благодарен Вам за помощь
 
Простите, забыл прикрепить "что получилось"...
 
Содержимое массива надо было смотреть в окне Locals.  
Пока Николая нет, я чуть подправил, что Вы там назаводили. Работает нормально вроде...
 
{quote}{login=Hugo}{date=15.09.2010 03:39}{thema=}{post}Так ведь вот...  
Абсолютно с Вами согласен. Ругаться бессмысленно - только время тратить, а вот с подстановкой значения "Не заполнено" тоже вариант.    
Каким, только способом лучше прописать проверку ячейки на наличие в ней данных?  
И, следовательно, очищение ячеек уместно. А проверку необходимо будет зацыкливать, подозреваю.
 
Проверку сделать легко - когда в z уже накидали данные, проверяем его, так легче, можно в цикле, всего 3 строки добавил:  
 
   z(27) = x(26, 6) 'Вибрана система оподаткування  
     
   For i = 0 To 27  
   If z(i) = "" Then z(i) = "Не заполнено"  
   Next  
     
   ' а теперь полученный массив переносим на лист Информация  
   inf.Cells(Rows.Count, 2).End(xlUp).Offset(1).Resize(1, 28).Value = z  
 
А вот с очисткой опять нудное... - перебирать ячейки по-одной и чистить.  
Или кардинально - стереть всё, а на это место скопировать заготовленный чистый шаблон из скрытого листа.
 
For i = 0 To 27  
   If Trim(z(i)) = "" Then z(i) = "Не заполнено"  
   Next  
 
Так лучше, чтоб ячейки с пробелами считало за пустые.
 
СУПЕР! Я признателен Вам, за то, что указали на мою ошибку и я понял, что Excel "доходит до низу" тот столбец с которым он работает, считая только строки, а затем, переходит на следующий столбец за ним. Т.е. Столбец в котором был адрес и второй столбец, в котором указаны телефоны, следуют друг за другом, и, как только я их переписал по новой - все заработало. УРА! СПАСИБО, Вам.  
 
По второму варианту скрипта, думаю, там тоже интересное решение. Сейчас скину на тестовое заполнение исполнителям, а завтра утром увижу результат. А пока, займусь рассмотрением второго варианта. Как я писал выше, сбор данных буду проводить не только в разрезе контактов, но и более обширная информация о хозяйствах. Думаю, придется пользоваться выпадающими списками - если бы знать, что будет усложнять, а что будет упрощать решение задачи... :) СПАСИБО Вам! Будут вопросы-отпишусь, или закрою тему, как вопрос решенный.
 
Вопрос на засыпку, если четко Вам поставить задачу, за изготовление аналогичного (выше рассматриваемого) макроса какую сумму Вы бы взяли?  
 
1. Предусматривается его модификация, а у меня времени нет заниматься программированием, как никак я не всесилен, а работа имеет временные рамки по выполнении;  
2. Предусматривается расширение базы данных - сформировать сводные таблицы, не вопрос, но могут возникнуть небольшие заказы, интересует ли Вас мое предложение?
Страницы: 1
Читают тему
Наверх