Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Помогите!!! Добавлено: 20.05.07 15:25  

Автор вопроса:  lexa
Помогите, пожалуйста, кто-нибудь разобраться с макросом. Макрос должен копировать два столбца начинающихся со слов "наименование" и "кол-во" из исходной книги со всех листов в созданую книгу на один лист. Один раз цикл проходит, но потом выскакивает ошибка "run_time error '1004' метод select из класса range завершен не верно". На всех листах исходной книги есть столбцы начинающиеся со слов "наименование" и "кол-во".
Заранее спасибо.



Dim field As Range, naimen As Range, _
kol As Range, asheet As Object, colend As Range
Set oldbook = ActiveWorkbook
Set newbook = Workbooks.Add
Set colend = newbook.ActiveSheet.Range("A1")
oldbook.Activate
For Each asheet In oldbook.Sheets
Set field = asheet.Cells
Set naimen = field.Find(What:="наим", _
After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False)
'ищем ячейку со словом "наименование"
naimen.Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'копируем столбец который начинается
'со слова "наименование"
newbook.Activate
colend.Select
ActiveSheet.Paste
oldbook.Activate
Set kol = field.Find(What:="кол", _
After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False)
'ищем ячейку со словом количество
kol.Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'копируем слолбец, который начинается
'со слова "количество"
newbook.Activate
colend.Offset(0, 1).Select
ActiveSheet.Paste
Selection.End(xlDown).Select
Set cend = ActiveCell.Offset(2, -1)
Next asheet
End Sub

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #1 Добавлено: 21.05.07 10:39
Попробуйте добавить строку

asheet.Activate


После строки

For Each asheet In oldbook.Sheets


Это происходит потому, что пытаетесь выделить объект (ячейки) методом Select на страницах,которые у вас не выбраны (не отображены)
Тут два варианта:
1) Отказаться от Select - но надо переписывать немного макрос
2) Отображать каждую страницу (asheet.Activate) перед тем, как будете выделять ячейки на ней

Ответить

Номер ответа: 2
Автор ответа:
 lexa



Вопросов: 1
Ответов: 4
 Профиль | | #2 Добавлено: 23.05.07 23:19
Все работает. Спасибо огромное.
Каким образом можно заменить метод select?

Ответить

Номер ответа: 3
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #3 Добавлено: 24.05.07 00:26
Учить язык VBA и знать объектную модель Excel (вот модель по нисходящей (от самого верхнего уровня вниз)

Application
 Workbook
  Worksheet
   Range
    Cell
Надеюсь ничего не пропустил ))

Как пример - сравните эти два кода. Делают эти два макроса одно и тоже - копируют одну ячейу с Лист1 на Лист2, но они сильно отличаются количеством строк кода и временем работы (для большого макроса)

Sub Макрос1()
    Sheets("Лист1";).Select 'открываем Лист1
    Range("A3";).Select 'устанавливаем курсор на нужную ячейку
    Selection.Copy 'копируем эту ячейку
    Sheets("Лист2";).Select 'открываем Лист2
    Range(";D5";).Select 'устанавливаем курсор на нужную ячейку
    ActiveSheet.Paste 'вставляем данные
End Sub


Sub Макрос2()
    'тут не важно какая страница у вас отображена в данный момент
    Sheets("Лист1";).Range("A3";).Copy Destination:=Sheets("Лист2";).Range(";D5";)
End Sub

Ответить

Номер ответа: 4
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #4 Добавлено: 24.05.07 00:28
Поэтому методы Select и Activate лучше не использовать (или использовать как можно меньше)

Ответить

Номер ответа: 5
Автор ответа:
 lexa



Вопросов: 1
Ответов: 4
 Профиль | | #5 Добавлено: 02.06.07 12:11
Большое спасибо, Pavel.
Переписал макрос без использования метода select. Вроде более рационально получилось.
У меня еще вопрос. Как можно реализовать выбор пользователем из исходной книги листов, с которых нужно скопировать информацию и вставить в новую книгу на один лист? Количество листов в исходной книге может быть разным.

Ответить

Номер ответа: 6
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #6 Добавлено: 04.06.07 13:30
Можно сделать форму, а на форму поместить ListBox1 и Кнопку

