:: Visual Foxpro, Foxpro for DOS
Объединение ячеек
RиN
Автор
Проблема с объединением ячеек в Excel. Макросы смотрел. Все работает, но если
не вставлять, не удалять и не очищать строки. После очистки строки ("CLEAR")
очищается и объединение ячеек. Можно, конечно, поизвращаться но хочется
получить результат нормальным путем.
Ratings: 0 negative/0 positive
Re: Объединение ячеек
RиN
Автор
Исходник лежит во вложении
Ratings: 0 negative/0 positive
Re: Объединение ячеек
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Ну, ты и накрутил! Все решается гораздо проще

* Создаем объект Excel
LOCAL comExcel as Excel.Application
comExcel=CREATEOBJECT('Excel.Application')
comExcel.workbooks.Add
* Делаем Excel видимым
* Эту команду надо давать в самом конце формирования листа Excel
* здесь она приведена для наглядности
comExcel.Visible= .T.
* Объединяем ячейки с A1 по K1
comExcel.Range("A1:K1").MergeCells = .T.

Синтаксис

LOCAL ... AS ... введен только с версии VFP7. Если у тебя младшая версия, то опцию "as" надо опустить
Ratings: 0 negative/0 positive
Re: Объединение ячеек
RиN
Автор
Спасибо, Владимир, за ответ. Убрал кое-что лишние - для эксперимента. Многое там было после долгих
изысканий. Вот что получилось:

*COPY TO (m_file_xls) TYPE XL5 FIELDS &ff WHILE mm=mycod.and.ggmm=godmes


LOCAL loExcel, lcOldError as EXCEL.Application


lcOldError=ON("ERROR")
ON ERROR loExcel = .NULL.
loExcel = GETOBJECT(,"Excel.Application")
ON ERROR &lcOldError


IF ISNULL(loExcel)
loEXCEL=CreateObject("EXCEL.Application")
ENDIF


WITH loExcel
.workbooks.open(m_file_xls)
.displayAlerts=False
.visible = False
.range("A1:K1").MergeCells=.t.


.ActiveWorkbook.Save
.Application.Quit
ENDWITH
RELEASE loExcel



Если Excel открываю с "нуля" - все получается. Если файл создаю ручками, то тоже все хорошо.
Ну а если файл создается с помощью

COPY TO (m_file_xls) TYPE XL5 FIELDS &ff WHILE mm=mycod.and.ggmm=godmes
или
EXPORT TO (m_file_xls) TYPE XL5 FIELDS &ff WHILE mm=mycod.and.ggmm=godmes

то с объединением ячеек возникают проблемы. Добился объединения ячеек, но если зайти в Excel
и очистить эти ячейки, то они снова разъединяются. Или сделать что-либо с ними из VFP.
Ratings: 0 negative/0 positive
Re: Объединение ячеек
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Опять ты невнимателен!

LOCAL loExcel, lcOldError as EXCEL.Application
Зачем тебе переменную lcOldError объявлять как EXCEL.Application? Никакого смысла! Ты же ее не как ссылку на Excel создаешь.

Синтаксис LOCAL ... AS ... нужен для подключения механизма IntelliSense. Т.е. чтобы раскрывался список событий и методов при вводе точки после имени переменной.

loExcel = GETOBJECT(,"Excel.Application")
Вот этого делать не надо! Создавай всегда новый экземпляр COM-объекта. Т.е. всегда только

loEXCEL=CreateObject("EXCEL.Application")
Причин множество. Долго объяснять. Просто поверь на слово.

При работе с COM-объектами крайне нежелательно использовать объектные скобки WITH...ENDWITH. Это может быть источником многих глюков. Тем более в твоем случае, когда ты используешь объектные скобки для прямой ссылки на объект. Нет никакого смысла!

loExcel.displayAlerts=.F.
Вот это опять зря! Ведь именно сообщения самого Excel тебе и скажут в чем причина ошибки. Как правило, объединение ячеек вызывает ошибку, если есть данные в нескольких ячейках из объединяемого диапазона. Вот и смотри, какие данные там оказались. Скорее всего, речь идет о нулях в числовых полях.

loExcel.visible = .F.
Снова бессмысленная команда. COM-объект, созданный через CreateObject() и так невидимый по определению. Обычно требуется прямо противоположное - сделать его видимым.

Цитата:
Если Excel открываю с "нуля" - все получается. Если файл создаю ручками, то тоже все хорошо.
Ну а если файл создается с помощью

COPY TO (m_file_xls) TYPE XL5 FIELDS &ff WHILE mm=mycod.and.ggmm=godmes
или
EXPORT TO (m_file_xls) TYPE XL5 FIELDS &ff WHILE mm=mycod.and.ggmm=godmes

то с объединением ячеек возникают проблемы.
Ты объединяешь ячейки с "A1" по "K1". Проблемы с объединением будут если есть данные более чем в одной ячейке из указанного диапазона. Пример:

