«Невозможно установить свойство NumberFormat класса Range»
Этот код работает уже много лет. Я подумал, что, может быть, случайно нажал клавишу, но мне кажется, что я этого не вижу. Я вдруг получаю ошибку:
Невозможно установить свойство NumberFormat класса Range
В приведенном ниже коде:
2 ответа
Проблема, обнаруженная в чате, заключалась в том, что книга имела более 64 000 форматов, из-за чего пользователь получал сообщение об ошибке « Слишком много разных форматов ячеек » в Excel.
Тема: в Excel появляется сообщение об ошибке «Слишком много разных форматов ячеек»
ЦИТАТА из приведенной выше ссылки
В файлах Microsoft Excel 2007/2010 может появиться следующее сообщение об ошибке;
Excel обнаружил в файле нечитаемое содержимое
Эта проблема возникает, когда книга содержит более 4000 различных комбинаций форматов ячеек в Excel 2003 или 64 000 в Excel 2007 и более поздних версиях.
Я столкнулся с этой проблемой, используя надстройку Fuzzy LookUp в Office365ProPlus. После того, как я запустил FuzzyLookUp, было сгенерировано только 10 строк вывода, и это сообщение появилось.
Проблема была вызвана моей локальной настройкой Excell.
Чтобы исправить это, мне пришлось изменить десятичный разделитель с запятой на точку в общих настройках Excel.
С моей стороны, это отлично решило проблему.
forum.clarionlife.net
Место общения программистов, форум разработчиков БД на Clarion
[OLE] [Excel] Установка формата ячейки
Модератор: Дед Пахом
Сообщение Гость » 31 Март 2004, 8:44
(С55EE(G); WinXP,98; ExcelXP,2000)
OLE Automation Error
«Нельзя установить свойство NumberFormat класса Range»
==================================================
3. Я хочу записать в ячейку дробное число
?OLE <'Cells(' & i & ',' & j+1 & ').Value'>= YVol[m#,j]
как обеспечить распознавание числа ^^^^^^^^
как дробного числа с DecimalSeparator = «.» и автоматического приведение его к DecimalSeparator, установленному в системе.
Т.е. чтобы из Clarion в Excel число записывалось именно как число и именно с тем DecimalSeparator, который установлен в системе
Вариант (ExcelXP)
?OLE <'Application.DecimalSeparator'>= ‘».»‘
?OLE <'Application.UseSystemSeparators'>= FALSE
Не работает под Excel2000 (ну нет там таких свойств)
Пробую обойти это так:
но здесь проблема с NumberFormat (см. Выше) (оставить в том виде что есть (текстовом) нельзя, так как на его основе не строятся ChartObjects)
Посоветуйте, плиз: как надо правильно записывать в ячейки Excel дробные числа независимо от настроек системы
Сообщение Гость » 01 Апрель 2004, 8:36
ГОСПОДА КЛАРИОНИСТЫ!
Если не поможете, начну о вас плохо думать.
Раз никто не отвечает, то либо лениво писать, либо некогда. Зачем сразу «плохо думать»
От себя: Конкретно ручками писать работу с Excel через OLE не писал.
Сразу стал писать используя OfficeTemplate. Там это без проблем, например:
Сообщение Гость » 01 Апрель 2004, 11:08
Я при выводе дробного числа в Excel делаю так
Сообщение Гость » 01 Апрель 2004, 11:36
Да при чем тут это?
Мне не нужно менять установки в системе.
Мне нужно только
1. Правильно вывести число с десятичной точкой в Excel
2. Задать числовой формат ячейки в Excel
Я не понял, что следующий код не работает?:
Если правильно понял то проблема десятичной точки тогда
Format(FSN:SNMBR,@n5`2)
Меняет точку на запятую
Liudvikas Jagucanskis
Написал: ClaList(2)
Сообщение Гость » 01 Апрель 2004, 14:31
В случае, когда в качестве системного десятичного разделителя установлена запятая.
НЕ работает вот что
?OLE <'Selection.NumberFormat'>= ‘»0.00″‘
выдает ошибку:
OLE Automation Error
«Нельзя установить свойство NumberFormat класса Range»
и наоборот: использовать «0,00», когда в системе разделителем является точка, тоже нельзя. Ошибки при работе нет, но вот данные в Excel искажаются.
у Вас в настройках системы какой десятичный разделитель установлен?
(и еще если можно: какой Excel, какая Windows?)
Я тут покопался малость и вот что выяснил:
Ошибки при работе нет, но вот данные в Excel искажаются.
Тогда почему в коде VBA (в макросе Excel) стоит именно «0.00».
Подскажите: как определить какой символ используется в качестве десятичного разделителя? Я так понимаю это через API делать надо?
Приведите пример вызова функции API в Clarion.
—
Best regards,
Ivan
Написал: ClaList(2)
Сообщение Гость » 01 Апрель 2004, 18:44
Ну почему бы самому не написать 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
дык я с удовольствием
знал бы я как к ней подступиться
это что за выражение.
это и имеется ввиду под функцией?
а почему «sys:» вначале?
Ну что ребята, так сложно мс-дэ-эну почитать?
где конкретно тебя должно интересовать 4 поле сверху
О-о-о, сенкс, об этой функции не знал!
—
Best regards,
Maxim Yemelyanov
Написал: ClaList(2)
Нельзя установить свойство numberformat класса range vba
Написанное приложение, прекрасно работающие с Excel’ем на собственном компьютере, часто, после переноса приложения на другой компьютер, оказывается неработоспособным! Отчего так происходит? В этой статья я собираюсь описать разницу в работе русской версии Excel’я из VBA и через COM интерфейс (библиотеку типов, TLB) из Delphi. Почему возникли расхождения? Ответа на эти вопросы у Microsoft я не нашел…
Примечание:
сравнивались только русская и английская (American English) версии Excel с номером версии 9.0 (MS Office 2000) и выше. Другие версии не рассматривались.
Описание типов объектов, применяемых в примерах:
Используемые в примерах » дополнительные » модули:
OleServer, Excel2000, Office2000 из стандартной поставки Delphi Enterprise версии 6 и выше.
У вас русская версия Excel?
Определить наличие русской версии Excel возможно так:
Примечание:
в Office97 свойство LanguageSettings отсутствует
Далее мы рассмотрим приемы работы с » русским » Excel’ем.
Работа со свойством объекта Range NumberFormat
NumberFormat и NumberFormatLocal четко работают в VBA и полностью соответствуют своему содержанию в названиях, но только не при работе из Delphi. В Excel2000.pas (D7) они описаны как
Формат даты
Формат чисел. Разделители. (DecimalSeparator, ThousendSeparator)
И это еще не все! Заходим в настройки Excel’я «Сервис/Параметры» переходим на закладку «Международные» и видим опять «Разделитель целой и дробной части», «Разделитель разрядов» и чекбокс «Использовать системные разделители». Т.е. использование системных разделителей не может гарантировать правильного применения при форматировании чисел в Excel’е. Решение: использовать свойство ExcelApplication.International (о нем дальше). Причем, даже при установленном свойстве ExcelApplication.UseSystemSeparators = False и отличных от системных ExcelApplication.DecimalSeparator и ExcelApplication.ThousandsSeparator, ExcelApplication.International отработает корректно.
Далее рассмотрим примеры работы (или не работы), приняв «стандартные» настройки для русских Windows:
Примечание:
в примерах значения записываются в Value2 для предотвращения форматирования «на лету» самим Excel’ем. Так число 123.45, записанное в Value будет автоматически отформатировано Excel’ем в формат валюты, а присвоение Value = Date будет автоматически переведено в формат даты. Запись в Value2 «воспринимает» значение как Double. Подробнее смотрите в справке VBA для Excel’я.
Решения (с использованием ExcelApplication.International):
Для получения формата даты можно написать функцию:
Для формата валюты:
Тот же принцип можно применить к времени и другим типам. Также смотрите другие индексы для свойства International (их там много) в справке VBA. Например, получить «основной» (general) формат можно так:
установить основной формат еще можно установить, записав в NumberFormat «пустую» строку, т.е. указать, что нет форматирования для чисел (даты):
Цвет в формате
К сожалению, не лучше обстоит дело и с цветом в форматах. Т.е. цвет в Delphi можно задавать только по-русски: Перечень цветов по-русски, которые можно задавать в формате: черный, красный, зеленый, синий, фиолетовый, желтый, белый. Список небогатый.
Формулы на листе
Здесь приятней и проще пользоваться английскими формулами. Но, иногда, существует необходимость писать формулы из вариантного массива…
Примечание:
системные переменные ListSeparator, DateSeparator описаны в модуле System.
Запись формул из Variant-ного массива
Запись в свойство Formula, FormulaLocal, Value, Value2 из Variant-ного массива идентична в русском Excel’е и при работе из Delphi. Но, если мы хотим вставлять формулы прямо из массива, все они должны быть только русскими! Вот здесь то и всплывает необходимость определения наличия русской версии Excel’я (впрочем, это уже касалось задания цвета в свойстве NumberFormat).
Код на Delphi (тут мы применим знание написания русских формул, описанный выше, а именно ListSeparator):
Примечание:
из примера видно, что при записи из Variant-ного массива в Formula, FormulaLocal, Value, Value2 не имеет значения, какой стиль ссылок используется: A1 и R1C1 работают идентично. Но это не относится к свойствам FormulaR1C1 и FormulaR1C1Local, которые принимают формулы ТОЛЬКО в стиле R1C1.
Создание колонтитулов
Давайте запустим запись макроса создания колонтитула (меню в Excel «Сервис/Макрос/Начать запись…» ). Теперь откроем параметры страницы (меню «Файл/Параметры страницы…»). Создадим центральный нижний колонтитул «Лист &[Страница] из &[Страниц]» шрифтом «Arial», «полужирный» и размером 8pt. Слова «Лист» и «из» с начертанием «обычный». После «сокращения» макроса получим:
Примечание:
если вы хотите увидеть работу вашего макроса в действии (чтоб работал PrintPreview), обязательно внесите на лист хоть какие-нибудь данные.
Вроде бы все ясно, осталось только переписать его под Delphi:
Припоминая русификацию еще Excel’я 4-й версии, напишем русские эквиваленты:
Сработало! Ну, и теперь добавим распознавание русской версии:
Вывод: при вставке кодов форматирования из Delphi в русский Excel должны вставляться только русские коды форматирования. А где их взять? Вот список кодов форматирования, полученных методом пробы:
Работает! Т.е. начертания (Style у класса TFont в Delphi) шрифтов можно уверенно писать по-английски. Или заменить на коды форматирования:
Примечание:
для перевода строки в колонтитуле или ячейке используйте симол LF, ASCI код 10 (
#10 ):
Выводы
При работе с русским Excel’ем из Delphi необходимо соблюдать следующие правила:
Мне не удалось найти документацию, касающуюся моментов описанных выше. Весь материал построен чисто на собственном опыте. И еще: не было возможности проверить на полностью английских версиях Windows и Office.
Все примеры тестировались на Delphi 6, Delphi 7, на русских версиях WindowsXP + OfficeXP, Windows98SE + Office2000 SR?1.
Нельзя установить свойство numberformat класса range vba
Шустрый
Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009
Репутация: нет
Всего: нет
Работаю с Excel через Microsoft.Office.Interop.Excel.
Возникла проблема: при вызове
| Код |
| string decimalCellFormat = «0» + CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + «00»; |
У юзеров винды могут быть любые. Чем это лечится?
Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.7.2007
Репутация: нет
Всего: нет
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008
Репутация: 9
Всего: 49
Шустрый
Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009
Репутация: нет
Всего: нет
| Код |
| try < excel.DisplayAlerts = false; workbook = excel.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); > catch (COMException e) < switch (e.ErrorCode) < case COMConstants.Excel_InvalidTypeLibCulture: savedCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = new CultureInfo(«en-US»); excel.DisplayAlerts = false; workbook = excel.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); break; default: throw; > > |
3) На деле выяснилось следующее:
При отображении дробей (если в ячейку было передано decimal-значение) используется NumberDecimalSeparator, но при передаче Excel-ю в строке формата нужно использовать CurrencyDecimalSeparator! Т.е. изначально следовало писать так:
| Код |
| string decimalCellFormat = «0» + CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator + «00»; |
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008
Репутация: 9
Всего: 49
Шустрый
Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009
Репутация: нет
Всего: нет



















| Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.
[ Время генерации скрипта: 0.1119 ] [ Использовано запросов: 21 ] [ GZIP включён ] Нельзя установить свойство numberformat класса range vbaПрофиль Репутация: нет Шустрый Профиль Репутация: нет Бывалый Профиль Репутация: нет Evil Skynet Профиль Репутация: 15
3. Открывать эксель не новым сервером, а присединяться к запущенному серверу. там проверять все открытые книги.
Шустрый Профиль Репутация: нет А как процентный формат установить ExcelApplication1.Range[‘C’+inttostr(rr+2),EmptyParam].NumberFormat:=’#,##0.00’; | ||||||||||||
Шустрый
Профиль
Группа: Участник
Сообщений: 84
Регистрация: 21.11.2006
Репутация: нет
Всего: нет
Evil Skynet
Профиль
Группа: Комодератор
Сообщений: 3287
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650
Репутация: 15
Всего: 108
это просто некоторые особенности при работе в разных версиях Excel, этот должен работать. по идее. для стандартных настроек.
или используй функцию с www.delphikingdom.com
| Код |
| function XL_GetNumberFormat(XLApp: ExcelApplication): String; begin Result := Format(‘#%s##0%s%s’, [XLApp.International[xlThousandsSeparator, lcid], XLApp.International[xlDecimalSeparator, lcid], StringOfChar(‘0’, Integer(XLApp.International[xlCurrencyDigits, lcid]))]); end; |
Шустрый
Профиль
Группа: Участник
Сообщений: 84
Регистрация: 21.11.2006
Репутация: нет
Всего: нет
Бывалый
Профиль
Группа: Участник
Сообщений: 170
Регистрация: 17.3.2007
Где: Сириус, созвездие Большого Пса
Репутация: нет
Всего: нет
говорит что «Нельзя установить свойство NumberFormat класса Range».
Бывалый
Профиль
Группа: Участник
Сообщений: 170
Регистрация: 17.3.2007
Где: Сириус, созвездие Большого Пса
Репутация: нет
Всего: нет



















| 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.
[ Время генерации скрипта: 0.1273 ] [ Использовано запросов: 21 ] [ GZIP включён ] | ||||||

)


