Поменять точки на запятые в Excel

Как при запуске имеющегося файла Excel из моей программы программно установить в этом файле разделителем целой и дробной части точку (по умолчанию стоит как мы знаем в Excel2003 запятая). Ну то есть надо программно выполнить команду (в Excel) Сервис — параметры — международные — убрать галочку «использовать системные разделители» — посавить вместо запятой точку. Да...вот еще что... надо после окончания работы с программой вернуть все обратно (запятую)

(по умолчанию стоит как мы знаем в Excel2003 запятая). Мы этого не знаем.

Мы этого не знаем. Потому, что по умолчанию она берется из системы, а не в excel«еМакрос для смены:With Application .DecimalSeparator = «:» .ThousandsSeparator = «.» .UseSystemSeparators = FalseEnd WithДелай выводы.

P.S.Но это не есть гуд, заниматься такой фигней. В будущем возникнет КУЧА проблем из-за этого, так как у других разделители будут ПРАВИЛНЫЕ, в отличии от твоих.

> Но это не есть гуд, заниматься такой фигней. В будущем возникнет > КУЧА проблем из-за этого, так как у других разделители будут > ПРАВИЛНЫЕ, в отличии от твоих.<Задача еще и в том, чтоб при выходе из моей программы вернуть все в исходное (поставить запятую)/I>

> Как при запуске имеющегося файла Excel из моей программы > программно установить в этом файле разделителем целой и > дробной части точку (по умолчанию стоит как мы знаем в Excel2003 > запятая). Ну то есть надо программно выполнить команду (в > Excel) Сервис — параметры — международные — убрать галочку > «использовать системные разделители» — посавить вместо запятой > точку. Да...вот еще что... надо после окончания работы с > программой вернуть все обратно (запятую)Я в Delphi5 работаю !!!

