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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 09.12.2007, 11:02   #1
Leanna
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 24
По умолчанию Как в VBA определить нижнюю границу базы данных

Есть база данных Фамилия/Имя/Оклад/Премия
1) Надо произвести суммирование Оклад+Премия = Общий заработок по всем ячейкам.
Проблема: данный отчет каждый раз применения макроса имеет одинаковое количество столбцов, но каждый раз разное количество строк.
Надо что бы общий заработок считался только в пределах базы данных.

2) Удалить те строчки, где зарплата превышает 20 000 руб.

Гипотетический пример: http://stream.ifolder.ru/4481290
Помогите пожалуйста.

Последний раз редактировалось Leanna; 09.12.2007 в 11:04.
Leanna вне форума
Старый 09.12.2007, 13:48   #2
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Ответ на Ваш вопрос, касаемо определения последней заполненной ячейки, можно найти здесь, но можно не тратить время, а просто скачать этот пример.
Вложения
Тип файла: zip Sample_for_Leanna.zip (7.8 Кб, 86 просмотров)

Последний раз редактировалось pashulka; 09.12.2007 в 14:52.
pashulka вне форума
Старый 10.12.2007, 20:54   #3
Leanna
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 24
По умолчанию

pashulka спасибо большое за помощь, я сейчас пытаюсь овладевать VBA для эксель, и хочу понять твои записи.


Цитата:
With Me.Range(Me.[A2], Me.[A65536].End(xlUp)).Offset(0, 4)
1) Offset - это видимо такой способ переместиться относительно текущей ячейки (здесь 4 стобца вправо)
Что делает End я не особо поняла (пыталась поднять справку, но она на английском и это непонимаение только усилилось), для чего вообще надо указывать 2 аргумента у Range, я раньше видела только что разве Range ("A2:A65536"). А здесь получается не Selection, а выделение первой и последней ячейки..

Цитата:
Application.Subtotal(2, .Cells) > 0
2) Данная функция проверяет значения ячеек начиная со второго ряда и, наверное,
вниз (.Cells), являются ли они больше нуля. Я так себе это представляю.

3)Хорошо, если мне, например, в столце "F" надо вычислить долю премии в зарплате "= D2/C2"
программа мне выдает ошибку. см рисунок внизу.
Как сделать верно?

4)И последний вопрос. Если я воспользуюсь формулой iRow = Range("A1").SpecialCells(xlLastCell ).Row
Каким образом я могу всю колонку начиная с "Е2" по "Е" + iRow заполнить формулой "= C2+D2"
Изображения
Тип файла: jpg Database.jpg (27.3 Кб, 145 просмотров)
Leanna вне форума
Старый 10.12.2007, 22:16   #4
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

1.
Цитата:
Offset - это видимо такой способ переместиться относительно текущей ячейки (здесь 4 столбца вправо)
В данном конкретном случае - относительно диапазона ячеек.

Цитата:
Что делает End я не особо поняла
Range("A65536").End(xlUp) - возвращает последнюю заполненную ячейку в столбце "A:A" (по сути, это эквивалент нажатию клавиш CTRL+стрелка вверх)

Цитата:
А здесь получается не Selection, а выделение первой и последней ячейки..
Не выделение первой и последней ячейки, а получение диапазона ячеек, начиная с ячейки "A2" и заканчивая последней заполненной ячейкой.

2. Нет, стандартная функция рабочего листа =ПРОМЕЖУТОЧНЫЕ.ИТОГИ(2; диапазон) возвращает количество ячеек содержащих числовые значения, причём с учётом фильтрации. Так что, мы просто проверяем, есть ли данные для удаления (без использования SpecialCells(xlVisible / xlCellTypeVisible))

3. .Offset(0, 1).Formula = "=D2/C2" '.Offset(, 1).Formula = "=D2/C2"

4. Me.Range("E2:E" & Me.[A1].SpecialCells(xlLastCell).Row).Form ula = "=C2+D2"
pashulka вне форума
Старый 11.12.2007, 17:02   #5
Leanna
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 24
По умолчанию

pashulka я попробовала преобразовать предложенный тобою макрос для использования в своих ежедневных задачах, хочу отметить, что считает большие объёмы данных намного быстрее чем через записаный макрорекордером макросом.

Файл вложила см. ниже. Возникли почему-то проблемы с АвтоФильтром, на нем выскакивает ошибка. Почему? И как это исправить?