добавь этот код в форму

Private Sub UserForm_Initialize()
    Dim iSheet As Object
    For Each iSheet In Sheets
        ListBox1.AddItem iSheet.Name
    Next
    ListBox1.Selected(ActiveSheet.Index - 1) = True
End Sub

Private Sub CommandButton1_Click()
    Me.Hide
    Dim iSheetName$
    iSheetName$ = Me.ListBox1.Value
    MsgBox "Пользователь выбрал лист: " & iSheetName$
End Sub

Ответить

Номер ответа: 7
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #7 Добавлено: 04.06.07 13:31
При инициализации формы (отображении) список ListBox1 будет заполняться названиями листов текущей книги. Пользователь сможет мышкой выбрать нужный лист и потом нажмёт Кнопку.

Ответить

Номер ответа: 8
Автор ответа:
 lexa



Вопросов: 1
Ответов: 4
 Профиль | | #8 Добавлено: 04.06.07 23:00
Из списка можно выбрать только одно значение. Это не совсем удобно когда большое количество листов. Можно каким либо образом сделать checkbox на название каждого листа?

Ответить

Номер ответа: 9
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #9 Добавлено: 05.06.07 14:09
CheckBox, наверное, конечно можно сделать, только вы не знаете сколько листов у вас будет в файле, поэтому не знаете сколько создавать CheckBox'ов - 3, 5, 10, 20. Поэтому лучше, мне кажется, использовать ListBox, там просто будет списик из 3, 5, 10, 20 листов - не важно сколько их
Чтобы можно было выбирать несколько листов, а не один просто необходимо либо вручную, либо программно изменить свойство MultiSelect объкта ListBox, таким образом разрешить множественный выбор из списка.

Посмотрите этот пример

Option Explicit
Private Sub UserForm_Initialize()
    Dim iSheet As Object
    Me.ListBox1.MultiSelect = fmMultiSelectExtended
    For Each iSheet In Sheets
        ListBox1.AddItem iSheet.Name
    Next
    ListBox1.Selected(ActiveSheet.Index - 1) = True
End Sub

Private Sub CommandButton1_Click()
    Me.Hide
    Dim i&
    Dim iArr()
    Dim iSheetName$
    ReDim iArr(0 To Me.ListBox1.ListCount - 1)
    For i = 0 To UBound(iArr)
        If Me.ListBox1.Selected(i) = True Then
            iSheetName$ = iSheetName$ & Me.ListBox1.List(i) & Chr(10)
        End If
    Next
    MsgBox "Пользователь выбрал листы: " & Chr(10) & iSheetName$
End Sub

Ответить

Номер ответа: 10
Автор ответа:
 lexa



Вопросов: 1
Ответов: 4
 Профиль | | #10 Добавлено: 06.06.07 08:52
Создать checkbox без помощи конструктора можно?

Ответить

Номер ответа: 11
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #11 Добавлено: 06.06.07 12:39
Я в макросах плохо разбираюсь. Посмотрите пример, эта процедура создаёт Форму и на ней создаёт 20 TextBox'ов и 30 ComboBox'ов.

Взял с какого-то сайта, сейчас не помню с какого именно.

'Программно создаём 30 TextBox и 30 ComboBox
Private Sub CreateUserForm_Controls()
'************************************************************************'
' MS Excel 97, MS Excel 2000, MS Excel XP (+ доступ к VBProject)
'************************************************************************'
Dim iCount%
With ThisWorkbook.VBProject.VBComponents.Add(3)
     .Properties(42) = 450
     .Properties(43) = 200
     For iCount% = 0 To 59
         Select Case iCount%
            Case 0 To 29
                With .Designer.Controls.Add(bstrProgID:="Forms.TextBox.1";)
                     .Top = .Height * (iCount% Mod 10)
                     .Left = .Width * (iCount% \ 10)
                End With
            Case 30 To 59
                With .Designer.Controls.Add(bstrProgID:="Forms.ComboBox.1";)
                     .Top = .Height * (iCount% Mod 10)
                     .Left = .Width * (iCount% \ 10)
                End With
         End Select
    Next
    UserForms.Add(.Name).Show
End With
End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам