Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Генератор заказов - устранение ошибок. / 25 сообщений из 25, страница 1 из 1
18.02.2007, 12:49:07
    #34339010
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Привет всем!
Помогите, пожалуйста, новичку решить некоторые проблемы (файл прилагается). Задача такая. Необходимо из прилагаемого файла СТЕКЛО.XLS создать 2 новых файла (заказы), в одном - те данные, что за наличный расчет, в другом - по безналу.
Это я сделал, просидев неделю над справочниками, но остались некоторые моменты, для решения которых мне, на данном этапе, не хватает знаний.

Проблема №1.
При первом запуске макроса из "ЗАКАЗ.XLS" происходит остановка выполнения программы на строке Set PageWb = Workbooks(wbName).Sheets("Бланк заказов") (см. прилагаемую программу), хотя проверку я вроде сделал. При повторном запуске макроса (когда создаваемые файлы УЖЕ существуют) всё чудесно работает. Где ошибка - не пойму.

Проблема №2.
Никак не могу приделать этот макрос к кнопке на ПЕРВОМ листе документа (рядом с инструкцией).
Пробовал подключать мой макрос из модуля через CALL - не работает. Может проблема в Офисе97, под которым я работаю? Приходится запускать макрос через панель инструментов, но для простых юзеров кнопка всё же лучше...


Проблема №3.
Сортировка данных в заказах по номеру заказа. Использовал метод сортировки:

' ### Сортировка данныз по номеру заказа в ZAKAZ-NAL.XLS
PageWb.Range(Cells(J1, 1), Cells(J - 1, 7)).Select
Selection.Sort Key1:=Cells(J1, 1), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
PageWb.Cells(1, 1).Select ' снятие выделения области

Не получилось. Программа останавливается, а ошибку определить не может!

Помогите, пожалуйста. Вот срочно потребовалось для работы сделать, а программистов у нас нет.
...
Рейтинг: 0 / 0
18.02.2007, 15:34:26
    #34339136
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37

По поводу проблемы №3.
У Вас переменная J1 встречается в коде первый раз именно в сроке

Код: plaintext
PageWb.Range(Cells(J1,  1 ), Cells(J -  1 ,  7 )).Select

т.к. по сути это номер строки, то нужно где-то ранее присвоить ей значение >0
...
Рейтинг: 0 / 0
18.02.2007, 16:51:42
    #34339205
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Возможно Вы имели в виду не J1 а J - 1 и просто ошиблись в наборе
...
Рейтинг: 0 / 0
18.02.2007, 17:57:59
    #34339256
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
По проблеме №1: если в каталоге еще нет файлов "ZAKAZ-BEZNAL.XLS" и "ZAKAZ-NAL.XLS" то переменные wbName и wbName2 получают значение "" (пустая строка) (в строках 48 и 61 соответсвенно), а потом в стр.74 и 75 эти переменные используются в качестве названий книг для инициализации объектов:
Код: plaintext
1.
Set PageWb = Workbooks(wbName).Sheets("Бланк заказов")
Set PageWb2 = Workbooks(wbName2).Sheets("Бланк заказов")
Решение простое:
в строке 59 (после ActiveWorkbook.SaveAs wbFullName ) добавить wbName = Dir(wbFullName) ,
а в строке 72 (после ActiveWorkbook.SaveAs wbFullName2 ) добавить wbName2 = Dir(wbFullName2) .
...
Рейтинг: 0 / 0
18.02.2007, 18:01:39
    #34339264
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
lena_#### Alex37

По поводу проблемы №3.
У Вас переменная J1 встречается в коде первый раз именно в сроке

Код: plaintext
PageWb.Range(Cells(J1,  1 ), Cells(J -  1 ,  7 )).Select

т.к. по сути это номер строки, то нужно где-то ранее присвоить ей значение >0
Нет есть, в описании Dim...
Код: plaintext
 Dim J1 As Integer 
и ниже :)
Код: plaintext
1.
2.
3.
4.
 Nal =  0 : BezNal =  0 
 I =  3                               
 J =  6 : J1 = J                            
 K =  6 : K1 = K                       
Это вспомогательная переменная - хранит начальные координаты ( номер строки) вводимых в отчет данных. Специально использовал, чтобы применить для сортировки. J ведь изменит значение в процессе работы программы.
...
Рейтинг: 0 / 0
18.02.2007, 18:07:11
    #34339269
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37

