Работа с Excel

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Работа с Excel

Сообщение ange » 28.09.2005 (Ср) 8:57

Добрый день.
Вопрос следующий
Моя программа должна открыть указанный пользователем файл и внести ряд изменений по определенному принципу

не могу найти как организовать такой механизм
программа должна выяснить, открыт ли у пользователя xls файл с именем fName, если да, то идентификатор этой книги присвоить переменной wo типа excel.workbooks (что-то типа set wo1= .... fname)

если же у пользователя файл не открыт, то открыть самомстоятельно
set wo1=workbooks.open(fName)

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Re: Работа с Excel

Сообщение lord0n » 28.09.2005 (Ср) 9:15

ange писал(а):Добрый день.
Вопрос следующий
Моя программа должна открыть указанный пользователем файл и внести ряд изменений по определенному принципу

не могу найти как организовать такой механизм
программа должна выяснить, открыт ли у пользователя xls файл с именем fName, если да, то идентификатор этой книги присвоить переменной wo типа excel.workbooks (что-то типа set wo1= .... fname)

если же у пользователя файл не открыт, то открыть самомстоятельно
set wo1=workbooks.open(fName)


поиск по форуму, десять раз поднимали тему
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 10:24

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

dim ex1 as object, wo1 as excel.workboook, sh1 as excel.worksheet
set ex1=createobject ("excel.application")
set wo1=ex1.workbooks.open(fname)
set sh1=wo1.worksheets(1)

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

следующий код
dim wo1 as excel.workboook, sh1 as excel.worksheet
set wo1=workbooks.open(fname)
set sh1=wo1.worksheets(1)

понимает, что файл fname уже открыт, выдает сообщение "файл такой-то уже открыт. повторное открытие приведет к потере несохраненных данных"

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.09.2005 (Ср) 10:27

Вместо CreateObject используй GetObject. Но там есть сложности (если открыто несколько инстансов Excel).
Lasciate ogni speranza, voi ch'entrate.

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 10:31

да, вот как обойти эти сложности меня и интересует
код типа
set ex1=getobject(,"Excel.application")
for each wo1 in ex1.workbooks
if wo1.fullname=fname then
f=true
exit for
end if
next wo1

не работает, поскольку в ex1 берет первое открытое экселевское окно, а мой файл предположим во втором, третьем, ...
как перебрать их все и выяснить таки открыт ли этот файл

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.09.2005 (Ср) 10:36

Открывай их все, находи нужное, а остальные сбрасывай в Nothing.
Lasciate ogni speranza, voi ch'entrate.

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 10:39

как открыть их все?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.09.2005 (Ср) 10:45

Set ex1 = GetObject
Set ex2 = GetObject
...
Lasciate ogni speranza, voi ch'entrate.

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 11:31

ну так я не знаю сколько их всего

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 11:46

как перебрать все инстансы excel (сколько бы их открыто ни было)

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 28.09.2005 (Ср) 12:00

а че Workbooks(x).FullName ктота отменил?
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 12:06

объясните пожалуйста, уже пол дня бьюсь с этим excel

сейчас вот так
on error resume next
set ex1=getobject(, "Excel.application")
if not(ex1 is nothing) then
for each wo1 in ex1.workbooks
if wo1.fullname=fname then
set wo2=wo1
exit for
end if
next wo1
end if

if wo2 is nothing then set wo2=workbooks.open(fName)

set sh1=wo1.worksheets(1)

этот код берет 1 инстанс excel проверяет не мой ли это файл и если мой, то подбирает его, если нет, то открывает мне нужный программно

как перебрать все инстансы?

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 28.09.2005 (Ср) 12:09

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

for x = 0 to Workbooks.Count
    a = Workbooks(x).FullName
next x


хелп по экселю и запись макросов тебе помогут :)
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.09.2005 (Ср) 12:09

Создай массив ex(1 To 100) As Object и принимай в него.
Lasciate ogni speranza, voi ch'entrate.

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 12:27

for x = 0 to Workbooks.Count
a = Workbooks(x).FullName
next x

перебирает только книги последнего инстанса - не подходит

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.09.2005 (Ср) 12:30

Ну неужели нельзя чуть поразмышлять?
Код: Выделить всё
Dim objExcel(1 To 100) As Object, I As Long
On Error Resume Next
For I = 1 To 100
  Set objExcel(I) = GetObject(...)
  If Err = 0 Then
    ...
  End If
  Err.Clear
Next I
On Error Goto 0
Lasciate ogni speranza, voi ch'entrate.

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 12:40

можно
я не только поразмышляла, но и попробовала уже
в коде

Dim objExcel(1 To 100) As Object, I As Long
On Error Resume Next
For I = 1 To 100
Set objExcel(I) = GetObject(...)
If Err = 0 Then
...
End If
Err.Clear
Next I
On Error Goto 0

строка Set objExcel(I) = GetObject(...) всегда берет один и тот же инстанс и хоть их меня 12, весь массив заполнится именно первым

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.09.2005 (Ср) 12:41

Хм... Не должно.
Хорошо, сейчас посмотрю.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.09.2005 (Ср) 12:48

Пока непонятно.

Попробуй такой вариант:
Dim xlBook As Excel.Workbook
Set xlBook = GetObject(FName)

По идее, если книга открыта, будет использована именно она, иначе запустится новый Excel и откроет книгу.
Lasciate ogni speranza, voi ch'entrate.

ange
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 03.02.2005 (Чт) 11:58

Сообщение ange » 28.09.2005 (Ср) 13:03

от этого варианта пришлось отказаться еще вчера
не знаю точно почему, но

мое приложение открывает файл, в нужные места добавляет необходимые данные, правит формулы и в некоторых местах выполянет сортировку
не знаю почему, но при использвании
set wo1=getobject(fName)
set sh1=wo1.worksheets(1)
wo1.application.visible=true

если файл уже был открыт до загрузки моего приложения, то никакой ошибки не выдается, но не сортируется

если же именно мое приложение и открывает файл, то файл видимо открывается только в памяти, а вот на экране он не отображается (не знаю почему visible не срабатывает, пыталась и activate - не помогло), из-за этого строка типа sh1.rows("1:27").select вызывает ошибку "Метод select из класса range завершен неверно"


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 12

    TopList