|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.01.2012, 21:37 | #1 |
Регистрация: 03.01.2012
Сообщений: 7
|
Проблема с диапазоном ячеек в Excel.
Вообщем, макрос, из формы на лист должны вставляются данные (накапливаться) в таблицу, в первую свободную строку в диапазоне строк с 7 по 37 т.к 31 день в месяце, проблема как можно реализовать это. Проблема когда доходит до 37 строки, заполняет 37 строку в первом столбце правильно, а дальше перескакивает на 38 не заполняя остальные столбцы 37 строки т.к. за основу берется один базовый столбец а остальные столбцы заполняются приращением метода Offset.
Как можно реализовать заполнение только определенного диапазона??? люди помогите? Private Sub CommandButton3_Click() If ActiveSheet.Range("c7").Value = "" Then ActiveSheet.Range("c5").End(xlDown) .Offset(1, 0).Value = a ActiveSheet.Range("c5").End(xlDown) .Offset(1, 1).Value = pa ActiveSheet.Range("c5").End(xlDown) .Offset(1, 3).Value = socc ActiveSheet.Range("c5").End(xlDown) .Offset(1, 4).Value = psocc ActiveSheet.Range("c5").End(xlDown) .Offset(1, 6).Value = su ActiveSheet.Range("c5").End(xlDown) .Offset(1, 7).Value = psu ActiveSheet.Range("c5").End(xlDown) .Offset(1, 9).Value = soc ActiveSheet.Range("c5").End(xlDown) .Offset(1, 10).Value = psoc ActiveSheet.Range("c5").End(xlDown) .Offset(1, 12).Value = suhm ActiveSheet.Range("c5").End(xlDown) .Offset(1, 13).Value = psuhm ActiveSheet.Range("c5").End(xlDown) .Offset(1, 15).Value = socdo ActiveSheet.Range("c5").End(xlDown) .Offset(1, 16).Value = psocdo ActiveSheet.Range("c5").End(xlDown) .Offset(1, 18).Value = spk ActiveSheet.Range("c5").End(xlDown) .Offset(1, 19).Value = pspk ActiveSheet.Range("c5").End(xlDown) .Offset(1, 21).Value = vge ActiveSheet.Range("c5").End(xlDown) .Offset(1, 22).Value = pvge ActiveSheet.Range("c5").End(xlDown) .Offset(1, 24).Value = drs ActiveSheet.Range("c5").End(xlDown) .Offset(1, 25).Value = pdrs ElseIf ActiveSheet.Range("c7").Value <> "" Then ActiveSheet.Range("c6").End(xlDown) .Offset(1, 0).Value = a ActiveSheet.Range("c6").End(xlDown) .Offset(0, 1).Value = pa ActiveSheet.Range("c6").End(xlDown) .Offset(0, 3).Value = socc ActiveSheet.Range("c6").End(xlDown) .Offset(0, 4).Value = psocc ActiveSheet.Range("c6").End(xlDown) .Offset(0, 6).Value = su ActiveSheet.Range("c6").End(xlDown) .Offset(0, 7).Value = psu ActiveSheet.Range("c6").End(xlDown) .Offset(0, 9).Value = soc ActiveSheet.Range("c6").End(xlDown) .Offset(0, 10).Value = psoc ActiveSheet.Range("c6").End(xlDown) .Offset(0, 12).Value = suhm ActiveSheet.Range("c6").End(xlDown) .Offset(0, 13).Value = psuhm ActiveSheet.Range("c6").End(xlDown) .Offset(0, 15).Value = socdo ActiveSheet.Range("c6").End(xlDown) .Offset(0, 16).Value = psocdo ActiveSheet.Range("c6").End(xlDown) .Offset(0, 18).Value = spk ActiveSheet.Range("c6").End(xlDown) .Offset(0, 19).Value = pspk ActiveSheet.Range("c6").End(xlDown) .Offset(0, 21).Value = vge ActiveSheet.Range("c6").End(xlDown) .Offset(0, 22).Value = pvge ActiveSheet.Range("c6").End(xlDown) .Offset(0, 24).Value = drs ActiveSheet.Range("c6").End(xlDown) .Offset(0, 25).Value = pdrs End If If ActiveSheet.Range("c36").End(xlDown ).Value <> "" Then ActiveSheet.Range("c37").Value = a ActiveSheet.Range("c37").Offset(0, 1).Value = pa ActiveSheet.Range("c37").Offset(0, 3).Value = socc ActiveSheet.Range("c37").Offset(-0, 4).Value = psocc ActiveSheet.Range("c37").Offset(0, 6).Value = su ActiveSheet.Range("c37").Offset(0, 7).Value = psu ActiveSheet.Range("c37").Offset(0, 9).Value = soc ActiveSheet.Range("c37").Offset(0, 10).Value = psoc ActiveSheet.Range("c37").Offset(0, 12).Value = suhm ActiveSheet.Range("c37").Offset(0, 13).Value = psuhm ActiveSheet.Range("c37").Offset(0, 15).Value = socdo ActiveSheet.Range("c37").Offset(0, 16).Value = psocdo ActiveSheet.Range("c37").Offset(0, 18).Value = spk ActiveSheet.Range("c37").Offset(0, 19).Value = pspk ActiveSheet.Range("c37").Offset(0, 21).Value = vge ActiveSheet.Range("c37").Offset(0, 22).Value = pvge ActiveSheet.Range("c37").Offset(0, 24).Value = drs ActiveSheet.Range("c37").Offset(-0, 25).Value = pdrs End If 'ActiveWorkbook.Save End Sub Последний раз редактировалось a1bert; 04.01.2012 в 01:33. |
03.01.2012, 21:49 | #2 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,856
|
Ваш макрос можно сократить до 2-3 строк кода
Вот только сложно это сделать, не увидев ваш файл Excel |
03.01.2012, 21:52 | #3 | |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Можно использовать следующее: 1. Прямое обращение. Код вида: Код:
x_tab - значение исходной строки Х (например 7). n - смещение по строкам. y_tab - значение исходной колонки Y (например 3). i - смещение по столбцам. 2. Обращение через именованные области. Код вида: Код:
С уважением, Алексей.
|
|
03.01.2012, 22:19 | #4 |
Регистрация: 03.01.2012
Сообщений: 7
|
Алексей спасибо за оперативность! но у меня данные должны вставляться в первую пустую строку диапазона, и с
шаблон.Cells(x_tab+n, y_tab + i).Value="значение" не совсем понятно тогда, к этому примеру тоже можно применить End(xlDown).Offset(1, 0) или я не догоняю чет |
03.01.2012, 23:27 | #5 | |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Используй циклы в работе, то же for/next. По условию описанному тобой, это сделать очень просто. Перспективен второй способ, так как дает возможность ссылаться на ячейки косвенно. И при изменении структуры листа (например при сдвиге строк), не нужно будет переписывать код.
С уважением, Алексей.
Последний раз редактировалось tae1980; 03.01.2012 в 23:36. |
|
03.01.2012, 23:50 | #6 | |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Код:
С уважением, Алексей.
|
|
04.01.2012, 00:21 | #7 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,856
|
a1bert, вам явно не хочется получить готовый макрос из 3 строк
Что мешает показать нам свой файл? Как-то лень делать макрос, учитывая, что он может не сработать в вашем файле из-за хитрой структуры таблицы. Вкратце - делается это так: Код:
|
04.01.2012, 00:39 | #8 |
Регистрация: 03.01.2012
Сообщений: 7
|
|
04.01.2012, 01:06 | #9 | |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Сейчас протестил на скорую руку, должно работать. По сути это аналог нажатия на клаве "Ctrl+стрелки". Попробуй по нажимать у себя на листе "Ctrl+вниз".
С уважением, Алексей.
Последний раз редактировалось tae1980; 04.01.2012 в 01:08. |
|
04.01.2012, 01:24 | #10 |
Регистрация: 03.01.2012
Сообщений: 7
|
Должны заполнятся данными столбцы С, D, F, G и т.д. построчно с 7 по 37 строки, базовый "С" т.е. если 9 ячейка в этом столбце пустая тогда все данные вставляются в девятую строку этих столбцов С, D, F, G.....
Мой алгоритм отлично работает только до 37 строки((( только значение для С вставляется коректно, а остальное в 39ю |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
MS Excel -> формат ячеек | spirit-ua | Microsoft Office Excel | 3 | 11.07.2011 13:48 |
Заливка ячеек в Excel | Доктор | Microsoft Office Excel | 12 | 04.02.2011 13:51 |
Защита ячеек в excel 2007 | Brucebelg | Microsoft Office Excel | 4 | 27.09.2010 13:56 |
работа с диапазоном ячеек? | panzergto | Microsoft Office Excel | 4 | 01.04.2010 21:25 |
Проблема с диапазоном дат | Yur@ | БД в Delphi | 7 | 16.12.2009 20:15 |