Но в выложенном Вами файле я этого не нашла. Либо полохо искала, либо вы выложили не тот вариант :)
...
Рейтинг: 0 / 0
18.02.2007, 18:12:20
    #34339279
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
lena_####Возможно Вы имели в виду не J1 а J - 1 и просто ошиблись в наборе
И тут все верно. J1, как я указал выше, хранит координаты строки с первой записью.
J-1 - это номер последней последней строки с введенными данными.
А в строке J вводятся суммарные значения: "Количество" и "Общая площадь"
Я применяю "паскалевский" подход, т.к. не умею ещё работать, например, со столбцами данных. Поэтому пришлось расчетным путем искать координаты последней записи чтобы потом отсортировать данные.
...
Рейтинг: 0 / 0
18.02.2007, 18:18:10
    #34339285
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
lena_#### Alex37

Но в выложенном Вами файле я этого не нашла. Либо полохо искала, либо вы выложили не тот вариант :)
Точно. Я виноват. Не тот вариант выложил. У меня из тут десятка два уже набралось... Но и код с сортировкой я закоментарил... :)
Вот вариант, про который я имел в виду. Ещё раз извините!
...
Рейтинг: 0 / 0
18.02.2007, 18:30:29
    #34339298
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
vbaproПо проблеме №1: если в каталоге еще нет файлов "ZAKAZ-BEZNAL.XLS" и "ZAKAZ-NAL.XLS" то переменные wbName и wbName2 получают значение "" (пустая строка) (в строках 48 и 61 соответсвенно), а потом в стр.74 и 75 эти переменные используются в качестве названий книг для инициализации объектов:
Код: plaintext
1.
Set PageWb = Workbooks(wbName).Sheets("Бланк заказов")
Set PageWb2 = Workbooks(wbName2).Sheets("Бланк заказов")
Решение простое:
в строке 59 (после ActiveWorkbook.SaveAs wbFullName ) добавить wbName = Dir(wbFullName) ,
а в строке 72 (после ActiveWorkbook.SaveAs wbFullName2 ) добавить wbName2 = Dir(wbFullName2) .
Точно! Добавил указанные строки - все заработало! Спасибо большое. Сам бы никогда не догадался - это уж точно! :)
Правда, я не совсем понял почему не работало без них? Ведь эти строки у меня чуть выше прописаны. Эти "wbName" и "wbName2" обнуляются?
...
Рейтинг: 0 / 0
18.02.2007, 19:07:54
    #34339338
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37Правда, я не совсем понял почему не работало без них? Ведь эти строки у меня чуть выше прописаны. Эти "wbName" и "wbName2" обнуляются?
например, wbName = Dir(wbFullName). Когда файла с именем wbFullName еще нет, то wbName получает пустую строку, и дальше нигде не получает значения, хотя видно, что должна :).
...
Рейтинг: 0 / 0
18.02.2007, 19:19:53
    #34339352
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37

У меня Ваш код заработал после замены:

Код: plaintext
1.
2.
3.
PageWb.Range(Cells(J1,  1 ), Cells(J -  1 ,  7 )).Select        ' выделяем область сортировки
Selection.Sort Key1:=Cells(J1,  1 ), Order1:=xlAscending, Header:=xlGuess, _
           OrderCustom:= 1 , MatchCase:=False, Orientation:=xlTopToBottom
PageWb.Cells( 1 ,  1 ).Select                                 ' снятие выделения области

на:

Код: plaintext
1.
2.
PageWb.Activate
PageWb.Range(Cells(J1,  1 ), Cells(J -  1 ,  7 )).Sort Key1:=Cells(J1,  1 ), Order1:=xlAscending, Header:=xlGuess, _
           OrderCustom:= 1 , MatchCase:=False, Orientation:=xlTopToBottom
...
Рейтинг: 0 / 0
18.02.2007, 19:40:18
    #34339371
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37Проблема №2.
Никак не могу приделать этот макрос к кнопке на ПЕРВОМ листе документа (рядом с инструкцией).
Пробовал подключать мой макрос из модуля через CALL - не работает. Может проблема в Офисе97, под которым я работаю? Приходится запускать макрос через панель инструментов, но для простых юзеров кнопка всё же лучше...Вот, попробовал сделать кнопку, вроде работает. И под 97-м тоже. Хотя
Код: plaintext
ThisWorkbook.Sheets("Бланк заказов").Copy
пришлось заменить на
Код: plaintext
1.
ThisWorkbook.Sheets("Бланк заказов").Activate
Sheets("Бланк заказов").Copy
но это не из-за кнопки, конечно
...
Рейтинг: 0 / 0
19.02.2007, 11:21:39
    #34340301
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
lena_#### Alex37

У меня Ваш код заработал после замены:

...........................
на:

Код: plaintext
1.
2.
PageWb.Activate
PageWb.Range(Cells(J1,  1 ), Cells(J -  1 ,  7 )).Sort Key1:=Cells(J1,  1 ), Order1:=xlAscending, Header:=xlGuess, _
           OrderCustom:= 1 , MatchCase:=False, Orientation:=xlTopToBottom

