Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
FUrystorm
0 / 0 / 0
Регистрация: 11.03.2011
Сообщений: 19
1

Range.Find - ошибка при открытии книги Excel

10.05.2011, 10:36. Просмотров 1949. Ответов 5
Метки нет (Все метки)

Ошибка в самом конце кода. использую функцию .find для нахождения ячеек по их значению.
Поиск всегда идет в 2 листах эксель из 2 книг.
  • По сути это один и тот же документ, только версии от разных дат. цель программы - сравнить изменения.
  • Поиск всегда идет одновременно по 2 книгам.
  1. Когда поиск идет вида A5:A25 все в полном порядке.
    Visual Basic
    1
    2
    
    Set ItogoRowNEW_search = objExcelNew.Worksheets(NEW_Sheet).Range("a9:a15000").Find("Общий итог")
    Set ItogoRowOLD_search = objExcelOld.Worksheets(OLD_Sheet).Range("a9:a15000").Find("Общий итог")
  2. Но когда я пытаюсь использовать адресацию вида R1C1 начинаются проблемы.
    • с этой строкой все ОК (objExcelNew это 1я книга, которая открывается) [строка 45 в коде снизу]
      Visual Basic
      1
      
      Set Initial_StroikaRow_NEW_search = Range(objExcelNew.Worksheets(NEW_Sheet).Cells(8, 1), objExcelNew.Worksheets(NEW_Sheet).Cells(ItogoRowNEW, 1)).Find("* итог")
    • А ТУТ ОШИБКА: (во вложении скрин) [строка 51 в коде снизу]
      Visual Basic
      1
      
      Set Initial_StroikaRow_OLD_search = Range(objExcelOld.Worksheets(OLD_Sheet).Cells(8, 1), objExcelOld.Worksheets(OLD_Sheet).Cells(ItogoRowOLD, 1)).Find("* итог")
      Т.е. почему-то в 1м объекте excel все в порядке, а во 2м поиск не проходит.

      ОДНАКО! Если использовать изврат, то ошибки нету.
      Visual Basic
      1
      2
      
      turbo_string = "A8:A" + CStr(ItogoRowOLD)
      Set Initial_StroikaRow_OLD_search = Range(turbo_string).Find("* итог")

Собственно кусок кода:
Visual Basic
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
Private Sub SravnitButtonVPuti()
 
Dim objExcelNew As New Excel.Application
Dim objExcelOld As New Excel.Application
 
'открываем файлы
objExcelNew.Workbooks.Open TextNew.Text, ReadOnly:=True
objExcelNew.Visible = True
 
objExcelOld.Workbooks.Open TextOld.Text, ReadOnly:=True
objExcelOld.Visible = True
 
 
'Задаем переменные для имен листов
NEW_Sheet = ComboNew.Text
OLD_Sheet = ComboOld.Text
 
'Активируем сравниваемые листы
objExcelOld.Worksheets(OLD_Sheet).Activate
objExcelNew.Worksheets(NEW_Sheet).Activate
 
ТУТ ВСЕ ОК - ПОИСК ИДЕТ ЧЕРЕЗ БУКВЕННЫЙ ДИАПАЗОН ВИДА  A5:A25
 
'=================================== Находим начальные данные для сравнения (общий итог, первый столбец с данными и т.д.) ============
'---Находим _ряд_ "Общий итог"
Set ItogoRowNEW_search = objExcelNew.Worksheets(NEW_Sheet).Range("a9:a15000").Find("Общий итог")
Set ItogoRowOLD_search = objExcelOld.Worksheets(OLD_Sheet).Range("a9:a15000").Find("Общий итог")
    'Задаем переменные для запоминания номера ряда ОБЩЕГО ИТОГА
    Dim ItogoRowNEW As Integer, ItogoRowOLD As Integer
    ItogoRowNEW = ItogoRowNEW_search.Row
    ItogoRowOLD = ItogoRowOLD_search.Row
'---
 
'---Находим _столбец_ "Общий итог" (тот что справа в конце документа)
Set ItogoColumnNEW_search = objExcelNew.Worksheets(NEW_Sheet).Range("a8:fff8").Find("Общий итог")
Set ItogoColumnOLD_search = objExcelOld.Worksheets(OLD_Sheet).Range("a8:fff8").Find("Общий итог")
    'Задаем переменные для запоминания номера столбца ОБЩЕГО ИТОГА (того что справа в конце документа)
    Dim ItogoColumnNEW As Integer, ItogoColumnOLD As Integer
    ItogoColumnNEW = ItogoColumnNEW_search.Column
    ItogoColumnOLD = ItogoColumnOLD_search.Column
'---
 