> Мы этого не знаем. Потому, что по умолчанию она берется > из системы, а не в excel«еМакрос для смены:With Application > .DecimalSeparator = «:» .ThousandsSeparator > = «.» .UseSystemSeparators = FalseEnd WithДелай выводы.> Меняю системные настроки перед запуском Excel:if DecimalSeparator = «,» then begin if MessageDlg("Внимание !!!"+ #13+#13+ "Для нормальной работы программы необходимо, чтобы разделителем целой и дробной части чисел была точка.«+#13+ «Менять запятую на точку? „,mtWarning,[mbYes,mbNo],0)=mrNO then Abort; DecimalSeparator := “.„; //DateSeparator:=“.»; //ShortDateFormat:="dd.mm.yyyyy"; //ShortTimeFormat:="hh:mm:ss«;end;end;Не помогает!!!!!!11

А можно поинтересоваться «Для нормальной работы программы необходимо, чтобы разделителем целой и дробной части чисел была точка», это как?

Что эта программа делает?

> А можно поинтересоваться «Для нормальной работы программы > необходимо, чтобы разделителем целой и дробной части чисел > была точка», это как?Программа расчета расхода топива самолета. Проблема здесь SHEET:=Excel.Workbooks[1].Sheets[1];// ссылка на второй лист SHEET.Columns.Clear;//очистить предыдущие записи SHEET.PageSetup.PrintGridLines:=TRUE;// разрешили печать сетки SHEET.CELLS[2,2]:="Контрольное значение "; SHEET.CELLS[3,2]:="1965″; //Здесь выдается сообщение об ошибке //В Excel надо установить: Сервис -> Настройка -> Международные -> точка SHEET.CELLS[3,2].NumberFormat:="000.00″; //Надо так// SHEET.CELLS[3,2].NumberFormat:="000,00";Если заранее установить в Excel разделителем точку, то проблем нет, но я не знаю кто будет дальше работать с программой...каждому не объяснишь что и где там надо предварительно настроить.

Извините, не понял. А почему бы перед вводом не поменять точку на запятую или я чего-то не понимаю?

Вообще, если я все-таки понял Ваши далеко пространственные объяснения, то Вам, наверное, нужно вот это:var  s:string;  Excel:OleVariant;  WorkBook, Sheet: Variant;begin  s:=ExtractFilePath(ParamStr(0))+"fff.xls";  Excel := CreateOleObject("Excel.Application");  WorkBook := Excel.Application.WorkBooks.Add;  Sheet := WorkBook.WorkSheets[1];  Excel.ActiveWorkBook.Saveas(s ,xlNormal,"","",FALSE, FALSE);  try    SHEET.CELLS[2,2]:="Контрольное значение ";    SHEET.CELLS[3,2]:="1965";    Sheet.Columns[2].Select; // Для всей 2 колонки    SHEET.CELLS[3,2].Select; // Для ячейки    Excel.Selection.NumberFormat:="0,00";    Excel.Application.ActiveWorkbook.Save;    Application.MessageBox(PChar(s),"Окончено.", MB_OK + MB_ICONINFORMATION);  finally    Excel.WorkBooks.Close;  end;end;

> Вообще, если я все-таки понял Ваши далеко пространственные > объяснения, то Вам, наверное, нужно вот это:Не то. Мне нужно в Excel-е изменить международные параметры. Смотрите как бы я это делал без моей программы. Я бы запустил Excel, потом нажал Сервис -параметры-международные, потом убрал-бы галочку ИСПОЛЬЗОВАТЬ СИСТЕМНЫЕ РАЗДЕЛИТЕЛИ и в ячейке РАЗДЕЛИТЕЛИ ЦЕЛОЙ И ДРОБНОЙ ЧАСТИ поставил-бы точку, нажал ОК. Вот и все.Так вот мне эту точку надо поставить из моей программы. То есть сменить запятую на точку перед запуском файла Excel, а потом вернуть все обратно, то есть поставить запятую (но опять же программно).

Ну всё, я пас. Разговор глухо и слепего.Я понимаю, что Вы хотите сменить системный разделитель, я не понимаю ДЛЯ ЧЕГО. Если Вы программно заполняете xls-документ, то нет такой задачи, для которой бы было НЕОБХОДИМО сменить разделитель, т.к. тот же разделитель можно поменять в программе. Я пытаюсь Вам объяснить, что у Вас ошибка в определении задачи, Вы поставили перед собой не правильную задачу для решения возникшей у Вас проблемы (сужу исключительно по Вашим постам).Вы привели некий пример, в котором, даже не вводится дробное число.Однако предположим, что Вам надо ввести число:SHEET.CELLS[3,2]:="1965,45";Тогда, да мы получим его сохраненным в ячейке как текст. Однако, если мы сделаем так:SHEET.CELLS[3, 2] := StringReplace("1965,45", ",", ".", [rfReplaceAll]);то тогда все будет чики-пуки. И никаких смен системных разделителей.Продолжим. Если Вы хотите, что бы при вводеSHEET.CELLS[3,2]:="1965";Число в ячейке отобразилость как 1965,00, тогда надо сделать такSHEET.CELLS[3, 2].NumberFormat := "0,00";SHEET.CELLS[3, 2] := "1965";Т.е. сначала назначить NumberFormat, а уже затем вставлять число.Все, это последняя попытка объяснить Вам вашу ошибку. Либо попробуйте ясно сформулировать задачу, при которой обязательно надо сменить разделитель, либо, быть может, Вам поможет кто-нибудь другой.================О-о-о-о!!!! Меня осенило!!!! Вы хотите, чтобы при открыти Вашего документа, вместо запятых отображались точки, так?Вообщем, телепатия какая-то.

ffo © (19.08.06 23:39) [12] Не то. Мне нужно в Excel-е изменить международные параметры. А пользователю это нужно?

> Разговор глухо и слепего.Во блин... Попробую еще проще. Программа делалась давно и прекрасно работала в Win98 c Офисом-98(2000). Там при установке Офиса по умолчанию в Excel-е разделителем является точка.Теперь пользователи перешли на Офис2003 (XP). Звонят мне и говорят, что из моей программы перестал запускаться Excel. Совсем перестал... виснет программа и все. Я стал разбираться в чем дело.Вначале решил проверить запускается ли моей программой Excel2003(XP) без вывода туда данных. Для этого на базе основной программы сделал отладочную прораммку просто открытия файла IShR_ExcelA4.xls, лежащего в каталоге программы:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Excel97,OleServer,ComObj,AppEvnts, StdCtrls, Grids, Buttons, ExtCtrls,Clipbrd, ComCtrls;type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } Excel:Variant; end;var Form1: TForm1;implementationUSES ShellAPI;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);CONST Msg=«Вы пытаетесь установить связь с сервером «Microsoft ExcelXP». Этот процесс может занять значительное время.«+#13+» Продолжить?";VAR SHEET:Variant; n:OleVariant; BegTime:TDateTime;BEGIN IF APPLICATION.MessageBox(Msg,"Загрузка Microsoft ExcelXP",MB_YesNO + MB_ICONEXCLAMATION)= IDNO THEN Exit; BegTime:=Time;//Контроль времени загрузки ExcelXP//Определяем путь к файлу IShR_ExcelA4.xls, который надо открыть для редактирования (он сущечтвует и у него три листа)n:=APPLICATION.ExeName;n:=ExtractFilePath(n);n:=n+"IShR_ExcelA4.xls";try Excel:=CreateOleObject("Excel.APPLICATION")except ShowMessage(«Нет доступа к серверу «ExcelXP»«); Exit;END; Screen.Cursor:=crHourGlass; //Excel.SheetsInNewWorkbook:=1;// добавляем новую книгу с одним листом Excel.Workbooks.Open(n,0); //****************** Добавляем записи в «ЛИСТ1» ******* SHEET:=Excel.Workbooks[1].Sheets[1];//РАСЧЕТ МАРШРУТА И ТОПЛИВА SHEET.Columns.Clear;//очистить предыдущие записи SHEET.PageSetup.PrintGridLines:=TRUE;// разрешили печать сетки//ТУТ БУДЕМ ВЫВОДИТЬ ДАННЫЕ //************************* Добавляем записи в «ЛИСТ2» ****************** SHEET:=Excel.Workbooks[1].Sheets[2]; SHEET.Columns.Clear;//очистить предыдущие записи// SHEET.CELLS[6,22]:="Неизменный вес";// SHEET.CELLS[7,22]:="Груз";//ТУТ БУДЕМ ВЫВОДИТЬ ДАННЫЕ Screen.Cursor:=crDefault; Excel.VISIBLE:=TRUE; //Показываем Excel Label1.Caption:="Время загрузки "+TimeToStr(Time-BegTime);END;end.Так вот этот прмер мне показал, что Excel прекрасно запускается и видимо причина в тех данных, которые выводятся в файл Excel после его запуска.Я стал проверять дальше. То есть попробовал выводить данныеПока проверяете (если хотите конечно) работу этого примера я отойду не на долго, а потом продолжу расказ о своих опытах. О том как я вычислил в чем причина.

