Змінити кому на крапку
Ми цього не знаємо.
Ми цього не знаємо. Тому, що за замовчуванням вона береться з системи, а не в excel "е
Макрос для зміни:
With Application
# XA0; # XA0; # XA0; # XA0; .DecimalSeparator = ":"
# XA0; # XA0; # XA0; # XA0; .ThousandsSeparator = "."
# XA0; # XA0; # XA0; # XA0; .UseSystemSeparators = False
End With
Роби висновки.
P.S.
Але це не є гуд, займатися такою фігньою. У майбутньому виникне КУПА проблем через це, так як у інших роздільники будуть Правилно, на відміну від твоїх.
> Але це не є гуд, займатися такою фігньою. У майбутньому виникне
> КУПА проблем через це, так як у інших роздільники будуть
> Правилно, на відміну від твоїх.
<Задача еще и в том, чтоб при выходе из моей программы вернуть все в исходное (поставить запятую)/I>
Я в Delphi5 працюю.
> Ми цього не знаємо. Тому, що за замовчуванням вона береться
> З системи, а не в excel "еМакрос для зміни: With Application
> .DecimalSeparator = ":" .ThousandsSeparator
> = "." .UseSystemSeparators = FalseEnd WithДелай висновки.
>
Міняю системні настройки перед запуском Excel:
if DecimalSeparator = "," then
begin
# XA0; if MessageDlg ( "Увага." + # 13 + # 13 +
# XA0; "Для нормальної роботи програми необхідно, щоб роздільником цілої і дробової частини чисел була точка." + # 13+
# XA0; "Міняти кому на крапку?", MtWarning, [mbYes, mbNo], 0) = mrNO then Abort;
# XA0; DecimalSeparator: = ".";
# XA0; // DateSeparator: = ".";
# XA0; // ShortDateFormat: = "dd.mm.yyyyy";
# XA0; // ShortTimeFormat: = "hh: mm: ss";
end;
end;
А можна поцікавитися "Для нормальної роботи програми необхідно. Щоб роздільником цілої і дробової частини чисел була точка", це як?
Що ця програма робить?
> А можна поцікавитися "Для нормальної роботи програми
> Необхідно, щоб роздільником цілої і дробової частини чисел
> Була точка ", це як?
Програма розрахунку витрати топіва літака. проблема тут
// Тут видається повідомлення про помилку
// В Excel треба встановити: Сервіс -> Налаштування -> Міжнародні -> точка
SHEET.CELLS [3,2] .NumberFormat: = "000.00";
//Треба так
// SHEET.CELLS [3,2] .NumberFormat: = "000,00";
Якщо заздалегідь встановити в Excel роздільником точку, то проблем немає, але я не знаю хто буде далі працювати з програмою. кожному не поясниш що і де там треба попередньо налаштувати.
Вибачте не зрозумів. А чому б перед введенням не змінити точку на кому або я чогось не розумію?
Взагалі, якщо я все-таки зрозумів Ваші далеко просторові пояснення, то Вам, напевно, потрібно ось це:
var
# XA0; s: string;
# XA0; Excel: OleVariant;
# XA0; WorkBook, Sheet: Variant;
begin
# XA0; s: = ExtractFilePath (ParamStr (0)) + "fff.xls";
# XA0; Excel: = CreateOleObject ( "Excel.Application");
# XA0; WorkBook: = Excel.Application.WorkBooks.Add;
# XA0; Sheet: = WorkBook.WorkSheets [1];
# XA0; Excel.ActiveWorkBook.Saveas (s, xlNormal, "", "", FALSE, FALSE);
# XA0; try
# XA0; # XA0; SHEET.CELLS [2,2]: = "Контрольне значення";
# XA0; # XA0; SHEET.CELLS [3,2]: = "1965";
# XA0; # XA0; Sheet.Columns [2] .Select; // Для всієї 2 колонки
# XA0; # XA0; SHEET.CELLS [3,2] .Select; // Для осередку
# XA0; # XA0; Excel.Selection.NumberFormat: = "0,00";
# XA0; # XA0; Excel.Application.ActiveWorkbook.Save;
# XA0; # XA0; Application.MessageBox (PChar (s), "Завершено.", MB_OK + MB_ICONINFORMATION);
# XA0; finally
# XA0; # XA0; Excel.WorkBooks.Close;
# XA0; end;
end;
> Взагалі, якщо я все-таки зрозумів Ваші далеко просторові
> Пояснення, то Вам, напевно, потрібно ось це:
Не те. Мені потрібно в Excel-е змінити міжнародні параметри. Дивіться як би я це робив без моєї програми. Я б запустив Excel, потім натиснув Сервіс -параметри-міжнародні, потім прибрав-б галочку ВИКОРИСТОВУВАТИ СИСТЕМНІ роздільник і в осередку роздільник цілої і дробової частини поставив-би крапку, натиснув ОК. От і все.
Так от мені цю точку треба поставити з моєї програми. Тобто змінити кому на крапку перед запуском файлу # XA0; 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, а вже потім вставляти число.
Все, це остання спроба пояснити Вам вашу помилку. Або спробуйте ясно сформулювати завдання, при якій обов'язково треба змінити роздільник. або, можливо, Вам допоможе хто-небудь інший.
О-о-о-о. Мене осінило. Ви хочете, щоб при відкритті Вашого документа, замість ком відображалися точки, так?
Вообщем, телепатія якась.
А користувачеві це потрібно?
// Визначаємо шлях до файлу 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: = "Час завантаження # XA0; "+ TimeToStr (Time-BegTime);
END;
end.
Так ось цей прмер мені показав, що Excel прекрасно запускається і мабуть причина в тих даних, які виводяться в файл Excel після його запуску.
Я став перевіряти далі. Тобто спробував виводити дані
Поки перевіряєте (якщо хочете звичайно) роботу цього прикладу я відійду не на довго, а потім продовжу розповідь про свої досліди. Про те як я обчислив в чому причина.
Програма робилася давно і прекрасно працювала в Win98 c Офісом-98
Такого офісу в природі не існує, претензії до піратів.
> # XA0; Розмова глухих і сліпих.
Додав я дані:
unit Unit1;
interface
uses
# XA0; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
# XA0; Excel97, OleServer, ComObj, AppEvnts, StdCtrls, Grids, Buttons, ExtCtrls, Clipbrd, ComCtrls;
type
# XA0; TForm1 = class (TForm)
# XA0; # XA0; Button1: TButton;
# XA0; # XA0; Label1: TLabel;
# XA0; # XA0; procedure Button1Click (Sender: TObject);
# XA0; # XA0; procedure FormCreate (Sender: TObject);
# XA0; private
# XA0; # XA0;
# XA0; public
# XA0; # XA0;
# XA0; # XA0; Excel: Variant;
# XA0; end;
var
# XA0; Form1: TForm1;
implementation
USES # XA0; ShellAPI;
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";
Screen.Cursor: = crDefault;
Excel.VISIBLE: = TRUE; // Показуємо Excel
Label1.Caption: = "Час завантаження # XA0; "+ TimeToStr (Time-BegTime);
END;
І тут при працюючому Delphi вилізла помилка МОЖНА ВСТАНОВИТИ ВЛАСТИВІСТЬ КЛАСУ NumberFormat КЛАСУ Page
Значить справа в форматі.
Я в програмі замінив всі висловлювання на кшталт
SHEET.CELLS [3,2] .NumberFormat: = "000.00";
Ось і вирішив я, що не залежно від того, що там у них є роздільником моя програма повинна зробити роздільником точку, попрацювати, а при виключенні повернути те, що уних там було (точку або кому).
Думалось мені, що це можна зробити додавши при завантаженні програми
рядок команди зміни роздільника в системі:
procedure TForm1.FormCreate (Sender: TObject);
begin
if DecimalSeparator = "," then
begin
# XA0; if MessageDlg ( "Увага." + # 13 + # 13 +
# XA0; "Для нормальної роботи програми необхідно, щоб роздільником цілої і дробової частини чисел була точка." + # 13+
# XA0; "Міняти кому на крапку?", MtWarning, [mbYes, mbNo], 0) = mrNO then Abort;
# XA0; DecimalSeparator: = ".";
# XA0; // DateSeparator: = ".";
# XA0; // ShortDateFormat: = "dd.mm.yyyyy";
# XA0; // ShortTimeFormat: = "hh: mm: ss";
end;
end;
Не допомагає. Ось і вирішив я запитати у знаючих Хлопцев в інтернеті.
До речі, якщо залишити # XA0; SHEET.CELLS [3,2] .NumberFormat: = "000.00",
а в Excele попередньо встановити роздільником точку (Сервіс параметри-міжнародні-поставити крапку), то все тип-топ.
Ну не писати ж мені інструкцію по применеия програми. хоча можливо доведеться. а всього-то треба навчитися міняти в Excel кому на крапку програмно, так само як "Сервіс-параметри-міжнародні-поставити крапку".
Формат повинен відповідати регіональним налаштувань, і це стосується не тільки Ексель, але і інших додатків. Ти ж сам порушуєш всі вимоги ОС, а код то твій, хто заважає правильно писати.
> Програма робилася давно і прекрасно працювала в Win98 c
> Офісом-98
Перепрошую. думаю ви зрозуміли. що 97
> Anatoly Podgoretsky
Досвідом підтверджено, що скільки у комп'ютера користувачів, стільки і налаштувань. тому програма повинна зробити якісь треба, а після завершення все повернути на місце. тобто бути незалежною від них. цього я і домагаюся
А нельзялі як то опитати системний роздільник, і при вивантаженні в ексель їм користуватися? Тобто програма вважає так, як подобається їй, а в Ексель вантажиться все, так як йому подобається.
> Галинка
Пробую замість DecimalSeparator: = "." послати SendMessage
Вірніше не пробую, а розшукую параметрви необхідного повідомлення системі
Ну давайте тоді стандартні настройки Excel-я встановимо, попрацюємо з нашою програмою, а потім повернемо все в початковий, як було (у користувачів) .Тільки як? В тому-то й питання.
Хіба мало хто і що змінює при роботі з Excel. Там люди може під свої потреби підлаштували і забули. На то і дана така можливість - ставити крапку або кому в вікні Міжнародних налаштувань. Це тільки Anatoly Podgoretsky всіх рублем за це пропонує карати, а розробники Excel як бачите мають іншу думку, дозволяючи робити так як кому потрібно. І це вірно. Стандарти теж справа наживна. раніше точка була, тепер кома. на то ми і астрономи, щоб думати. Я ж не предлогаю робити тільки як я хочу. Я предлогаю попрацювати, а потім повернути у вихідне.
Поки думаю так. або повідомлення треба шукати в систему на зміну системного роздільник перед запуском Excel (а потім повідомлення на повернення всього в вихідне незалежно від того, що там було), або треба інструкцію до програми писати.
власне, а навіщо треба міняти?
> Може програма твоя перебрала міру і вимагає зайвого?
Зайвого не вимагає. навпаки треба б її розширити, так все часу немає
Таки незрозуміло, що заважає писати SHEET.CELLS [3,2] .NumberFormat: = Format ( "000% s00", [XLSeparator]); # XA0 ;, де 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!
Якщо користувач Ексель вимагає точку давай точку, якщо вимагає кому давай кому, підставляючи відповідний роздільник в дані своєї програми при необхідності.
Procedure.
var
XLSeparator: variant;
begin
XLSeparator: = Excel.DecimalSeparator;
SHEET.CELLS [3,2]: = "19.65";
SHEET.CELLS [3,2] .NumberFormat: = Format ( "000% s00", [XLSeparator]);
end;
Отримав помилку Format% invalid or incompatible with argument
Пам'ять: 0.86 MB
Час: 0.052 c