Excel: проблема при открытии и активации файлов

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
kto_tut
Сообщения: 6
Зарегистрирован: 13 май 2009, 19:32

Необходимо скопировать инфу из файла Один в файл fName (его указывает пользователь)

Dim fName As String
With Application
fName = .GetOpenFilename
If fName = "False" Then Exit Sub
End With
Workbooks.Open Filename:=fName ' открывает выбранный файл, все нормально работает

После этого перехожу в файл Один
Windows("Один.xls").Activate ' работает

Но при переходе в файл fName
Windows(fName).Activate ' не находит уже открытый файл, причем ошибка заключается в том, что переменной fName возвращает полный путь и имя файла, а при активации нужно только имя файла (без указания пути). Как активировать файл fName? (если заменить Windows на Workbook ниче не меняется)

Я понимаю, что коряво все тут излагаю, но оч прошу, пряма-таки слезно умоляю помочь!!!!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

КНИГА.Name - это имя файла без пути.

Но вы можете обойтись вообще без переключения между окнами.

Код: Выделить всё

  Workbooks("Книга3.xls").Sheets("Лист1").Range("A1:A10").Copy Workbooks("Книга2.xls").Sheets("Лист2").Range("A1")
vint
Сообщения: 37
Зарегистрирован: 19 мар 2009, 16:53

Код: Выделить всё

ошибка заключается в том, что переменной fName возвращает полный путь и имя файла
Это не ошибка так и должно быть
Попробуйте вот так

Код: Выделить всё

Dim fName As Variant
file = Application.GetOpenFilename
Workbooks.Open (file)
fName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) 'имя минус .XLS - 4 символа
ThisWorkbook.Activate            'активация рабочей книги
Workbooks(fName).Activate        'активация открытой книги
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Нет, просто .name. Этого достаточно.
Когда книга еще не сохранена, то это свойство возвращает имя без расшинения.
Если сохранена, то с расширением.
Но для обращения к элементы коллекции WorkBooks надо использовать точно такое имя, которое возвращается свойством Name.
Расширение откусывать не надо.
vint
Сообщения: 37
Зарегистрирован: 19 мар 2009, 16:53

Сначала так и сделал, но когда стал проверять в переменной указывалось расширение и соответственно ошибка при активации,поэтому и отрезал.
Странно!?
kto_tut
Сообщения: 6
Зарегистрирован: 13 май 2009, 19:32

Ай, спасибо, уважаемые! Без расширения заработало!!! )) Не могли бы Вы помочь чайнику еще одним ответом? ) а со вставкой-то что не так? )

Dim fName As Variant
file = Application.GetOpenFilename
Workbooks.Open (file)
fName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) 'имя минус .XLS - 4 символа

ThisWorkbook.Activate 'активация рабочей книги
Sheets("Лист1").Range("c20:c23").Copy
Workbooks(fName).Activate 'активация открытой книги
Sheets("1").Range("c20").Paste
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Было бы неплохо, если бы Вы еще указали, какое сообщение об ошибке возникает и на какой строчке.
(Возможно Вы бы тогда и сами поняли в чем проблема)
А так... Ну, наверное нет в книге листа с именем "1".
Если надо обратиться к первому попавшемуся рабочему листу, то можно использовать WrokSheets(1)

PS
А не хотите попробовать все сделать 1 строкой, как я советовал в посте №2.
И буфер обмена не используется, и окна не переключаются. Все гораздо быстрее работает в результате.
vint
Сообщения: 37
Зарегистрирован: 19 мар 2009, 16:53

Код: Выделить всё

Dim fName As Variant
file = Application.GetOpenFilename
Workbooks.Open (file)
fName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) 'имя минус .XLS - 4 символа
Application.ThisWorkbook.Worksheets("Лист1").Range("C20:C23").Copy _
ActiveWorkbook.Worksheets(1).Range("C20")
не надо активировать и скакать по листам
kto_tut
Сообщения: 6
Зарегистрирован: 13 май 2009, 19:32

Спасибо всем огромное! ) все работает! )
Ответить