[OLE] [Excel] Установка формата ячейки

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Hello clalist,

всемогущий и милостивейший :)

(С55EE(G); WinXP,98; ExcelXP,2000)


==================================================
1. Объясните вещь, плиз:
Почему

?OLE{'Cells(' & i & ',' & j+1 & ').NumberFormat'} = '"@"'
! это текстовый формат ячейки

работает, а

?OLE{'Cells(' & i & ',' & j+1 & ').NumberFormat'} = '"General"'
или
?OLE{'Cells(' & i & ',' & j+1 & ').NumberFormat'} = '"0.00"'

выдает ошибку:

OLE Automation Error
"Нельзя установить свойство NumberFormat класса Range"


==================================================
2. Я хочу записать в ячейку дробное число
если делаю просто

?OLE{'Cells(' & i & ',' & j+1 & ').Value'} = YVol[m#,j]

то иногда число преобразуется в дату
вопрос - как отключить?

==================================================
3. Я хочу записать в ячейку дробное число
?OLE{'Cells(' & i & ',' & j+1 & ').Value'} = YVol[m#,j]
как обеспечить распознавание числа ^^^^^^^^
как дробного числа с DecimalSeparator = "." и автоматического приведение его к DecimalSeparator, установленному в системе.
Т.е. чтобы из Clarion в Excel число записывалось именно как число и именно с тем DecimalSeparator, который установлен в системе

Вариант (ExcelXP)
?OLE{'Application.DecimalSeparator'} = '"."'
?OLE{'Application.UseSystemSeparators'} = FALSE
Не работает под Excel2000 (ну нет там таких свойств)
Пробую обойти это так:

?OLE{'Cells(' & i & ',' & j+1 & ').NumberFormat'} = '"@"'
?OLE{'Cells(' & i & ',' & j+1 & ').Value'} = YVol[m#,j]
?OLE{'Cells(' & i & ',' & j+1 & ').TextToColumns(DecimalSeparator=".")'}
?OLE{'Cells(' & i & ',' & j+1 & ').NumberFormat'} = '"General"'

но здесь проблема с NumberFormat (см. Выше) (оставить в том виде что есть (текстовом) нельзя, так как на его основе не строятся ChartObjects)

Посоветуйте, плиз: как надо правильно записывать в ячейки Excel дробные числа независимо от настроек системы

СПАСИБО

--
Best regards,
Ivan mailto:shkmail@inbox.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

елки-палки
ну ответьте хоть что-нибудь по теме
Ведь знаете, а молчите :((

--
Best regards,
Ivan

ГОСПОДА КЛАРИОНИСТЫ!
Если не поможете, начну о вас плохо думать!!!

:D
помогите, плиз...

--
Best regards,
Ivan

(Добавление)

Добрый день!

Раз никто не отвечает, то либо лениво писать, либо некогда. Зачем сразу "плохо думать"

От себя: Конкретно ручками писать работу с Excel через OLE не писал.
Сразу стал писать используя OfficeTemplate. Там это без проблем, например:

MSExcelStatistics.SetNumberFormat('#,##0.00')

С уважением Мартюшев Леонид
mailto:leonid@opfr.komi.com
Если не поможете, начну о вас плохо думать!!!
Ой, как страшно .... Глянь в MSDN функцию GetLocaleInfo.

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439
Написал: ClaList(2)
Гость

Сообщение Гость »

Я при выводе дробного числа в Excel делаю так

ExcelObject{'Range('&Clip(Yacheika)&').FormulaR1C1'} = '"'&Format(DrobnoeZnachenie,@n_17`4B)&'"'

Проблем не было...пока ;)
Написал: Ravenous(3)
Гость

Сообщение Гость »

Глянь в MSDN функцию GetLocaleInfo.
Да при чем тут это?
Мне не нужно менять установки в системе.

Мне нужно только
1. Правильно вывести число с десятичной точкой в Excel
2. Задать числовой формат ячейки в Excel

подробности - в предыдущих сообщениях

--
Best regards,
Ivan

Я не понял, что следующий код не работает?:

Selection.NumberFormat = "0.00"

С уважением, Ставич Олег
Укрсиббанк г.Харьков
oldstav@ukrsibbank.com

(Добавление)

Если правильно понял то проблема десятичной точки тогда
Format(FSN:SNMBR,@n5`2)
Меняет точку на запятую

Liudvikas Jagucanskis <lwj@wireless.lt>
Написал: ClaList(2)
Гость

Сообщение Гость »

Проблем не было...пока :)
СПАСИБО... информация ценная
Только вот как тогда быть, если какой-то пользователь установил в качестве десятичного разделителя не запятую (по умолчанию), а точку?
Selection.NumberFormat = "0.00"
В случае, когда в качестве системного десятичного разделителя установлена запятая.
НЕ работает вот что

?OLE{'Selection.NumberFormat'} = '"0.00"'
выдает ошибку:
OLE Automation Error
"Нельзя установить свойство NumberFormat класса Range"

и если делать:

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

?OLE{'Selection.NumberFormat'} = '"0,00"'
                                  ^^^^^^^
то все работает!!!!

и наоборот: использовать "0,00", когда в системе разделителем является точка, тоже нельзя. Ошибки при работе нет, но вот данные в Excel искажаются.

то есть что получается: при записи NumberFormat необходимо еще и проверять: какой разделитель установлен в системе и ручками формировать либо "0,00", либо "0.00" ?
объясните, плиз, я все правильно понимаю????

СПАСИБО
MSExcelStatistics.SetNumberFormat('#,##0.00')
Но ведь должно работать и через OLE!
А почему именно такая форма шаблона формата?
#,##0.00
ведь если в системе по умолчанию стоит в качестве десятичного разделителя запятая, то и формат определяется как
# ###0,00
а знака для разделителя тысяч в Excel вообще нет :( - пробел вместо него или же Ваш OfficeTemplate использует свой собственный формат, а потом всю "грязную работу" делает сам - подстраивается под настройки системы?


у Вас в настройках системы какой десятичный разделитель установлен?
(и еще если можно: какой Excel, какая Windows?)

--
Best regards,
Ivan

(Добавление)

Я тут покопался малость и вот что выяснил:
?OLE{'Cells(' & i & ',' & j+1 & ').NumberFormat'} = '"0.00"'
выдает ошибку:
OLE Automation Error
"Нельзя установить свойство NumberFormat класса Range"
- в случае, когда в качестве системного десятичного разделителя установлена запятая.
и если делать:

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

?OLE{'Cells(' & i & ',' & j+1 & ').NumberFormat'} = '"0,00"'
                                                    ^^^^^^^
то все работает!!!!
и наоборот: использовать "0,00", когда в системе разделителем является точка, тоже нельзя.
Ошибки при работе нет, но вот данные в Excel искажаются.

то есть что получается: при записи NumberFormat необходимо еще и проверять: какой разделитель установлен в системе и ручками формировать либо "0,00"
либо "0.00" ?????
объясните, плиз, я все правильно понимаю????

Тогда почему в коде VBA (в макросе Excel) стоит именно "0.00"????

Подскажите: как определить какой символ используется в качестве десятичного разделителя? Я так понимаю это через API делать надо?
Приведите пример вызова функции API в Clarion.

СПАСИБО

--
Best regards,
Ivan
Написал: ClaList(2)
Гость

Сообщение Гость »

Ну почему бы самому не написать 1 раз функцию, чтоб потом ее пользовать в каждом проекте?

format_str = '"0' & sys:get_decimal_divider & '00"'

--
Best regards,
Maxim Yemelyanov,
Enigma Soft Company
phone: +380 572 177977
WEB: http://enigmasoft.com.ua
e-mail: clalist@enigmasoft.com.ua
ICQ: 12253836

дык я с удовольствием
знал бы я как к ней подступиться
format_str = '"0' & sys:get_decimal_divider & '00"'
это что за выражение???
это и имеется ввиду под функцией?
а почему "sys:" вначале?

--
Best regards,
Ivan

Ну что ребята, так сложно мс-дэ-эну почитать?

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

int GetNumberFormat(
  LCID Locale,                // locale
  DWORD dwFlags,              // options
  LPCTSTR lpValue,            // input number string
  CONST NUMBERFMT *lpFormat,  // formatting information
  LPTSTR lpNumberStr,         // output buffer
  int cchNumber               // size of output buffer
);

тебя должен интересовать lpFormat указатель на структуру

typedef struct _numberfmt {
  UINT      NumDigits; 
  UINT      LeadingZero; 
  UINT      Grouping; 
  LPTSTR    lpDecimalSep; 
  LPTSTR    lpThousandSep; 
  UINT      NegativeOrder; 
} NUMBERFMT, *LPNUMBERFMT; 
где конкретно тебя должно интересовать 4 поле сверху

Best regards,
Andrew Listiev
Work mailto:andrewl@inbox.lv
Home mailto:gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger: werdna_werdna@hotmail.com

О-о-о, сенкс, об этой функции не знал!

MSDN:
GetLocaleInfo

только я не знаю, который из этих двух нужен. вероятнее, второй:
LOCALE_SDECIMAL - Character(s) used as the decimal separator.
LOCALE_SMONDECIMALSEP - Character(s) used as the monetary decimal separator.
а почему "sys:" вначале?
правило именования функций. sys: - имеющие прямое отношение к системе.

--
Best regards,
Maxim Yemelyanov
Написал: ClaList(2)
Ответить