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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2010, 09:48   #1
Julit
Новичок
Джуниор
 
Регистрация: 29.12.2010
Сообщений: 8
По умолчанию

Всем привет!!! Вот моя задачка. Я скинула в архиве папочку 180 форма. В ней находится файлик prog_ter1.xls. В этом файлике 51 лист. Работает все это безобразие следующим образом:
1. На втором листе нажимаем кнопку "загрузить", и листы 3-48 заполняются данными. Данные находятся в файликах, которые лежат в папочке 180 форма:\temp
2. Нажимаем там же кнопочку "рассчитать", происходит расчет итоговой формочки, которая находится на первом листе, т.е. все данные с листов 3-48 помещаются на первый лист и там суммируются.
3. Нажимаем кнопочку "проверка". Происходит проверка правильности загруженных данных первого листа.
4. "выгрузка". Эта кнопочка нам не нужна.

А теперь сама задача:

1. Создать кнопку "проверка_овд" и к ней привязать макрос, который будет выполнять проверку не первого листа, а каждого листа с 3 по 48 и выдавать ошибки в следующем виде:
"Ошибка в столбце 1 раздела 1. Значение в строке 1 должно быть = строка1 + строка3 - строка10
Лист Самарский"
"Ошибка в столбце 1 раздела 1. Значение в строке 1 должно быть = строка1 + строка3 - строка10
Лист Ленинский"
и т. п.
И помещать все эти ошибки на лист 51.

2. Я пробовала создавать уже этот макрос. Его можно посмотреть в макросах. Это "proverka_ovd" или "proverka1_ovd" или "proverka2_ovd" - там разные варианты моих попыток.

3. Главная фишка, очень облегчающая задачу в том, что макрос "proverka" - это тот, который работает для первого листа одинаков для всех остальных листов также и в нем ничего не стоит менять, кроме того, что удалить проверку для 9 и 10 разделов, т.к. в листах овд этих данных нет!!!

4. Мне нужно прокрутить макрос "proverka" с 3 по 48 лист и выдать все ошибки на лист 51, или, если ошибок нет, то там бы появилась запись: "ошибок нет".

Т.е. на мой скромный взгляд юзера цикл должен работать следующим образом:
Выбрали лист 3 => проверили на наличие ошибок => выписали найденные ошибки на лист 51 => написали имя листа => перешли к следующему листу.

Если кто-то может помочь - напишите, пожалуйста!!! Задача очень срочная и важная. Если необходимо материальное вознаграждение, то в этом вопросе тоже проблем никаких нет. Только помогите!!!

Еще была идея создания такого простенького макроса. Т.к. макрос proverka у нас уже есть и он адекватно работает, то может быть стоит создать цикл, в котором эта процедура будет вызываться такое число раз, сколько листов в нашей книге. Т.е. получилось у меня в итоге следующее:

Sub proverka_ovd()
errStr = 1
For Each iList In Worksheets
Call Module1.proverka
i = i + 1
If Worksheets(51).Cells(errStr, 1).Value = 0 Then
Worksheets(51).Cells(errStr, 2).Value = "Ошибка на листе " & iNameList & Chr(10) & iList.Name
End If
Next
' proverka_ovd Макрос
' Макрос записан 20.12.2010 (adm)
'
' Сочетание клавиш: Ctrl+Shift+Y
'
End Sub

Но этот макрос не работает. В чем я ошибаюсь??? Что мне еще нужно учесть??? И кроме того этот макрос писался для каждого листа книги, а нужно, чтобы он выполнялся только для 3-48 листов...
Вложения
Тип файла: rar 180 форма.rar (1.88 Мб, 30 просмотров)

Последний раз редактировалось Stilet; 29.12.2010 в 17:25.
Julit вне форума Ответить с цитированием
Старый 29.12.2010, 11:02   #2
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

так можно перебрать нужные листы
Код:
Sub proverka_ovd()
    For iList = 3 To 48
        Worksheets(iList).Activate
        'Необходимые действия
    Next
End Sub
скорее всего, можно обойтись и без Activate, не вникал в работу кода проверки
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 29.12.2010, 11:35   #3
Julit
Новичок
Джуниор
 
Регистрация: 29.12.2010
Сообщений: 8
По умолчанию

Спасибо огромное за такой совет...

Теперь смотрите, что у меня получилось. Я переписала макрос. Во-первых, чтобы не исправлять работающий макрос proverka (proverka выводит данные на второй лист, а нам же ошибки нужны на 51), я создала макрос proverka1 и переписала код макроса proverka:

Sub proverka_ovd()
errStr = 1 'номер строки ошибки
For iList = 3 To 48
Worksheets(iList).Activate
Call Module3.proverka1 'выполняем проверку для каждого из листов с 3 по 51
If Worksheets(51).Cells(errStr, 1).Value <> 0 Then 'Начинаем заполнять имя листа. Если
'появилась ошибка, т.е. в строке 1 в столбце 1 есть данные, то надо писать название листа.
Worksheets(51).Cells(errStr, 2).Value = "Ошибка на листе " & iList.Name 'этой строчкой как раз
'название листа и задаем и в ней ошибка.
End If
Next
' proverka_ovd Макрос
' Макрос записан 20.12.2010 (adm)
'
' Сочетание клавиш: Ctrl+Shift+Y
'
End Sub

