Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Ошибка в работе с листами / 25 сообщений из 26, страница 1 из 2
13.04.2012, 08:59
    #37751682
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Подскажите, где ошибка?
Все переменные объявлены.
Это отрывок из кода.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Dim newbook As Workbook 'объявляем переменную в качестве объекта книга
Set newbook = Workbooks.Add() 'этой переменной присваивается объект создаваемой книги
newbook.Activate ' активация созданной книги
newbook.Worksheets(3).Delete 'удаляем лишний лист
newbook.Worksheets(2).Delete 'удаляем еще один лишний лист
Workbooks.Open Filename:="C:\входящие\управляющие файлы\образец.xls" 'открываем книгу с образцом таблицы
Set tempBook = ActiveWorkbook 'присваиваем переменной темпбук открытую книгу
Range("A3:H31").Select 'выделяем диапазон ячеек с шапкой образца оформления таблицы
Selection.Copy 'копируем шапку таблицы
newbook.Activate 'активируем изначально обрабатываемую книгу
Range("A1").Select  'вставляем скопированную шапку с определенным форматированием
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
tempBook.Activate 'активируем книгу с образцом
ActiveWindow.Close 'закрываем книгу с образцом
For a = 1 To y 'здесь у - количество необходимых листов, полученный ранее
    newbook.Worksheets.Add after:=ActiveSheet 'вставка нового листа после активного (и до этого момента единстенного)
    ActiveWorkbook.ActiveSheet.Name = Left(names(y), 30) 'даем наименование листа из массива имен
    Set c = ActiveWorkbook.ActiveSheet ' присваем переменной созданный лист
        c.Range("A3:H19") = newbook.Worksheets(2).Range("A3:H19") 'копируем шапку таблицы из первого листа
    For b = 1 To x 'в этом цикле будет дополнена определенная работа внутри каждого создаваемого листа
        
    Next b
Next a



В цикле на строке ActiveWorkbook.... вылетает ошибка Run-time error '1004'
...
Рейтинг: 0 / 0
13.04.2012, 09:16
    #37751701
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
А почему вы решили, что ActiveWorkbook в этот момент - это newbook ?
В вашем тексте после .Close - нет активации вашей "новой книги", поэтому и с Active... - неопределённость.
Ну и ещё (как давно и надолго советовал Шокер) - отказывайтесь сразу от работы с ActiveXXXX, копированием через буфер, использованием Selection...
...
Рейтинг: 0 / 0
13.04.2012, 09:18
    #37751705
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
AndreTM,
подскажите как лучше скопировать диапазон из одной книги в другую?
...
Рейтинг: 0 / 0
13.04.2012, 09:30
    #37751724
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
дальнейшие манипуляции с кодом выявили ошибку в этой операции:
Код: vbnet
1.
Set sh.Range("A3:H19") = newbook.Worksheets(1).Range("A3:H19")


Что тут не верно?
...
Рейтинг: 0 / 0
13.04.2012, 09:33
    #37751729
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Может все из-за того что в копируемой шапке есть объединенные ячейки?
...
Рейтинг: 0 / 0
13.04.2012, 09:38
    #37751739
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Всё неверно... Ибо так низзя
Галямов Ильдарподскажите как лучше скопировать диапазон из одной книги в другую?Например:
Код: vbnet
1.
2.
3.
4.
5.
6.
set WB1 = ActiveWorkbook
Workbooks.Open (...) ' при этом открытая книга становится активной
Sheets(...).Range.Copy WB1.Sheets(1).Range("A1") ' см. описание команды
Workbooks.Close SaveChanges:=False ' активная - закрывается, и без запроса
WB1.Activate
set WB1 = Nothing ' для освобождения памяти

Есть еще варианты - например, можно попросту обратиться к диапазону другой книги, используя нотацию [Книга]Лист!Ячейки в формулах листа рабочей книги; или можно использовать ADODB (Query)...
...
Рейтинг: 0 / 0
13.04.2012, 09:38
    #37751740
ElenHim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Set sh.Range("A3:H19") = newbook.Worksheets(1).Range("A3:H19")
Выделил неверное.
Создайте пременную "as Range", и ей присваивайте

И еще, по поводу удаления лишних листов. У Application есть свойство sheetsinnewworkbook(или как-то так) - с ним работайте
...
Рейтинг: 0 / 0
13.04.2012, 09:47
    #37751759
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
ElenHimSet sh.Range("A3:H19") = newbook.Worksheets(1).Range("A3:H19")
Выделил неверное.
Создайте пременную "as Range", и ей присваивайтеНе пойдёт... У него sh - это типа в old book'е лист... И советы надо давать ТСу таким образом, чтобы он понял различие между объектной моделью и формулами...
...
Рейтинг: 0 / 0
13.04.2012, 09:53
    #37751771
ElenHim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
AndreTM,

