Страница: 1 | 2 |
Вопрос: Выборка, копирование в новый лист xls
Добавлено: 12.12.08 10:36
Автор вопроса: SoftBear | Web-сайт:
Здраствуйте, уважаемые.
Надеюсь на вашу помощь, к вечеру нужно сделать рабочее решение.
С чего гендир решил, что инженер по VoIP должен разбираться в VBA, я не знаю, но "партия сказала - надо".
Задача:
Есть 13 файлов xls, в каждом 1000 листов. Счета-фактуры.
Есть файл xls со списком номеров ГТД в колонке А (150 номеров).
Нужно искать каждый номер из списка в 13-ти файлах, и, в случае обнаружения, заносить некоторые данные (назв. модели, кол-во, номер сч.ф., номер гтд) в новый файл.
Я весь день вчера пытался сделать через Cells.Find - ни хрена не получилось. Плюнул, решил тупо через "for". Скорость не важна, главное чтобы сработало один раз.
Написал - не работает. Вот код:
----
Sub Main()
'
'
Dim str As Integer
Dim filenumber As Integer
Dim listnumber As Integer
Dim znach As String
Dim testing As String
Dim tstr As Integer
Dim nomersf As String
Dim model As String
Dim kolvo As Integer
Dim itogstr As Integer
Workbooks.Open Filename:="c:\Инфа\Номера ГТД.xls"
For filenumber = 1 To 13
Workbooks.Open Filename:="c:\Инфа\" & filenumber & ".xls"
For listnumber = 1 To 1000
Sheets("Лист" & listnumber).Select
For str = 3 To 150
Windows("Номера ГТД.xls").Activate
znach = Range("A" & str)
Windows(filenumber & ".xls").Activate
For tstr = 19 To 100
testing = Range("K" & tstr)
If znach = testing Then
nomersf = Range("A7")
model = Range("A" & tstr)
kolvo = Range("C" & tstr)
Windows("Итог.xls").Activate
Range("B" & itogstr).Select
ActiveCell.FormulaR1C1 = testing
Range("C" & itogstr).Select
ActiveCell.FormulaR1C1 = nomersf
Range("D" & itogstr).Select
ActiveCell.FormulaR1C1 = model
Range("E" & itogstr).Select
ActiveCell.FormulaR1C1 = kolvo
itogstr = itogstr + 1
Windows(filenumber & ".xls").Activate
Next tstr
Next str
Next listnumber
Workbooks.Close
Next filenumber
End Sub
----
Сейчас ругается на Next tstr без for.
Помогите, пожалуйста.
Ответы
Всего ответов: 20
Номер ответа: 1
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #1
Добавлено: 12.12.08 10:56
У меня, было дело, VBA Word 2003 ругалось на то что несоответствие типов данных. Код был примерно такой:
Sub TestProc ()
dim i as Integer
i=512
End Sub
Вроде всё нормально, но ругалось. Глюк наверное.
Исправил dim i as Integer на dim i as Long. Всё заработало!
Лучше всегда применять Long а не Integer.
Номер ответа: 2
Автор ответа:
SoftBear
ICQ: 206956288
Вопросов: 1
Ответов: 11
Web-сайт:
Профиль | | #2
Добавлено: 12.12.08 11:02
Спасибо, заменил, но на цикл (compile error: next without for) всё равно ругается.
М.б. в цикле нельзя листы переключать?
Номер ответа: 3
Автор ответа:
SoftBear
ICQ: 206956288
Вопросов: 1
Ответов: 11
Web-сайт:
Профиль | | #3
Добавлено: 12.12.08 11:18
переделал, вынес запись в "итог" в отдельную подпрограмму:
Sub Main()
'
'
Dim str As Long
Dim filenumber As Long
Dim listnumber As Long
Dim znach As String
Dim testing As String
Dim tstr As Long
Dim nomersf As String
Dim model As String
Dim kolvo As Long
Dim itogstr As Long
Workbooks.Open Filename:="c:\Èíôà\Íîìåðà ÃÒÄ.xls"
For filenumber = 1 To 13
Workbooks.Open Filename:="c:\Èíôà\" & filenumber & ".xls"
For listnumber = 1 To 1000
Sheets("Ëèñò" & listnumber).Select
For str = 3 To 150
Windows("Íîìåðà ÃÒÄ.xls".Activate
znach = Range("A" & str)
Windows(filenumber & ".xls".Activate
For tstr = 19 To 100
testing = Range("K" & tstr)
If znach = testing Then Call find
Next tstr
Next str
Next listnumber
Workbooks.Close
Next filenumber
End Sub
Sub find()
nomersf = Range("A7"
model = Range("A" & tstr)
kolvo = Range("C" & tstr)
Windows("Èòîã.xls".Activate
Range("B" & itogstr).Select
ActiveCell.FormulaR1C1 = testing
Range("C" & itogstr).Select
ActiveCell.FormulaR1C1 = nomersf
Range("" & itogstr).Select
ActiveCell.FormulaR1C1 = model
Range("E" & itogstr).Select
ActiveCell.FormulaR1C1 = kolvo
itogstr = itogstr + 1
Windows(filenumber & ".xls".Activate
End Sub
Теперь ругается на out of range в Sheets("Лист" & listnumber).Select
Номер ответа: 4
Автор ответа:
SoftBear
ICQ: 206956288
Вопросов: 1
Ответов: 11
Web-сайт:
Профиль | | #4
Добавлено: 12.12.08 11:19
Номер ответа: 5
Автор ответа:
SoftBear
ICQ: 206956288
Вопросов: 1
Ответов: 11
Web-сайт:
Профиль | | #5
Добавлено: 12.12.08 11:37
"Subscript out of range" даже если
For listnumber = 1 To 10
Sheets("Ëèñò" & listnumber).Select
Номер ответа: 6
Автор ответа:
SoftBear
ICQ: 206956288
Вопросов: 1
Ответов: 11
Web-сайт:
Профиль | | #6
Добавлено: 12.12.08 11:46
исправил Sheets.Select на Sheets.Activate
теперь ругается на model = Range("A" & tstr) - "method 'range' of object '_global' failed"
Номер ответа: 7
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #7
Добавлено: 12.12.08 11:56
Переменная tstr была объявлена в модуле Main. В find она неизвестная.
Объяви ее как
Номер ответа: 8
Автор ответа:
SoftBear
ICQ: 206956288
Вопросов: 1
Ответов: 11
Web-сайт:
Профиль | | #8
Добавлено: 12.12.08 12:00
ага, сделал, спасибо.
теперь ругается, что инвалид аттрибут ин саб о функшион.
как Sub Main() обозвать, чтоб паблик заработал? Module?
Номер ответа: 9
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #9
Добавлено: 12.12.08 12:01
А где ты открываешь файл "Итог.xls" ? Или он уже открыт ?
Номер ответа: 10
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #10
Добавлено: 12.12.08 12:03
Sub Main оставь как есть.
Public должен быть до Sub Main.
Номер ответа: 11
Автор ответа:
SoftBear
ICQ: 206956288
Вопросов: 1
Ответов: 11
Web-сайт:
Профиль | | #11
Добавлено: 12.12.08 12:04
открыт, в нём и пишу.
спасибо, сейчас попробую.
Номер ответа: 12
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #12
Добавлено: 12.12.08 12:06
В твоем первом варианте, ты забыл End If на блок:
Поэтому и ругался.
Номер ответа: 13
Автор ответа:
SoftBear
ICQ: 206956288
Вопросов: 1
Ответов: 11
Web-сайт:
Профиль | | #13
Добавлено: 12.12.08 12:16
Сейчас сделал вот так:
Ругается на End If - "end if without block if"
Убираю - ругается на Range("B" & itogstr).Select в find() - "method 'range' of object '_global' failed"
Номер ответа: 14
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #14
Добавлено: 12.12.08 12:20
If пишется или в одну строку без End If. Или если с End If, то через :. Или с End If, но блоком.
Номер ответа: 15
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #15
Добавлено: 12.12.08 12:26
К посту 13: После команды Windows("Èòîã.xls".Activate, ты только активируешь окно. Поставь еще выбор листа.