Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2010, 13:58   #1
irbis_triffle
 
Регистрация: 27.05.2010
Сообщений: 3
Печаль проблема копирования данных между Книгами Excel

Здравствуйте, многоуважаемые Гуру!
Писал макрос в екселе, возникла следующая проблема:

Суть макроса: открыть документ на выбор пользователя, взять значение ячейки, найти в исходном документе. Если есть, взять значение следующей ячейки; если нет - скопировать в первую свободную строку исходного документа 3 ячейки из открытого документа. и так далее, пока в открытом документе не появится пустая строка (ячейка).

Макрос написал (естественнно криво, ибо только учусь), и он работает, НО когда обработка доходит до 30-го элемента получаю ошибку:
Код:
Run-time error '91': Object variable or With block variable not set.
Понять в чем ошибка я, к сожалению, не в силах. В всязи с чем прошу Вашей помощи.
Вот сам код макроса:
Код:
Sub open()
'
'макрос open
'
' считываем адресс свободной ячейки из файла и создаем переменную clearRange с этим адресом
clearRangeAddr = Cells(2, 1) ' - тут находится адресс свободной строки 
Dim clearRange As Range	     ' - это адресс свободной ячейки в исходном документе
Set clearRange = Range("A5")

Dim wdApp As Object
Dim wdDoc As Object

' ---выбираем файл с данными 
BoookBook = ActiveWorkbook.Name 'переменная с именем

fileToOpen = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx")
Set wdApp = CreateObject("Excel.Application")
Set wdDoc = wdApp.Workbooks.Open(Filename:=fileToOpen)

' начинаем перебор ячеек, выбираем первую:
Dim startRange As Range		' - это адресс текущей ячейки открытого документа 
Set startRange = Range("A2") ' A2 - первая интересующая ячейка

wdApp.Range("A2").Activate
newID = wdApp.ActiveCell
newIDAddr = wdApp.ActiveCell.Address

' начинаем цикл перебора:

Do Until newID = ""
'If newID <> "" Then
'Windows(odinCBook).Activate
wdApp.Range(newIDAddr).Activate
newID = wdApp.ActiveCell

' переходим на Boook и ищем такой ID:

Range(clearRangeAddr).Select
     Cells.Find(What:=newID, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
     False, SearchFormat:=False).Activate

' нашли ячейку с таким ID, проверяем не пустая ли она:
dataCell = ActiveCell
If dataCell = "" Then

' если ячейка пустая возвращаемся в файл выгрузки и копируем 3 ячейки с данными - так я проверил результат поиска :(

wdApp.Range(newIDAddr).Activate
wdApp.Selection.Copy
clearRange.Select
ActiveSheet.Paste
Application.CutCopyMode = False
' сдвигаем ячейки вправо

Set startRange = startRange.Offset(0, 1)
newIDAddr = startRange.Address
Set clearRange = clearRange.Offset(0, 1)

' копируем вторую ячейку
wdApp.Range(newIDAddr).Activate
wdApp.Selection.Copy
'ActiveSheet.Paste
clearRange.Select
ActiveSheet.Paste
Application.CutCopyMode = False
' сдвигаем ячейки вправо
Set startRange = startRange.Offset(0, 1)
Set clearRange = clearRange.Offset(0, 1)
newIDAddr = startRange.Address

' копируем третью ячейку
wdApp.Range(newIDAddr).Activate
wdApp.Selection.Copy
'ActiveSheet.Paste
clearRange.Select
ActiveSheet.Paste
Application.CutCopyMode = False
' сдвигаем ячейки обратно на столбец 1 но на 1 вниз
Set startRange = startRange.Offset(1, -2)
Set clearRange = clearRange.Offset(1, -2)
newIDAddr = startRange.Address
' новые данные внесены в Boook

' если ячейка полная, значит такая позиция уже есть - сдвигаем вниз
Else
' MsgBox ("Данная позиция уже загружена")
Set startRange = startRange.Offset(1, 0)
End If

' если следующая строка в файле импорта пустая, то новых данных больше нет

Loop
MsgBox ("Готово!")

wdDoc.Close
wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing

End Sub
Заранее спасибо!

P.S. если подскажете как правильно проверять результат поиска тоже буду весьма благодарен