Программа делалась давно и прекрасно работала в Win98 c Офисом-98Такого офиса в природе не существует, претензии к пиратам.

> Разговор глухо и слепего.Добавил я данные:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Excel97,OleServer,ComObj,AppEvnts, StdCtrls, Grids, Buttons, ExtCtrls,Clipbrd, ComCtrls;type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } Excel:Variant; end;var Form1: TForm1;implementationUSES ShellAPI;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);CONST Msg=«Вы пытаетесь установить связь с сервером «Microsoft ExcelXP». Этот процесс может занять значительное время.«+#13+» Продолжить?";VAR SHEET:Variant; n:OleVariant; BegTime:TDateTime;BEGIN IF APPLICATION.MessageBox(Msg,"Загрузка Microsoft ExcelXP",MB_YesNO + MB_ICONEXCLAMATION)= IDNO THEN Exit; BegTime:=Time;//Контроль времени загрузки ExcelXP//Определяем путь к файлу IShR_ExcelA4.xls, который надо открыть для редактированияn:=APPLICATION.ExeName;n:=ExtractFilePath(n);n:=n+"IShR_ExcelA4.xls";try Excel:=CreateOleObject("Excel.APPLICATION")except ShowMessage(«Нет доступа к серверу «ExcelXP»«); Exit;END; Screen.Cursor:=crHourGlass; //Excel.SheetsInNewWorkbook:=1;// добавляем новую книгу с одним листом Excel.Workbooks.Open(n,0); //****************** Добавляем записи в «ЛИСТ1» ******* SHEET:=Excel.Workbooks[1].Sheets[1];//(РАСЧЕТ МАРШРУТА И ТОПЛИВА) SHEET.Columns.Clear;//очистить предыдущие записи SHEET.PageSetup.PrintGridLines:=TRUE;// разрешили печать сетки SHEET.CELLS[2,2]:="Контрольное значение "; SHEET.CELLS[3,2]:="19.65″; SHEET.CELLS[3,2].NumberFormat:="000.00«; //************************* Добавляем записи в «ЛИСТ2» ****************** SHEET:=Excel.Workbooks[1].Sheets[2];// ссылка на лист SHEET.Columns.Clear;//очистить предыдущие записи SHEET.CELLS[6,22]:="67.777″; SHEET.CELLS[6,22].NumberFormat:="000.00″; Screen.Cursor:=crDefault; Excel.VISIBLE:=TRUE; //Показываем Excel Label1.Caption:="Время загрузки "+TimeToStr(Time-BegTime);END;end.И тут при работающем Delphi вылезла ошибка НЕЛЬЗЯ УСТАНОВИТЬ СВОЙСТВО КЛАССА NumberFormat КЛАССА PageЗначит дело в формате...Я в программе заменил все выражения типа SHEET.CELLS[3,2].NumberFormat:="000.00";на SHEET.CELLS[3,2].NumberFormat:="000,00«;Ошибка пропала.И все бы ничего, но ведь кто то там далеко не перешел на Офис 2003(XP)...значит теперь ему это не подойдет. Вот и решил я, что не зависимо от того, что там у них является разделителем моя программа должна сделать разделителем точку, поработать, а при выключении вернуть то, что уних там было (точку или запятую).Думалось мне, что это можно сделать добавив при загрузке программы строку команды смены разделителя в системе:procedure TForm1.FormCreate(Sender: TObject);begin if DecimalSeparator = «,» then begin if MessageDlg("Внимание !!!"+ #13+#13+ "Для нормальной работы программы необходимо, чтобы разделителем целой и дробной части чисел была точка.«+#13+ «Менять запятую на точку? „,mtWarning,[mbYes,mbNo],0)=mrNO then Abort; DecimalSeparator := “.„; //DateSeparator:=“.»; //ShortDateFormat:="dd.mm.yyyyy"; //ShortTimeFormat:="hh:mm:ss"; end;end;Не помогает. Вот и решил я спросить у знающих Хлопцев в интернете.Кстати, если оставить SHEET.CELLS[3,2].NumberFormat:="000.00«,а в Excele предварительно установить разделителем точку (Сервис- параметры-международные-поставить точку), то все тип-топ. Ну не писать же мне инструкцию по применеию программы ... хотя возможно придется ... а всего-то надо научиться менять в Excel запятую на точку программно, так же как «Сервис- параметры-международные-поставить точку».

