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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 10.09.2007, 09:38   #1
Роня
Пользователь
 
Регистрация: 07.09.2007
Сообщений: 17
По умолчанию использование в макросе другой книги

Я не понимаю.... Помогите, пожалуйста!
У меня Excel 2003
Написала простейшую программу(для проверки, что удалось ли обратиться к нужному файлу)

Dim f As String, f1 As String, shtname As String
f = ThisWorkbook.Name
f1 = "C:\ФФФ.xls"


Workbooks(f).Worksheets("Лист1").Ra nge("M4").Value = Workbooks(f).Name ' это работает
Workbooks(f).Worksheets("Лист1").Ra nge("M4").Value = Workbooks(f1).Name ' а это нет
Пишет, что Workbooks(f1).Name = <Subscript out of range>

Что делать???
Роня вне форума
Старый 10.09.2007, 19:09   #2
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Код:
iFullName$ = "C:\ФФФ.xls"
iFileName$ = Dir(iFileName$)
'Предположим, что скрытые и т.д. файлы нас не интересуют
 
If iFileName$ <> "" Then
   ThisWorkbook.Worksheets(1).Range("M4").Value = _
   Workbooks(iFileName$).Worksheets(1).Range("M4").Value
   'В данном примере предполагается, что :
   '- рабочая книга открыта. если это не так --
   'возникнет ошибка, для предотвращения которой, можно
   'просто проверить не открыта ли нужная рабочая книга.
   '- текущая и указанная рабочая книга содержат, как минимум, по одному рабочему листу.
   '- ячейка [M4] и первый рабочий лист (в текущей книге) не защищены.
Else
   MsgBox "Указанная книга изволит отсутствовать", , ""
End If
pashulka вне форума
Старый 11.09.2007, 10:30   #3
Роня
Пользователь
 
Регистрация: 07.09.2007
Сообщений: 17
По умолчанию Спасибо огромнейшее!

Спасибо огромнейшее, Pashulka!
Все работает (после того, как вписала iFileName$ = Dir(iFileName$))
У меня возникли еще вопросы...
А можно ли обращаться в текущей книге к закрытой рабочей книге? (вообще-то, передо мной стоит именно такая задача)
И еще вот:

For Each cell In ThisWorkbook.Worksheets(1).Range("d ata")
cell.Value = Workbooks(iFileName$).Worksheets1). Range(cell).Value
Next cell

Насколько это выражение дико, потому что оно не работает.
Имя "data" я присвоила области данных листа 1.
Роня вне форума
Старый 11.09.2007, 11:45   #4
Роня
Пользователь
 
Регистрация: 07.09.2007
Сообщений: 17
По умолчанию

По поводу второго вопроса:
celladdress = ThisWorkbook.Worksheets(1).Range("d ata").Address
ThisWorkbook.Worksheets(1).Range("d ata").Value = Workbooks(iFileName$).Worksheets(1) .Range(celladdress).Value
Это работает!

Но вопрос по поводу работы с закрытой книгой остается.
Ответьте, пожалуйста.
Роня вне форума
Старый 11.09.2007, 12:58   #5
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Если рабочая книга с именем iFileName открыта, а "data" это или именованный диапазон см.яч. или формула, которая возвращает ссылку на диапазон смежных ячеек, то количество обращений можно немного сократить, например

Код:
With ThisWorkbook.Worksheets(1).Range("data")
      .Value = Workbooks(iFileName$).Worksheets(1).Range(.Address).Value
End With
Что касается обращения к закрытой книге, то Workbooks представляет собой семейство открытых книг в данном приложении, поэтому, если Вы хотите обратиться к нужной(закрытой) книге, используя Workbooks, то её необходимо продварительно открыть :Workbooks.Open FileName:=iFullName

Код:
iFullName$ = "C:\ФФФ.xls"
 
If Dir(iFullName$, vbReadOnly + vbArchive + vbHidden) <> "" Then
   'Предположим, что скрытые и т.п. файлы нас всё-таки интересуют
   'ибо мы не будем вносить изменения и пытаться сохранить файл
   'имеющий, например, атрибут только для чтения
   With Application
        .ScreenUpdating = False
        '...
        'и т.д. по необходимости
        With .Workbooks.Open(FileName:=iFullName$, UpdateLinks:=0) '+ Password:=""
             'Здесь идёт обработка данных этой рабочей книги
             .Close saveChanges:=False
        End With
        '...
        .ScreenUpdating = True
   End With
Else
   MsgBox "Указанная книга изволит отсутствовать", , ""
End If
Если же открытие/закрытие рабочей книги нежелательно, то есть несколько способов получения нужных данных (без использования метода Open) и наиболее простой, это использование внешних ссылок с последующей заменой этих формул на значения, которые они возвращают.