LOCAL comExcel as Excel.Application
comExcel=CREATEOBJECT('Excel.Application')
m.comExcel.workbooks.Add
m.comExcel.Visible= .T.
m.comExcel.Cells(1,1).Value = 1
m.comExcel.Cells(1,2).Value = 2
*m.comExcel.Range("B1:K1").Clear()
m.comExcel.Range("A1:K1").MergeCells = .T.
Этот код вызовет ошибку, поскольку в объединяемом диапазоне есть данные более чем в одной ячейке. Но если снять комментарий, то все пройдет без ошибок.

Цитата:
Добился объединения ячеек, но если зайти в Excel и очистить эти ячейки, то они снова разъединяются
Тщательнее следи за своими пальцами! Такого быть не может! Разъединение ячеек происходит не в следствии очистки содержимого, а при прямой команде "разъединить".
Ratings: 0 negative/0 positive
Re: Объединение ячеек
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi RиN!

Смотря как очищать! По сути полная очистка (включая формат - т.е. НЕ "только формулы/содержимое") обязана снимать объединение! Ибо Merge - это лишь один из атрибутов ячейки - как например её цвет, шрифт, границы и т.п.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Объединение ячеек
RиN
Автор
Здравствуй,Владимир

Убрал все лишнее. Как ты рекомендовал. Хотя все это я взял из М.Базияна и советов этого форума.
Я не хочу создавать новый файл. Я хочу скопировать часть базы в Excel и затем подредактировать чуть-чуть.
Если просто открыть экселешный файл, то этот код работатет. А если создать файл с помощью

copy to ... type xl5
или
export to ... type xl5

то не хочет.

*COPY TO (m_file_xls) TYPE XL5 FIELDS &ff WHILE mm=mycod.and.ggmm=godmes
LOCAL loExcel as EXCEL.Application
*lcOldError=ON("ERROR")
*ON ERROR loExcel = .NULL.
*loExcel = GETOBJECT(,"Excel.Application")
*ON ERROR &lcOldError
*IF ISNULL(loExcel)
loEXCEL=CreateObject("EXCEL.Application")
*ENDIF
loExcel.workbooks.open(m_file_xls)
*loExcel.displayAlerts=False
*loExcel.visible = False
loExcel.range("A1:K1").Clear && добавил чтобы Excel не ругался, т.к. там есть ненужная информация
loExcel.range("A1:K1").MergeCells=.t.
loExcel.ActiveWorkbook.Save
loExcel.Application.Quit
RELEASE loExcel


И не работает, проверено на нескольких компьютерах. Windows 98-Windows Me, Office 2000.
Скорее всего придется поизвращаться и обойтись без объединения ячеек, или без копирования файлов
как нибудь через массив.

Ratings: 0 negative/0 positive
Re: Объединение ячеек
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Попробуй сделать копирование в файл формата Fox2x

COPY TO ... TYPE FOX2X AS 866

Полученная DBF-таблица нормально откроется в Excel. Никаких проблем быть не должно. Кроме того, ты можешь еще в FoxPro открыть эту таблицу и почистить ее содержимое, если необходимо.

А вообще-то, Игорь подкинул разумную идею. Возможно при копировании TYPE XL5 у тебя получаются какие-то специфические форматы ячеек?

Так мы долго можем писаниной заниматься, полка ты не выложишь полученный файл XLS.
Ratings: 0 negative/0 positive
Re: Объединение ячеек
RиN
Автор
Спасибо, Владимир !

Приятно поговорить с умным человеком, тогда иногда и у самого умные мысли появляются.

Добавил строчки

loExcel.displayAlerts=False && чтобы всетаки Excel не ругался
loExcel.ActiveWorkbook.SaveAS(m_file_xls,xlNormal)

и все заработало.
При экспорте формат Офиса 95. Перевел в формат Офиса 2000. Тогда все получилось.


COPY TO (m_file_xls) TYPE XL5 FIELDS &ff WHILE mm=mycod.and.ggmm=godmes
LOCAL loExcel as EXCEL.Application
*lcOldError=ON("ERROR")
*ON ERROR loExcel = .NULL.
*loExcel = GETOBJECT(,"Excel.Application")
*ON ERROR &lcOldError
*IF ISNULL(loExcel)
loEXCEL=CreateObject("EXCEL.Application")
*ENDIF
loExcel.workbooks.open(m_file_xls)
loExcel.displayAlerts=False
*loExcel.visible = False
loExcel.ActiveWorkbook.SaveAS(m_file_xls,xlNormal)
loExcel.range("A1:K1").Clear
loExcel.range("A1:K1").MergeCells=.t.
loExcel.ActiveWorkbook.SaveAS(m_file_xls,xlNormal)
loExcel.Application.Quit
RELEASE loExcel


Всего хорошего.

Ratings: 0 negative/0 positive


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

On-line: 44 (Гостей: 44)

© 2000-2024 Fox Club 
Яндекс.Метрика