Dim rng as Range
Set rng = newbook.Worksheets(1).Range("A3:H19")
Что вам не нравится?

А по поводу
AndreTMИ советы надо давать ТСу таким образом, -

ГорбатыйПоучи жену щи варить
...
Рейтинг: 0 / 0
13.04.2012, 09:58
    #37751783
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
AndreTM, спотыкаюсь именно в копировании диапазона в созданной книге с одного листа на создаваемый в цикле (( За.олбался уже на таком простом шаге (( Подскажите пож-та в чем подвох
Код: vbnet
1.
sh.Range("a3:H19") = rn 'копируем шапку таблицы из первого листа


где
Код: vbnet
1.
2.
Dim rn As Range
Set rn = tempBook.ActiveSheet.Range("A3:H19")
...
Рейтинг: 0 / 0
13.04.2012, 09:59
    #37751787
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Да, никаких селектов и активаций.
И вот так:
Workbooks.Open (...)
я тоже не делаю. Неудобно как-то, всё время отслеживать активную книгу...
Обычно
set wb=Workbooks.Open(...)
или
with Workbooks.Open(...)
...
Рейтинг: 0 / 0
13.04.2012, 10:18
    #37751823
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
ElenHimAndreTMИ советы надо давать ТСу таким образом,ГорбатыйПоучи жену щи варитьТо есть смайлика - не видим?? Да и совет был не вам, уважаемый, а сообществу, если вы не поняли...

Ну и ваш ответ тоже - я вот так понял, что sh - это лист в уже открытой книге, причем к ньюбуку отношения не имеющей... А вы всё о том же - "давайте назначим объект". Он там и не нужен, воообще-то, - смысл был в том, чтобы ТСу дать понять о .Copy .
И ещё - не надо мне опять упоминать о неправильном использовании кода - .Range. там, по привычке, был указан специально, чтобы новичок не тупо копировал код, а читал хелп...
...
Рейтинг: 0 / 0
13.04.2012, 10:21
    #37751828
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Галямов Ильдар , ну дайте уж (приложИте в архиве), из конца в конец, примеры ваших файликов...
...
Рейтинг: 0 / 0
13.04.2012, 10:40
    #37751870
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
AndreTM, отправляю:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
Public Sub OpenBook()

' открываем книгу, если книга не та, то возобновляется процедура открытия книги
Dim proverka As Boolean
proverka = True
zanovo: 'возвращаемся сюда, если выбрали не тот файл
proverka = True
Dim OpenBook As Workbook
Dim tempBook As Workbook
Dim tempsheet As Object

FileToOpen = Application.GetOpenFilename(Title:="Открыть файл", FileFilter:="Excel Files *.xls* (*.xls*),") 'диалог открытия книги
If FileToOpen = False Then
    MsgBox "Файл не выбран", vbExclamation, "Информация"
    Exit Sub
    Else
        Workbooks.Open Filename:=FileToOpen
        Set OpenBook = ActiveWorkbook
        OpenBook.Activate

End If

Dim asd As Worksheet
'заполняем массив данными
Dim material(1 To 10000, 1 To 300) As String
Dim edinica(1 To 10000, 1 To 300) As String
Dim norma(1 To 10000, 1 To 300) As Single
Dim price(1 To 10000, 1 To 300) As Currency
Dim names(1 To 300) As String
Dim x, y, z, a, b, c
x = 0
y = 0
Dim stroka, temp
Application.DisplayAlerts = False
For Each asd In OpenBook.Worksheets
    y = y + 1
    x = 0
    Do While Left(asd.Cells(9 + x, 5), 1) <> " "
        x = x + 1
        material(x, y) = asd.Cells(8 + x, 5)
        edinica(x, y) = asd.Cells(8 + x, 7)
        z = edinica(x, y)
        edinica(x, y) = Replace(z, ".", "")
        norma(x, y) = Val(asd.Cells(8 + x, 9))
        price(x, y) = Val(asd.Cells(8 + x, 11))
                            
    Loop
    names(y) = Mid(asd.Cells(2, 1), 53, 31)  ' название продукции
    
Next

Dim newbook As Workbook 'объявляем переменную в качестве объекта книга
Set newbook = Workbooks.Add() 'этой переменной присваивается объект создаваемой книги
newbook.Activate ' активация созданной книги
newbook.Worksheets(3).Delete 'удаляем лишний лист
newbook.Worksheets(2).Delete 'удаляем еще один лишний лист
Workbooks.Open Filename:="C:\входящие\управляющие файлы\образец.xls" 'открываем книгу с образцом таблицы
Set tempBook = ActiveWorkbook 'присваиваем переменной темпбук открытую книгу
newbook.Worksheets(1).Range("A2:H19") = tempBook.Worksheets(1).Range("A2:H19")
ActiveWindow.Close 'закрываем книгу с образцом
newbook.Activate 'активируем изначально обрабатываемую книгу
For a = 1 To y 'здесь у - количество необходимых листов, полученный ранее
    Set sh = newbook.Worksheets.Add(after:=ActiveSheet) 'вставка нового листа после активного (и до этого момента единстенного)
    If Len(names(a)) > 30 Then
    sh.Name = Left(names(a), 30) 'даем наименование листа из массива имен
    Else: sh.Name = names(a)
    End If
    sh.Range("a2:H19") = newbook.Worksheets(1).Range("A2:H19") 'копируем шапку таблицы из первого листа
    For b = 1 To x 'в этом цикле будет дополнена определенная работа внутри каждого создаваемого листа
        
    Next b
    newbook.Worksheets(a + 1).Activate
Next a

End Sub
...
Рейтинг: 0 / 0
13.04.2012, 10:41
    #37751873
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Проблема осталась только при копировании шапки таблицы
...
Рейтинг: 0 / 0
13.04.2012, 10:46
    #37751891
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Галямов Ильдар,

Глубоко не вникал.
Вместо удаления лишних листов - кстати, их может быть у кого как - делайте просто

Set newbook = Workbooks.Add(1)
или
Set newbook = Workbooks.Add(xlWBATWorksheet)
...
Рейтинг: 0 / 0
13.04.2012, 10:53
    #37751903
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Hugo121, благодарен, знал что такое есть - не стал искать, а просто пошел простым путем ))
...
Рейтинг: 0 / 0
13.04.2012, 11:23
    #37751992
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Вопрос решен
копирование диапазона из одной книги в другую решен с помощью
Код: vbnet
1.
2.
3.
tempBook.Worksheets(1).Range("A2:H21").Copy newbook.Worksheets(1).Range("A2:H21")
tempBook.Worksheets(1).Range("A2:H21").Copy
newbook.Worksheets(1).Range("A2:H21").PasteSpecial Paste:=xlPasteColumnWidths



Всем огромное спасибо за советы.
...
Рейтинг: 0 / 0
13.04.2012, 11:48
    #37752062
ElenHim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
AndreTM,

Смайлик я видел. Собственно потому и цитату я привёл, вобщемто, общеизвестную.
Вы предпочитаете смайлики, а я - цитаты. Такие дела


Пока доехал до работы, всё уже и порешили.
Всёж добавлю.Была на моей памяти пара приколов с Copy/Paste, поэтому сам я, где возможно, стараюсь употреблять присваивание.
...
Рейтинг: 0 / 0
13.04.2012, 11:50
    #37752066
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Ильдар , я тоже не стал глубоко вникать...
Но вижу сразу - на вашем месте, я бы не разбивал данные по листам книги, а собрал бы все данные в одну таблицу (с дополнительным полем-идентификатором-ключом). БЕЗ форматирования этого листа. Поверьте, не стОит смешивать хранение данных и их выдачу "визуально". Поскольку любую выборку не в пример легче и проще получить отдельно в любой момент времени. Причём - в нужном виде и в нужном формате, хоть на отдельном листе/в отдельной книге, хоть передав, скажем, в Word...
...
Рейтинг: 0 / 0
13.04.2012, 11:56
    #37752081
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
AndreTM,

у нас на предприятии нормы технолог готовит в DOS программе, а мои экономисты потом много-чего вручную делают, в частности калькуляции. Задача непосредственно стоит для отображения данных в виде отдельных калькуляций. Но в конечном итоге у меня в конце программы будет выдаваться итоговая таблица.
...
Рейтинг: 0 / 0
13.04.2012, 11:58
    #37752084
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
А еще вдобавок, небольшую проблему заметил = используя формат #####0.00 у меня норма 27 отражается как 270 000 (в досе изначально отражалась норма как 27.0000) Причем аналогичные цифры отображаются как положено по формату. Подскажите в чем здесь косяк? Как исправить?
...
Рейтинг: 0 / 0
13.04.2012, 12:03
    #37752100
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
Кстати, вспомнил...
Когда-то (не так и давно) мы делали это
Посмотрите, поразбирайте, поинтересуйтесь - как это функционирует.
Многие ваши вопросы отпадут просто с ходу...
...
Рейтинг: 0 / 0
13.04.2012, 12:16
    #37752140
Галямов Ильдар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
AndreTM,

спасибо, прочитал. Алгоритм решения я представляю вполне явно, просто трудности в переносе этого алгоритма на код vba
...
Рейтинг: 0 / 0
13.04.2012, 13:01
    #37752265
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в работе с листами
В решении по ссылке моё решение нужно чуть изменить - сливать два поля через разделитеь, а не прямо m & n.
Иначе не будет разницы между 1 23 и 12 3
Т.е. не
Код: vbnet
1.
s = x(i, 1) & x(i, 2)


а
Код: vbnet
1.
s = x(i, 1) & "|" & x(i, 2)
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Ошибка в работе с листами / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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