Выдает ошибку в строке, где я пытаюсь выдать название листа... В чем я неправа???
Julit вне форума Ответить с цитированием
Старый 29.12.2010, 11:50   #4
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Код:
Worksheets(51).Cells(errStr, 2).Value = "Ошибка на листе " & Worksheets(iList).Name
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 29.12.2010, 12:10   #5
Julit
Новичок
Джуниор
 
Регистрация: 29.12.2010
Сообщений: 8
По умолчанию

Код выполняется, ошибок по коду не выдает, но и ошибки на листах совсем даже не пытается искать. ПОЧЕМУ??? Никак не могу понять этот вопрос. Я же вызываю процедуру проверки, в которой все четко указано: что и где писать надо. А в завершении выдает ошибку на 48 листе. Я понимаю, что он на нем остановился и поэтому его и написал, а как-нибудь можно избежать этого???
Прикрепила последний вариант того, что у меня в итоге вышло окончательно:
Вложения
Тип файла: rar 180 форма.rar (1.87 Мб, 24 просмотров)
Julit вне форума Ответить с цитированием
Старый 29.12.2010, 12:23   #6
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию

вы темр то каждый раз не гоняйте, ждать скачки 15 минут -- не .....
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 29.12.2010, 15:16   #7
Julit
Новичок
Джуниор
 
Регистрация: 29.12.2010
Сообщений: 8
По умолчанию

Довела до ума свой макросик. Осталась одна маленькая проблемка. Смотрим, что у нас получается на листе, где мы выводим ошибки - лист 51. В строке 1 столбец 1 у нас записываются ошибки, которые пороверка находит на листе, в 2 строке столбец 1 у нас выдается название листа, на котором эти ошибки сделаны. Проблема в том, что в 1 столбце у нас под ошибки выделяется только одна строчка на лист, если же на листе больше 1 ошибки, то записывается только та, которая найдена последней - как эту проблему решить??? Помогите, пожалуйста, довести задачку до конца!!!!
Кстати, на втором листе появилась кнопочка "ошибки райотделов", к которой привязан мой многострадальный макросик )))
Вложения
Тип файла: rar prog_ter3.rar (145.9 Кб, 24 просмотров)
Julit вне форума Ответить с цитированием
Старый 29.12.2010, 16:06   #8
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию стиль написания макроса

читабельность не более 2 баллов
если оставить вашу схему смещений, то посмотрите вариант

Код:
Dim diffKol, diffStr, errStr
'''''''''''''''''''''''''''''''
Function zc(zstr, zkol)
Dim ss
ss = Cells(zstr + diffStr, zkol + diffKol).Value
If ss = "" Then ss = 0
End Function
'''''''''''''''''''''''''''''''
Function fpech(n1z)
 errStr = errStr + 1
 Worksheets("zpech").Cells(errStr, 1) = Excel.ActiveSheet.Name
Worksheets("zpech").Cells(errStr, 2).Value = "Ошибка в строке " & Str(i - diffStr) & " раздела 3. Значение в столбце 1 должно быть >= значения в столбце 2"
       
End Function
''''''''''''''''''''''''''''''''''''''''''''
Sub proverka()

'............................
'раздел 3
raz = 3
diffKol = 5
diffStr = 139

For i = 1 To 13
    If zc(i, 1) < zc(i, 2) Then
        fpech "Ошибка в строке " & Str(i ) & " раздела 3. Значение в столбце 1 должно быть >= значения в столбце 2"
    End If
Next i
For kol = 1 To 2
    For str2 = 2 To 9
     If zc(1, kol)  < zc(str2, kol) Then
        fpech "Ошибка в " & Str(kol) & " столбце " & Str(raz) & " раздела. Значение в строке " & Str(str1) & " должно быть >= Значению в строке " & Str(str2)
      End If
      Next str2
     If zc(10, kol) <> zc(11, kol) + zc(12, kol) + zc(13, kol) Then
        fpech "Ошибка в " & Str(kol) & " столбце 3 раздела. Значение в строке 10 должно быть = сумме строк c 11 по 13"
     End If
Next kol

'раздел4
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 29.12.2010, 16:17   #9
Julit
Новичок
Джуниор
 
Регистрация: 29.12.2010
Сообщений: 8
По умолчанию

Спасибо за код, но можно объяснить его словами??? А то я с функциями что-то запуталась совсем... (((
Julit вне форума Ответить с цитированием
Старый 29.12.2010, 16:23   #10
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию

функция zc -значение ячейки со смещениями
функцмя fpech -печать некого текста в ячейке листа ошибок, которому дала имя zpech, и имя проверяемого листа

и пара объявления переменных
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какие есть книги по VBA для access 2007 A.F. Microsoft Office Access 2 17.01.2011 09:16
Как создать кнопку для всех листов книги? kipish_lp Microsoft Office Excel 5 06.05.2010 17:43
перенос данных из нескольких листов в 1 Екатрина Microsoft Office Excel 5 17.12.2009 18:28
Список листов книги Scolopendra Microsoft Office Excel 3 12.12.2009 21:58
печать нескольких листов checkbox Microsoft Office Excel 2 16.01.2008 00:50