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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2012, 21:37   #1
a1bert
 
Регистрация: 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
Изображения
Тип файла: jpg Безымянный.jpg (65.5 Кб, 121 просмотров)

Последний раз редактировалось a1bert; 04.01.2012 в 01:33.
a1bert вне форума Ответить с цитированием
Старый 03.01.2012, 21:49   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Ваш макрос можно сократить до 2-3 строк кода
Вот только сложно это сделать, не увидев ваш файл Excel
EducatedFool вне форума Ответить с цитированием
Старый 03.01.2012, 21:52   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от a1bert Посмотреть сообщение
Вообщем, макрос, из формы на лист должны вставляются данные (накапливаться) в таблицу, в первую свободную строку в диапазоне строк с 7 по 37 т.к 31 день в месяце, проблема как можно реализовать это. Проблема когда доходит до 37 строки, заполняет 37 строку в первом столбце правильно, а дальше перескакивает на 38 не заполняя остальные столбцы 37 строки т.к. за основу берется один базовый столбец а остальные столбцы заполняются приращением метода Offset.
Как можно реализовать заполнение только определенного диапазона??? люди помогите?
А почему просто не контролировать весь процесс? Я тоже использовал раньше подобный способ, но сейчас полностью от него отказался.
Можно использовать следующее:
1. Прямое обращение. Код вида:
Код:
шаблон.Cells(x_tab+n, y_tab + i).Value="значение"
Где: шаблон - ссылка на нужный лист.
x_tab - значение исходной строки Х (например 7).
n - смещение по строкам.
y_tab - значение исходной колонки Y (например 3).
i - смещение по столбцам.

2. Обращение через именованные области. Код вида:
Код:
Evaluate("Имя_области").item(n, i) = "значение"
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 03.01.2012, 22:19   #4
a1bert
 
Регистрация: 03.01.2012
Сообщений: 7
По умолчанию

Алексей спасибо за оперативность! но у меня данные должны вставляться в первую пустую строку диапазона, и с
шаблон.Cells(x_tab+n, y_tab + i).Value="значение"
не совсем понятно тогда, к этому примеру тоже можно применить End(xlDown).Offset(1, 0) или я не догоняю чет
a1bert вне форума Ответить с цитированием
Старый 03.01.2012, 23:27   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от a1bert Посмотреть сообщение
Алексей спасибо за оперативность! но у меня данные должны вставляться в первую пустую строку диапазона, и с
шаблон.Cells(x_tab+n, y_tab + i).Value="значение"
не совсем понятно тогда, к этому примеру тоже можно применить End(xlDown).Offset(1, 0) или я не догоняю чет
Наличие подобного требования указывает на плохую проработку структуры программы. Значительно проще и правильнее переработать программу так что бы уйти от подобного требования. Сам пытался идти по тому пути, что ты идешь сейчас, получил только проблемы. Но если ты настаиваешь: найди первую пустую строку либо в цикле, либо есть профильная формула аналог Offset, но сходу её не вспомню, так как пользовался последний раз более года назад.
Используй циклы в работе, то же for/next. По условию описанному тобой, это сделать очень просто.
Перспективен второй способ, так как дает возможность ссылаться на ячейки косвенно. И при изменении структуры листа (например при сдвиге строк), не нужно будет переписывать код.
С уважением, Алексей.

Последний раз редактировалось tae1980; 03.01.2012 в 23:36.
tae1980 вне форума Ответить с цитированием
Старый 03.01.2012, 23:50   #6
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от a1bert Посмотреть сообщение
Алексей спасибо за оперативность! но у меня данные должны вставляться в первую пустую строку диапазона, и с
шаблон.Cells(x_tab+n, y_tab + i).Value="значение"
не совсем понятно тогда, к этому примеру тоже можно применить End(xlDown).Offset(1, 0) или я не догоняю чет
Попробуй вот это:
Код:
Cells(Rows.Count, n).End(xlUp).Offset(1) = "значение"
где n - номер столбца.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 04.01.2012, 00:21   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

a1bert, вам явно не хочется получить готовый макрос из 3 строк

Что мешает показать нам свой файл?
Как-то лень делать макрос, учитывая, что он может не сработать в вашем файле из-за хитрой структуры таблицы.

Вкратце - делается это так:

Код:
Sub a1bert()
    ' ищем первую пустую ячейку в столбце C
    Dim cell As Range: Set cell = Range("C" & Rows.Count).End(xlUp).Offset(1)

    ' заносим значения сразу в 26 ячеек найденной строки
    cell.Resize(, 26).Value = Array(a, pa, "", socc, psocc, "", su, psu, "", soc, psoc, "", _
                                    suhm, psuhm, "", socdo, psocdo, "", spk, pspk, "", _
                                    vge, pvge, "", drs, pdrs)

End Sub
EducatedFool вне форума Ответить с цитированием
Старый 04.01.2012, 00:39   #8
a1bert
 
Регистрация: 03.01.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Попробуй вот это:
Код:
Cells(Rows.Count, n).End(xlUp).Offset(1) = "значение"
где n - номер столбца.
находит первую пустую ячейку в столбце n, т.е. после которой уже точно нет данных, это не подойдет точно, а надо первую пустую в первом же разрыве т.е. нашем диапазоне
a1bert вне форума Ответить с цитированием
Старый 04.01.2012, 01:06   #9
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от a1bert Посмотреть сообщение
находит первую пустую ячейку в столбце n, т.е. после которой уже точно нет данных, это не подойдет точно, а надо первую пустую в первом же разрыве т.е. нашем диапазоне
Ты верен что у тебя пустые ячейки? " ="" " - Это не пустое значение.
Сейчас протестил на скорую руку, должно работать. По сути это аналог нажатия на клаве "Ctrl+стрелки". Попробуй по нажимать у себя на листе "Ctrl+вниз".
С уважением, Алексей.

Последний раз редактировалось tae1980; 04.01.2012 в 01:08.
tae1980 вне форума Ответить с цитированием
Старый 04.01.2012, 01:24   #10
a1bert
 
Регистрация: 03.01.2012
Сообщений: 7
По умолчанию

Должны заполнятся данными столбцы С, D, F, G и т.д. построчно с 7 по 37 строки, базовый "С" т.е. если 9 ячейка в этом столбце пустая тогда все данные вставляются в девятую строку этих столбцов С, D, F, G.....

Мой алгоритм отлично работает только до 37 строки((( только значение для С вставляется коректно, а остальное в 39ю
Изображения
Тип файла: jpg Безымянный.jpg (65.5 Кб, 120 просмотров)
a1bert вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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