Страница: 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
Ответить
|
Номер ответа: 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(" 5" . Select 'устанавливаем курсор на нужную ячейку
ActiveSheet.Paste 'вставляем данные
End Sub
Sub Макрос2()
'тут не важно какая страница у вас отображена в данный момент
Sheets("Лист1" .Range("A3" .Copy Destination:=Sheets("Лист2" .Range(" 5"
End Sub
Ответить
|
Номер ответа: 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
Ответить
|
Номер ответа: 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 |
Поиск по форуму