Формат должен соответствовать региональным настройкам, и это касается не только Экселя, но и других приложений. Ты же сам нарушаешь все требования ОС, а код то твой, кто мешает правильно писать.

> Программа делалась давно и прекрасно работала в Win98 c > Офисом-98Извиняюсь...думаю вы поняли. что 97

> Anatoly PodgoretskyОпытом проверено, что сколько у компьютера пользователей, столько и настроек... поэтому программа должна сделать какие надо, а после завершения все вернуть на место...то есть быть независимой от них.. этого я и добиваюсь

ffo © (20.08.06 14:45) [17]И тут при работающем Delphi вылезла ошибка НЕЛЬЗЯ УСТАНОВИТЬ СВОЙСТВО КЛАССА NumberFormat КЛАССА PageВо-первых класса Rage и это правильно, а во-вторых я сейчас ухожу и приду вечером, если будет возможность посмотрю.

А нельзяли как то опросить системный разделитель, и при выгрузке в ексель им пользоваться? Т.е. программа считает так, как нравится ей, а в эксель грузится все, так как ему нравится.

Ну и версию самого экселя узнавать. Если младше 2003, то не транслировать, если он или старше — транслировать...

ffo © (20.08.06 14:49) [19] Нет не понял, я за свое время насмотрелся и на дельфи 5.5 и на Виндоус 96

ffo © (20.08.06 14:54) [20] Программа такого делать ни в коем случае не должна, подобного программиста надо сразу увольнять.

Галинка © (20.08.06 15:16) [23] Конечно и информация о поддержке содержится в реестре, тот же самый excel.application.x и если поддержаны несколько то можно использовать любой.Одно делать нельзя — нельзя менять пользовательские настройки, региональные настройки и т.д. за это надо рублем наказывать.