Предположим, что файл "C:\ФФФ.xls" существует, содержит лист с именем "Рейтинг 2007", а диапазон "A1:A10" содержит некие данные

Код:
With ThisWorkbook.Worksheets(1).Range("B10:B19")
     .Formula = "='C:\[ФФФ.xls]Продажи 2007'!A1"
     'При необходимости формулу можно разбить на составляющие
     'имя рабочей книги, листа, адрес диапазона
     .Value = .Value
End With
pashulka вне форума
Старый 11.09.2007, 14:08   #6
Роня
Пользователь
 
Регистрация: 07.09.2007
Сообщений: 17
По умолчанию

Pashulka, от всей души благодарю Вас за помощь.
Буду реализовывать 3-й вариант.
Если что, ждите еще вопросов...
Роня вне форума
Старый 11.09.2007, 15:51   #7
Роня
Пользователь
 
Регистрация: 07.09.2007
Сообщений: 17
По умолчанию

Ох, Pashulka, не совсем все просто у меня...
Сначала я вставляю в ячейку path1 путь к рабочему файлу (iFullName$)

Dim Isect As Range
Set Isect = Application.Intersect(Range("path1" ), ActiveCell)
If Isect Is Nothing Then
'MsgBox "Ranges do not intersect"
Else
ActiveCell.Value = Application.GetOpenFilename("Excel Files (*.xls),*.xls")
Cancel = True
End If

Потом:
iFullName$ = Range("path1").Value

И, наконец, мне надо использовать этот путь при реализации обращения к рабочему файлу, не открывая его:

Цитата:
With ThisWorkbook.Worksheets(1).Range("B 10:B19")
.Formula = "='C:\[ФФФ.xls]Продажи 2007'!A1"
'При необходимости формулу можно разбить на составляющие
'имя рабочей книги, листа, адрес диапазона
.Value = .Value
End With


Реально ли это?
Роня вне форума
Старый 11.09.2007, 16:02   #8
Роня
Пользователь
 
Регистрация: 07.09.2007
Сообщений: 17
По умолчанию

Просто в Delphi, насколько я помню, можно было сделать что-то типа:
With ThisWorkbook.Worksheets(1).Range("B 10:B19")
.Formula = "='",iFullName$,"Продажи 2007'!A1"
Роня вне форума
Старый 11.09.2007, 16:47   #9
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Предположим, что Вы используете следующее событие рабочего листа ...
Код:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
    If Intersect(Me.Range("Path1"), Target) Is Nothing Then
       MsgBox "Ranges do not intersect", vbCritical, ""
    Else
       Cancel = True
       'Возможно мы можем обойтись без изменения значения
       'именованной ячейки, а возможно и без самой ячейки,
       'впрочем, это сугубо добровольное и личное дело
       iFullName = Application.GetOpenFilename( _
       FileFilter:="Excel Files (*.xls),*.xls", Title:="Выберите нужный файл")
       If iFullName <> False Then
          iFileName = Dir(iFullName, vbReadOnly + vbHidden + vbArchive)
          iFullName = Application.Substitute(iFullName, iFileName, "[" & iFileName & "]")
          'iFullName = Replace(iFullName, iFileName, "[" & iFileName & "]") 'XL2000
          iSheetName = "Продажи 2007"
          'Лист должен существовать, иначе Excel выведет
          'стандартное диалоговое окно Выбор листа
          With Me.Range("B10:B19")
               'Указанный диапазон + рабочий лист не должен быть защищён
 
               'Если Вы используете событие листа, книги Worksheet_Change()
               'то перед изменением значений имеет смысл блокировать
               'выполнение этого события, т.е.
               'Application.EnableEvents = False
 
               .Formula = "='" & iFullName & iSheetName & "'!A1"
               .Value = .Value
 
               'Application.EnableEvents = True
               'а затем обязательно вернуть всё на круги своя
          End With
       End If
    End If
End Sub

Последний раз редактировалось pashulka; 11.09.2007 в 16:51.
pashulka вне форума
Старый 11.09.2007, 16:58   #10
Роня
Пользователь
 
Регистрация: 07.09.2007
Сообщений: 17
По умолчанию

Гениально!!!
Паша,спасибо!!!
Роня вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
использование компонента TreeWiev другой формы White Общие вопросы Delphi 2 29.08.2008 10:25
Использование компонентов в другой форме White БД в Delphi 3 27.08.2008 13:32
Импорт данных из другой книги AntonFox Microsoft Office Excel 8 18.08.2008 17:17
Как запустить макрос при изменении другой книги Excel? Град Microsoft Office Excel 12 10.06.2008 10:01