они вводятся в указанной в элементе форме, без учёта формата ячейки (например, если в текст-боксе написано "01.01.2001" то в ячейке пишется тоже "01.01.2001", несмотря на то, что формат ячейки обязывает отображать дату в виде "01" января 2001 г.)
Если же после ввода значений пробежать по ячейкам и просто нажать Enter (т.е. ввести значение ещё раз), всё отображается в верном формате.
Пробовал делать то же самое кодом - не получается. Пробовал .value, .text, .formulas - тоже не выходит. Помогите плиз.
И второй похожий вопрос - как заставить ячейку принимать значения без отбрасываний незначащих разрядов? Т.е. например если в ячейку с суммой я ввожу число "1 000,00" то при соответствующем формате оно так и выглядит, в то время как .value равно 1000, без нулей после запятой. Как заставить .value быть с нулями?
Пробовал делить на 1 и при значении остатка "0" дописывать через "&" нули вручную, но получается какая-то громоздкая и не внушающая доверия конструкция. Есть ли пути проще?
Как обходить диалоговое окно "Вы пытаетесь открыть уже открытый файл"? Кроме попытки сделать окно с именем проверяемого файла активным и отлавливания ошибки ничего не приходит в голову. Конечно, работает, но получается около 30 "промаргиваний" экрана за минуту, жутко раздражает. Может быть есть способ проще?
Можно как-нибудь к файлам *.doc и *.xls прикреплять пару-тройку строк, прочитать которые можно только кодом? Чтобы они всегда "путешествовали" по каталогам и дискам вместе с файлами, но не были видны "неискушённому" пользователю? Что-нибудь типа file ID?
1. = Format(Listbox.List (i, j).Value, "dd mmmm yyyy г."
2. Формат - ячейки - число - числовой - число десятичных знаков - 2
3. А зачем открываь уже открытый файл?
4. Я бы воспользовался свойствами файла, но они видны пользователю в соответствующем окне.
Неискушённый пользователь обычно их не смотрит, особенно "прочие".
Форматирование текст-бокса не поможет, т.к. я использую дату из него несколькими разными способами - например, 01.01.01 для написания в виде "01" января 2001 г., в виде 01-01-2001 г. и 01.01.2001, плюс для извлечения месяца. Если записать это число в различные ячейки с соответствующими форматами, а потом нажать Enter - всё выглядит так, как требуется. Нет ли программного способа для нажимания Enter-a?
Формат ячеек не помогает, т.к. .Value всё равно "1234", а не "1234.00", как отображается, и соответственно функция ПРАВСИМВ(число, 2) для этого числа возвращает значение "34", а не "00", как требуется (необходимо для полупрописного написания суммы, для отсечения копеек)
Открываю не я, а программа, причём список файлов, достигающий иногда 50+ названий
В свойства файла проблематично засунуть 500+ строковых переменных по 5-15 символов каждая.
If IsDate(ListBox.List(i, j).Value) Then
.Cells(i, 5).Value = CDate(ListBox.List(i, j).Value)
Else
'MsgBox "Значение " & ListBox.List(i, j).Value & " не может быть преобразовано в формат даты!"
End If
2.
Как заставить .value быть с нулями?
Зачем??? При считывании значение ячейки тебе паралельно в каком формате ты получил значение - тебе нужно далее преобразовать полученное значение к нужному виду -
Format Function
.
3.
Открываю не я, а программа, причём список файлов, достигающий иногда 50+ названий
Надо бы не заставлять программу открывать 50 одинаковых файлов (да и ваще хоть 2 одинаковых). Это нужно проверять ваще до открытия - и информировать пользователя (если нужно)!
4. Лично я бы создал отдельно .ini файл, который бы передавал с офисными файлами. У каждого свое понятие "неискушенный пользователь" - так что спрятать
500+ строковых
проблематично... тем более что "штатных" лазеек на это нет.
Я лично пользуюсь ID причем он есть и у Range и у Cells. В ID можно запихнуть строку практически неограниченной длины. Минус сего мероприятия - информация в ID жива пока открыт файл - то есть херится при закрытии и последующем открытии файла!!!!!! На счет подсказок к ячейам - да этим часто пользуются, но это не есть "спрятать".
Да, способ CDate работает, но только с датами. Как заставить и другие значения принимать внешний вид в соответствии с форматом ячеек? Например, при написании сумм в нужной валюте?
И вытаскивание из числа цифр после запятой - как его осуществлять? Если пользователь вводит в элементы управления целую сумму (например, то же самое "1234.00", то значение идёт без незначащих разрядов, просто как 1234. Как получить написание суммы в виде "1234 рубля 00 копеек"?
Сейчас для вытаскивания копеек я использую функцию Excell ПРАВСИМВ (число*100; 2), т.е. умножение на 100. Однако при некоторых вычислениях (например, НДС) сумма получается с дробными копейками, и ПРАВСИМВ вытаскивает совсем не то, что нужно.
Дробные копейки при помощи Сервис - Параметры - Вычисления - Точность как на экране или функций ЦЕЛОЕ (число) и ОКРУГЛ (число, 0) убирать проблематично, т.к. аудиторы и прочие делают из одной утерянной в процессе вычислений копейки финансовую катастрофу масштабов страны.
Я поставил заглушку в виде Instr (1, число, ".", "вручную" отсекая дробные копейки. Но получается как-то слишком громоздко - наверняка ведь должен быть способ проще?
Для хранения переменных файлов Excell я как раз и использую "невидимый" лист, но как быть с документами Word? Ничего похожего я там не встречал. А Hidden .ini файлы с записанными при помощи File Input значениями переменных не перемещаются вместе с документами по жёсткому диску. Есть ли возможность как-то программно прикреплять их один к другому?
И неужели способ нажимать кодом Enter вместо пользователя такой сложный? Это ведь простейшая операция, и имитировать её тоже должно быть просто?
И почти забыл - подскажите простейший способ проверять, открыты ли документы Word и таблицы (рабочие книги) Excell? Желательно проверку не только по названию файла, но и по полному имени (т.е. лежащие в разных директориях HDD)?
Вместо попытки активировать окно и отлавливания ошибки перешёл на
if Activedocument(workbook).name = openname then ...
вроде экран моргать перестал
В свойства файла проблематично засунуть 500+ строковых переменных по 5-15 символов каждая.
Очень просто:
With Application.ThisWorkbook.CustomDocumentProperties
For i = 1 To 500
.Add Name:="Название" & i, LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:="Строковая переменная" & i
Next
End With