И вопрос по .Value, есть ли какой либо другой способ преобразовать скопом все данные из формул в значения с A1, по F-последнюю ячейку.
Вложения
Тип файла: zip Database2.zip (28.8 Кб, 33 просмотров)
Leanna вне форума
Старый 11.12.2007, 22:05   #6
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

1. В первом примере автофильтр уже наличествовал и там мы могли использовать любой из имеющихся столбцов, во втором примере, Вы устанавливаете автофильтр только в первом столбце, но применить его хотите для четвёртого, что не есть хорошо.

Код:
With .EntireRow
     .AutoFilter Field:=4, Criteria1:="0"
     .Delete
End With
2. Вы можете заменить формулы на значения только один раз, перед фильтрацией, например так : .Resize(, 6).Value = .Resize(, 6).Value
Или скопировать весь диапазон, затем в меню Правка выбрать команду Специальная вставка, затем в появившемся стандартном диалоговом окне установить переключатель напротив Значения и кликнуть кнопку Ok. (программный код Вы, можете получить, просто воспользовавшись макрорекордером, а затем, немного почистить его от мусора, такого как, например, ненужное выделение)
pashulka вне форума
Старый 12.12.2007, 12:13   #7
Leanna
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 24
По умолчанию

pashulka, всё супер спасибо всё работает как надо, пришлось правда фильтр в начало текста выставить через Selection. Потому что with entire row, удаляет и строчку заголовков фильтра, из-за этого удалялись значения которые удалять не надо. В итоге получилось Database3. Я радостно ликую.

Хотелось ещё сказать что от End(xlUp)) пришлось отказаться, потому что при испытании в Primer_poslednei_yacheiki (HideFilter1 и Hidefilter2)

Код:
Sub HideSheet1() 
MsgBox Worksheets("Лист1").Range("A1").SpecialCells(xlLastCell).Row
End Sub
Код:
Sub HideSheet2()
MsgBox Worksheets("Лист1").[A65000].End(xlUp)
End Sub

HideFilter1 правильно выдает конец массива(18), а HideSheet2 выдает значение (7).
Вложения
Тип файла: zip Database3.zip (26.4 Кб, 35 просмотров)
Тип файла: rar Primer_poslednei_yacheiki.rar (7.8 Кб, 36 просмотров)
Leanna вне форума
Старый 12.12.2007, 22:40   #8
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Оба варианта дают правильные результаты (несмотря на то, что в первом примере речь идёт о номере строки, а во втором о значении ячейки, что далеко не одно и тоже), только нужно учитывать, что все они имеют свои особенности, в т.ч. и CTRL+END, и CTRL+стрелка вверх/вниз/и т.д.
Так, например, применение SpecialCells(xlLastCell) (и не только) приводит к тому, что выполняется событие Worksheet_SelectionChange() (и аналогичные события книги, приложения), причём в случае с последней ячейкой, это событие будет вызвано дважды. С этим, кстати, можно бороться (см. ниже) но лучше применять тот или иной метод в зависимости от ситуации, а пред'явленный гипотетический пример не содержал и намёка на то, что данные, которые требуется обработать могут находиться в скрытых ячейках.

Код:
Application.EnableEvents = False
iRow = Worksheets(1).[A1].SpecialCells(xlLastCell).Row
Application.EnableEvents = True
pashulka вне форума
Старый 28.11.2008, 18:45   #9
Zevs_Shah
 
Регистрация: 28.11.2008
Сообщений: 6
По умолчанию

Здравствуйте!
Прошу Вас помогите ПОЖАЛУЙСТА решить 5-задач на ПАСКАЛЕ. Я вообще ничего не смыслю в этой сфере...
- На основании анкетных данных студентов и итогов экзаменационных сессий определить:
1) Фамилии студентов из г. Москвы и процент их числа от общего числа студентов в группе.
2) Фамилии студентов не являющихся жителями г. Москвы, сдавших сессию с одной неудовлетворительной оценкой.
3) Определить списки студентов, сдавших сессию с одной тройкой.
4) Фамилии отличников, жителей г. Москвы и их процент от общего числа отличников в группе.
5) Определить список отличников жителей г. Москвы и их процент от общего числа отличников.
Надеюсь на Вашу помощь.
Zevs_Shah вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Базы данных Valera Помощь студентам 1 13.08.2008 10:38
Тип базы данных Dux БД в Delphi 7 23.04.2008 17:56
базы данных Gromsky Помощь студентам 2 03.03.2008 15:45