> ГалинкаПробую вместо DecimalSeparator := «.» послать SendMessageВернее не пробую, а разыскиваю параметрвы необходимого сообщения системе

> ГалинкаНу давайте тогда стандартные настройки Excel-я установим, поработаем с нашей программой, а потом вернем все в исходное, как было (у пользователей).Только как? В том-то и вопрос. Мало ли кто и что меняет при работе с Excel. Там люди может под свои нужды подстроили и забыли. На то и дана такая возможность — ставить точку или запятую в окне Международных настроек. Это только Anatoly Podgoretsky всех рублем за это предлогает наказывать, а разработчики Excel как видите думают иначе, позволяя делать так как кому нужно. И это правильно. Стандарты тоже дело наживное... раньше точка была, теперь запятая ... на то мы и астрономы, чтобы думать. Я же не предлогаю делать только как я хочу. Я предлогаю поработать, а потом вернуть в исходное.Пока думаю так... либо сообщение надо искать в систему на смену системного разделителя перед запуском Excel (а потом сообщение на возврат всего в исходное не зависимо от того, что там было), либо надо инструкцию к программе писать....

[28] ffo © (20.08.06 18:27)Вопрос в другом — такие действия, как описываешь — изменять/восстанавливать настройки действительно необходимо для реализации алгоритма программы твоей? Может программа твоя зарвалась и требует лишнего? как в магазине продавцы пристанут — а трезвы ли вы, а может в трубку подышать. пока соблюдаешь соцправила поведения в магазине можешь хоть смертельно пьяным быть — продавцы должны молчать.

собственно, а зачем надо менять?

> Может программа твоя зарвалась и требует лишнего?Лишнего не требует...наоборот надо бы ее расширить, да все времени нет

> ffo © > SHEET.CELLS[3,2].NumberFormat:="000.00";Таки непонятно, что мешает писать SHEET.CELLS[3,2].NumberFormat:=Format("000%s00", [XLSeparator]); , где XLSeparator взять из того св-ва которое отображает соответствующую настройку экселя ?

> SHEET.CELLS[3,2]:="19.65";Если это число а не текст, то почему не пишется как число ?SHEET.CELLS[3,2]:=19.65;

> Таки непонятно, что мешает писать SHEET.CELLS[3,2].NumberFormat:> =Format("000%s00″, [XLSeparator]); [XLSeparator] у меня нет. Я в Delphi5 работаю. Перешел бы на более познюю версию, да привязан в этой программе к нескольким серьезным комонентам.

> [XLSeparator] у меня нет. Я не достаточно понятно выразился ?XLSeparator — переменная строкового или символьного типа которое берётся из св-ва Excel.DecimalSeparator !Если пользователь екселя требует точку давай точку, если требует запятую давай запятую, подставляя соответствующий разделитель в данные своей программы при необходимости.

> XLSeparatorЧто я наделал...Procedure ...varXLSeparator:variant;beginXLSeparator:= Excel.DecimalSeparator;SHEET.CELLS[3,2]:="19.65";SHEET.CELLS[3,2].NumberFormat:=Format("000%s00″, [XLSeparator]);end;Получил ошибку Format % invalid or incompatible with argument

ffo © (20.08.06 18:27) [28] Разработчики думают иначе чем ты, поэтому и вынесли данную настройку в пользовательскик, а программиста, который себя ставит выше пользователя надо наказывать.Тем более что это глобальные вещи, которые влияют на все экземпляры Экселя.

> Anatoly PodgoretskyПросмотрел все твои ссылки и не нашел ни одной дельной. Одни разглагольствования и призывы к наказанию. Аnatoly Podgoretsky. Не занимал бы ты эфир

Ну чтож у тебя есть возможность не писать, я даже не буду давать характеристики этой писанине. Но поговорка Юпитер ты сердишься, значит ты не прав очень верна в твоем случае.Второй вариант обратиться в персональную службу поддержки, а не в публичный форум.И не тебе судить о моих ссылках, интеллекта не хватит.

> [36] ffo © (20.08.06 20:17)> XLSeparator — переменная строкового или символьного типа var XLSeparator:string; begin XLSeparator:= Excel.DecimalSeparator;SHEET.CELLS[3,2]:=19.65;SHEET.CELLS[3,2].NumberFormat:=Format("000%s00", [XLSeparator]) end;

Наверх

Похожие статьи