'---Находим начальную строку "№стройки Итог"
Set Initial_StroikaRow_NEW_search = Range(objExcelNew.Worksheets(NEW_Sheet).Cells(8, 1), objExcelNew.Worksheets(NEW_Sheet).Cells(ItogoRowNEW, 1)).Find("* итог")
 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
А ТУТ ОШИБКА: (во вложении скрин)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
Set Initial_StroikaRow_OLD_search = Range(objExcelOld.Worksheets(OLD_Sheet).Cells(8, 1), objExcelOld.Worksheets(OLD_Sheet).Cells(ItogoRowOLD, 1)).Find("* итог")
0
Миниатюры
Range.Find - ошибка при открытии книги Excel  
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2011, 10:36
Ответы с готовыми решениями:

Ошибка "runtime error 1004 method range of object global failed" при загрузке из excel в textbox
Выходит ошибка runtime error 1004 method range of object global failed при загрузки данных из файла...

Как при открытии Excel проверить нет ли уже открытых окон с Excel?
Посоветуйте пожалуйста, как при открытии Excel проверить нет ли уже открытых окон с Excel и если...

Алгоритм действия Range.Find - Нужно, чтобы поиск не возвращался к 1й ячейке
Всем привет. вопрос по сабжу. прилагаю скрин и образец excel где все наглядно показано. ...

Ошибка при присвоении значения Range к переменной
Пытаюсь создать массив в котором будут размещены все непустые строки из диапазона А2:102. Sub...

Как запретить запуск макросы при открытии файла EXCEL?
При выполнении application.workbooks.open book1.xls сразу запускается на выполнение макрос,...

5
Alex77755
10980 / 3438 / 591
Регистрация: 13.02.2009
Сообщений: 10,215
10.05.2011, 11:38 2
Попробуй такой вариант:
Visual Basic
1
Range("a9:a15000")=Range(Cells(9,1), Cells(15000,1))
0
FUrystorm
0 / 0 / 0
Регистрация: 11.03.2011
Сообщений: 19
10.05.2011, 11:56  [ТС] 3
поменял проблемную строку на
Visual Basic
1
Set Initial_StroikaRow_OLD_search = objExcelOld.Worksheets(OLD_Sheet).Range(Cells(8, 1), Cells(ItogoRowNEW, 1)).Find("* итог")
на всякий пожарный, ибо:

в этой теме Range.Find метод не работает при адресации ячеек r1c1 - error 1004
модератор "аналитика посоветовал использовать .cell каждый раз указывая к кому объекту .cell принадлежит.


в таком случае вылетает ошибка 1004
0
Миниатюры
Range.Find - ошибка при открытии книги Excel  
Alex77755
10980 / 3438 / 591
Регистрация: 13.02.2009
Сообщений: 10,215
10.05.2011, 12:20 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Там так же предлагался вариант:
Visual Basic
1
1   ActiveWorkbook.Worksheets(OLD_Sheet).Cells(8, 1).resize(10).Find("20*")
Добавлено через 14 минут
можно попробовать такой вариант
Visual Basic
1
.Range("a9:a" & ItogoRowNEW)
1
FUrystorm
0 / 0 / 0
Регистрация: 11.03.2011
Сообщений: 19
10.05.2011, 13:45  [ТС] 5
попробовал такую строку вместо проблемной:
Visual Basic
1
Set Initial_StroikaRow_OLD_search = objExcelOld.Worksheets(OLD_Sheet).Cells(8, 1).Resize(ItogoRowOLD).Find("* итог")
В этом месте все заработало, спасибо.

Встает другой вопрос - даже если использовать такой метод, то:
  1. как мне с помощью переменных, менять размер диапазона в ширину? с помощью .resize он изменяется только в высоту как я понял.

Все равно хочу понять, почему возникает ошибка в книге Old? ведь в New все проходит отлично
0
Alex77755
10980 / 3438 / 591
Регистрация: 13.02.2009
Сообщений: 10,215
10.05.2011, 13:51 6
Visual Basic
1
resize(10,10)
Добавлено через 2 минуты
Все равно хочу понять, почему возникает ошибка в книге Old? ведь в New все проходит отлично
По видимому всё дело в том, какая книга активна. ИМХО
0
10.05.2011, 13:51
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2011, 13:51

Ошибка при открытии проекта
Всем доброго времени суток. Работал на ноутбуке над проектом, сохранил его. Перекинул данный проект...

Ошибка при открытии дополнительной формы
Добрый день.Хочу научиться программировать.Пишу программу по учебнику там вылезает ошибка Run-time...

[EXCEL] RANGE.FIND метод не работает при адресации ячеек r1c1 - error 1004
Всем привет, собственно сабж. ВОт проблемный код (ошибка вылетает на строке 16 из-за того, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.