у меня тоже получилось, работает вот так
Код: plaintext
1.
2.
PageWb.Activate
Range(Cells(J1,  1 ), Cells(J -  1 ,  7 )).Sort Key1:=Cells(J1,  1 ), Order1:=xlAscending, Header:=xlGuess, _
           OrderCustom:= 1 , MatchCase:=False, Orientation:=xlTopToBottom
но Ваше решение мне кажется более правильным, поправлю. Спасибо.
...
Рейтинг: 0 / 0
19.02.2007, 11:24:52
    #34340319
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
vbapro Alex37Проблема №2.
Никак не могу приделать этот макрос к кнопке на ПЕРВОМ листе документа (рядом с инструкцией).
Пробовал подключать мой макрос из модуля через CALL - не работает. Может проблема в Офисе97, под которым я работаю? Приходится запускать макрос через панель инструментов, но для простых юзеров кнопка всё же лучше...Вот, попробовал сделать кнопку, вроде работает. И под 97-м тоже. Хотя
Код: plaintext
ThisWorkbook.Sheets("Бланк заказов").Copy
пришлось заменить на
Код: plaintext
1.
ThisWorkbook.Sheets("Бланк заказов").Activate
Sheets("Бланк заказов").Copy
но это не из-за кнопки, конечно
К сожалению файл скачивается, но не ZIP. Не могли бы повторно его выложить? Буду очень признателен.
...
Рейтинг: 0 / 0
19.02.2007, 11:43:19
    #34340384
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
вот RAR
...
Рейтинг: 0 / 0
19.02.2007, 13:32:43
    #34340801
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
vbaproвот RAR
Спасибо, скачал, посмотрел. Ведь дома делел также и другие варианты, через CALL (там Офис97) - не получилось. Кнопка работала некоректно. Сейчас попробовал под Excel 2003 - работает. Кнопку подключил. Дома попробую под Excel 97 запустить.
...
Рейтинг: 0 / 0
19.02.2007, 13:38:46
    #34340825
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
vbapro..................................
а в строке 72 (после ActiveWorkbook.SaveAs wbFullName2 ) добавить wbName2 = Dir(wbFullName2) .
А не подскажете, как при сохранении файла, в имя файла включить текущую дату, типа
ZAKAZ-19-02-2007.XLS
Где-то видел на форуме, а теперь вот понадобилось самому - найти не могу...
...
Рейтинг: 0 / 0
19.02.2007, 13:42:22
    #34340839
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Код: plaintext
Filename = "ZAKAZ-" & Format(Now, "DD-MM-YYYY") & ".XLS"
...
Рейтинг: 0 / 0
19.02.2007, 13:44:18
    #34340852
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37 vbapro..................................
а в строке 72 (после ActiveWorkbook.SaveAs wbFullName2 ) добавить wbName2 = Dir(wbFullName2) .
А не подскажете, как при сохранении файла, в имя файла включить текущую дату, типа
ZAKAZ-19-02-2007.XLS
Где-то видел на форуме, а теперь вот понадобилось самому - найти не могу...

Код: plaintext
1.
wbFullName2="ZAKAZ-" & Format(Date,"DD-MM-YYYY") &".XLS"
ActiveWorkbook.SaveAs wbFullName2

но для сортировки по датам лучше:

Код: plaintext
1.
wbFullName2="ZAKAZ-" & Format(Date,"YYYY-MM-DD") &".XLS"
ActiveWorkbook.SaveAs wbFullName2

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
19.02.2007, 13:50:37
    #34340879
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
KL (XL)но для сортировки по датам лучше:

Код: plaintext
1.
wbFullName2="ZAKAZ-" & Format(Date,"YYYY-MM-DD") &".XLS"
ActiveWorkbook.SaveAs wbFullName2

KL
[MVP - Microsoft Excel]
я тоже за :)
...
Рейтинг: 0 / 0
19.02.2007, 14:18:01
    #34341001
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37 Попробуй
...
Рейтинг: 0 / 0
19.02.2007, 20:00:32
    #34342317
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
vkodorAlex37 Попробуй
Спасибо за файл. Обнаружил там кое-какие изменения. В том числе и новый для меня оператор Is
Код: plaintext
 If st Is Nothing Then Workbooks.Open stFullName
и запись файла в новом формате
Код: plaintext
1.
 wbFullName = FullPath & "ZAKAZ-" & Format(Date, "YYYY-MM-DD") & ".XLS"
Неожиданное решение по выделению области перед сортировкой... Такого я не ожидал! :)

