powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Ошибка в работе с листами
26 сообщений из 26, показаны все 2 страниц
Ошибка в работе с листами
    #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
Ошибка в работе с листами
    #37751701
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему вы решили, что ActiveWorkbook в этот момент - это newbook ?
В вашем тексте после .Close - нет активации вашей "новой книги", поэтому и с Active... - неопределённость.
Ну и ещё (как давно и надолго советовал Шокер) - отказывайтесь сразу от работы с ActiveXXXX, копированием через буфер, использованием Selection...
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #37751705
Фотография Галямов Ильдар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM,
подскажите как лучше скопировать диапазон из одной книги в другую?
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #37751724
Фотография Галямов Ильдар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дальнейшие манипуляции с кодом выявили ошибку в этой операции:
Код: vbnet
1.
Set sh.Range("A3:H19") = newbook.Worksheets(1).Range("A3:H19")


Что тут не верно?
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #37751729
Фотография Галямов Ильдар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может все из-за того что в копируемой шапке есть объединенные ячейки?
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #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
Ошибка в работе с листами
    #37751740
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set sh.Range("A3:H19") = newbook.Worksheets(1).Range("A3:H19")
Выделил неверное.
Создайте пременную "as Range", и ей присваивайте

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

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

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

ГорбатыйПоучи жену щи варить
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #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
Ошибка в работе с листами
    #37751787
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, никаких селектов и активаций.
И вот так:
Workbooks.Open (...)
я тоже не делаю. Неудобно как-то, всё время отслеживать активную книгу...
Обычно
set wb=Workbooks.Open(...)
или
with Workbooks.Open(...)
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #37751823
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElenHimAndreTMИ советы надо давать ТСу таким образом,ГорбатыйПоучи жену щи варитьТо есть смайлика - не видим?? Да и совет был не вам, уважаемый, а сообществу, если вы не поняли...

Ну и ваш ответ тоже - я вот так понял, что sh - это лист в уже открытой книге, причем к ньюбуку отношения не имеющей... А вы всё о том же - "давайте назначим объект". Он там и не нужен, воообще-то, - смысл был в том, чтобы ТСу дать понять о .Copy .
И ещё - не надо мне опять упоминать о неправильном использовании кода - .Range. там, по привычке, был указан специально, чтобы новичок не тупо копировал код, а читал хелп...
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #37751828
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Галямов Ильдар , ну дайте уж (приложИте в архиве), из конца в конец, примеры ваших файликов...
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #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
Ошибка в работе с листами
    #37751873
Фотография Галямов Ильдар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема осталась только при копировании шапки таблицы
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #37751891
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Галямов Ильдар,

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

Set newbook = Workbooks.Add(1)
или
Set newbook = Workbooks.Add(xlWBATWorksheet)
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #37751903
Фотография Галямов Ильдар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121, благодарен, знал что такое есть - не стал искать, а просто пошел простым путем ))
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #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
Ошибка в работе с листами
    #37752062
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM,

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


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

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

спасибо, прочитал. Алгоритм решения я представляю вполне явно, просто трудности в переносе этого алгоритма на код vba
...
Рейтинг: 0 / 0
Ошибка в работе с листами
    #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
Ошибка в работе с листами
    #37752288
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Галямов ИльдарАлгоритм решения я представляю вполне явно, просто трудности в переносе этого алгоритма на код vbaТогда - в личку (скайп или ася), чтобы не мусорить в топике...
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Ошибка в работе с листами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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