Последний раз редактировалось irbis_triffle; 27.05.2010 в 14:00.
irbis_triffle вне форума Ответить с цитированием
Старый 27.05.2010, 14:28   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
когда обработка доходит до 30-го элемента получаю ошибку
Без файлов выловить ошибку непросто...

Когда выскакивает ошибка, и вы нажимаете кнопку Debug в сообщении об ошибке, какая строка кода подсвечивается желтым?

Скорее всего, ошибка в этой строке:
Код:
Cells.Find(What:=newID, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
     False, SearchFormat:=False).Activate
Метод .Activate завершится успешно только в том случае, если newID найден.
Если же ячейка не найдена, метод .Activate выдаст ошибку - посколько невозможно активировать несуществующую ячейку.
Надо делать проверку - найдена ячейка, или нет, и лишь потом производить дальнейшие действия.

Из какого приложения запускается макрос? Из Excel или Word?
Если всё происходит исключительно в Excel, то половину кода можно убрать - зачем создавать ещё один экземпляр приложения Excel, если у вас уже открыт Excel...

Мало что понял из вашего макроса, но я бы написал код примерно так:

Код:
Sub Макрос()
    Dim FirstBookSheet As Worksheet
    Set FirstBookSheet = ActiveSheet    ' запоминаем активный лист

    fileToOpen = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx")
    Dim wb As Workbook: Set wb = Workbooks.Open(fileToOpen)
    Dim sh As Worksheet: Set sh = ActiveSheet

    ' начинаем перебор ячеек, выбираем первую:
    Dim startRange As Range     ' - это адресс текущей ячейки открытого документа
    Set startRange = Range("A2")    ' A2 - первая интересующая ячейка

    Dim cell As Range, ra As Range: Application.ScreenUpdating = False
    Dim dataCell As Range

    Set ra = sh.Range(sh.[A2], sh.Range("A" & sh.Rows.Count).End(xlUp))
    For Each cell In ra.Cells    ' перебираем все заполненные ячейки, начиная с А2
        Set dataCell = Nothing
        Set dataCell = FirstBookSheet.Range("a2:a1000").Find(cell)
        If dataCell Is Nothing Then  ' не нашли
            ' код
        Else    ' нашли
            ' код
        End If

    Next cell
    MsgBox ("Готово!")
End Sub

Последний раз редактировалось EducatedFool; 27.05.2010 в 14:43.
EducatedFool вне форума Ответить с цитированием
Старый 27.05.2010, 14:30   #3
irbis_triffle
 
Регистрация: 27.05.2010
Сообщений: 3
По умолчанию

подсвечиваются 3 строки:
Код:
Cells.Find(What:=newID, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
,
стрелка стоит напротив последней из трех
irbis_triffle вне форума Ответить с цитированием
Старый 27.05.2010, 14:38   #4
irbis_triffle
 
Регистрация: 27.05.2010
Сообщений: 3
По умолчанию

Прикрепил файлы - исходник - файл в котором работает макрос, new_data - файл с новыми данными

Единственное что отличает ячейку, на которой возникает ошибка, от остальных - её значение 7107 (а все предыдущие 4***), сильно большая величина? переменная не понимает больше 4700??


АА!!!! проверил свою теорию - изменил в новом файле значения ячеек сравнения с 7*** на 4*** - макрос отработал еще эти значения и опять уперся в ошибку при попытке поиска значения 7*** Почему переменная не понимает значений свыше 5000??
Вложения
Тип файла: rar Desktop.rar (16.3 Кб, 18 просмотров)

Последний раз редактировалось irbis_triffle; 27.05.2010 в 14:55.
irbis_triffle вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с автоматическим преобразованием типа данных в Excel kovalevskivf Microsoft Office Excel 0 20.05.2010 01:25
Проблема при работе с несколькими книгами JJill Microsoft Office Excel 0 25.03.2010 18:40
Обновление связей между 2-мя и более книгами Quatro_Drive Microsoft Office Excel 5 30.12.2009 07:55
Переключение между книгами stas77 Microsoft Office Excel 5 03.11.2009 19:00
Обмен данных между Excel и Word WilliJo Microsoft Office Word 3 26.05.2009 00:19