А вот эта "очистка" обязательна? Ведь пользователь документ, после выполнения кода, всё равно закрывать будет!?
Код: plaintext
1.
2.
3.
4.
  Set PageSt = Nothing
  Set PageWb = Nothing
  Set PageWb2 = Nothing
  Set st = Nothing
Или эти переменные в памяти остаются?
...
Рейтинг: 0 / 0
20.02.2007, 12:29:08
    #34343470
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37 vkodorAlex37 Попробуй
Спасибо за файл.
У меня нет 97- го поэтому итересно: Kорректно ли отработал?
Alex37Обнаружил там кое-какие изменения. В том числе и новый для меня оператор Is
Он для тебя не новый
Код: plaintext
If Not wb Is Nothing Then wb.Close ' если не Nothing 

Код: plaintext
If wb Is Nothing Then wb.Close ' если  Nothing 

соответственно
Код: plaintext
1.
2.
3.
4.
5.
    On Error Resume Next 'отложение ошибки
    Set st = Workbooks(stName) ' попытка присвоить переменной значение
    On Error GoTo  0  ' очистка ошибок
    If st Is Nothing Then Workbooks.Open stFullName  
    'если переменной ничего не присвоилось (т.е.  = Nothing) _
    значит файл закрыт и его надо открывать

Alex37
и запись файла в новом формате
Код: plaintext
 wbFullName = FullPath & "ZAKAZ-" & Format(Date, "YYYY-MM-DD") & ".XLS"


этот формат предложил KL (XL) и я с ним полностью согласен

Alex37
Неожиданное решение по выделению области перед сортировкой... Такого я не ожидал! :)

никакого выделения нет, сразу сортировка
давно заметил что в аргументах лучше указывать имя листа (ну чтоб можно было сортировать при не активном листе)
я бы предложил еще использовать конструкцию With - End With
Код: plaintext
1.
2.
3.
4.
With PageWb
    .Range(.Cells(J1,  1 ), .Cells(J -  1 ,  7 )).Sort Key1:=.Cells(J1,  1 ), _
          Order1:=xlAscending, Header:=xlGuess, OrderCustom:= 1 , _
          MatchCase:=False, Orientation:=xlTopToBottom
End With
Alex37
А вот эта "очистка" обязательна?
У меня были проблемы, если я не обнулял обьектные переменные.
Правда в других ситуациях. Вообщем мной этот вопрос доконца не изучен. Лучше если ответит на этот вопрос более знающий человек.
А я стараюсь всегда закрывать и обнулять ссылки.
...
Рейтинг: 0 / 0
20.02.2007, 19:13:39
    #34345110
Alex37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Отвечаю на последнее сообщение vkodor.
Чесно говоря, запутался в этих quot - не смог победить! Пишу так.

Файлик, Что я скачал сработал некоректно (под 97-м Экселем). Снес я 97-й Офис и выставил 2003. Там все ОК! И кнопка на первом листе документа отлично работает. Заодно сегодня и на работе в офисе выставил на всех компьютерах Офис 2003. Для полной совместимости, так сказать.

Про оператор IS я писал вообще. Что он для меня новый. Ранее, в других проектах, никогда не использовал...

vkodorникакого выделения нет, сразу сортировка
давно заметил что в аргументах лучше указывать имя листа (ну чтоб можно было сортировать при не активном листе)
я бы предложил еще использовать конструкцию With - End With

Под 97-м этот способ не сработал. Да и не очень он мне подошел, т.к. попросили добавить ещё один столбец в создаваемые документы, "№ п.п". Там нумерация строк идет последовательно с заполнением ячеек в строке. Если потом сортировать без выделения, то нумерация пострадает. Или пришлось бы нумеровать отдельным циклом после сортировки...

Конструкцию With - End With обещаю освоить и применять. :)
vkodorУ меня были проблемы, если я не обнулял обьектные переменные.
Правда в других ситуациях. Вообщем мной этот вопрос доконца не изучен. Лучше если ответит на этот вопрос более знающий человек.
А я стараюсь всегда закрывать и обнулять
Вы правы.

Спасибо всем принявшим участие в обсуждении за реальную помощь в создании программы. Она работает, взята на вооружение. Сегодня целый день проводили её испытания, мелкие ошибки устранил. Хотя и говорят - "Работает, не трогай!" Но хочу довести её до ума. Так что вопросы у меня ещё будут.
Ещё раз огромное спасибо всем!!!
...
Рейтинг: 0 / 0
20.02.2007, 19:22:23
    #34345135
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор заказов - устранение ошибок.
Alex37...Хотя и говорят - "Работает, не трогай!" Но хочу довести её до ума....правильно :-), трогай, трогай! чтоб программа работала не потому, что её не трогают, а вопреки тому, что её трогают. И правильно, что вопросы задаешь!
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Генератор заказов - устранение ошибок. / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]