Работа с файлами Excell и Word через VBA

Программирование на Visual Basic for Applications
Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 17.08.2006 (Чт) 0:42

Ну да, ясно что совпадает)
Но когда открыто 30 файлов в инвиз-моде и перебирая их все код открывает ещё 20, очень напряжно 30 раз жать "нет".
Как сделать так чтобы жала программа? или чтобы диалог не вылезал вообще?
или как сделать проверку для каждого из ActiveWindow = filename?
'Til the blood on your hans is the blood of the King!

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 17.08.2006 (Чт) 7:54

Как поменять курсор мыши с MousePointer = fmMousePointerDefault (0)на MousePointer = 11


В ворде вроде как

System.Cursor

В Екселе

application.Cursor

Если в про ВБА тут, конечно :)
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 17.08.2006 (Чт) 11:51

Спасибо, Инг! Cursor - это как раз то, что надо, хотя и значений у него всего 4, а не 17 как у MousePointer-а. Единственное где я непозволительно долго тупил - это там, где надо догадаться, что fmMousePointerHourGlass (11) выглядит точно так же, как и Cursor=xlWait, хотя и называются по разному :shock:
Хотя с doevents тоже работает, правда не в 2 строчки
'Til the blood on your hans is the blood of the King!

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 17.08.2006 (Чт) 12:54

Инг

inq, блин! :!:
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 17.08.2006 (Чт) 22:28

Прости Инк) Но если ты посмотришь на то, как выглядит твой ник на форуме (а тут он подчёркнут), ты вполне меня поймёшь) Тем более что 3я буква моего ника - "G", выглядит точно так же, как и "Q" в твоём.

Между тем возникли ещё мелкие (и, наверное, тупые) вопросы:
Когда в Excell я ввожу значения в ячейки из элементов управления типа
Код: Выделить всё
.cells (i, 5).value = Listbox.List (i, j).Value

они вводятся в указанной в элементе форме, без учёта формата ячейки (например, если в текст-боксе написано "01.01.2001" то в ячейке пишется тоже "01.01.2001", несмотря на то, что формат ячейки обязывает отображать дату в виде "01" января 2001 г.)
Если же после ввода значений пробежать по ячейкам и просто нажать Enter (т.е. ввести значение ещё раз), всё отображается в верном формате.
Пробовал делать то же самое кодом - не получается. Пробовал .value, .text, .formulas - тоже не выходит. Помогите плиз.

И второй похожий вопрос - как заставить ячейку принимать значения без отбрасываний незначащих разрядов? Т.е. например если в ячейку с суммой я ввожу число "1 000,00" то при соответствующем формате оно так и выглядит, в то время как .value равно 1000, без нулей после запятой. Как заставить .value быть с нулями?
Пробовал делить на 1 и при значении остатка "0" дописывать через "&" нули вручную, но получается какая-то громоздкая и не внушающая доверия конструкция. Есть ли пути проще?

Третий вопрос всё тот же - как обходить диалоговое окно "Вы пытаетесь открыть уже открытый файл"? У меня вообще что-то глухо с идеями по этому поводу.
'Til the blood on your hans is the blood of the King!

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 18.08.2006 (Пт) 2:33

И ещё :?:

Можно как-нибудь к файлам *.doc и *.xls прикреплять пару-тройку строк, прочитать которые можно только кодом? Чтобы они всегда "путешествовали" по каталогам и дискам вместе с файлами, но не были видны "неискушённому" пользователю? Что-нибудь типа file ID?

И ещё: как описывается событие изменения значений ячеек листа? Что-нибудь из серии UserForm_Initialized, только применительно к Worksheets? Т.е. чтобы пользователь только подумал что бы такого сделать, а код уже сказал бы - "низя!" и погрозил пальчиком?
'Til the blood on your hans is the blood of the King!

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 9:38

Неужели ни у кого нет ответа хотя бы на один вопрос?
Или они считаются настолько простыми или тупыми, что найти на них ответы можно самостоятельно?
'Til the blood on your hans is the blood of the King!

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 21.08.2006 (Пн) 10:29

например, если в текст-боксе написано "01.01.2001" то в ячейке пишется тоже "01.01.2001", несмотря на то, что формат ячейки обязывает отображать дату в виде "01" января 2001 г.)


Использовать CDate

заставить ячейку принимать значения без отбрасываний незначащих разрядов

Если не "принимать", а "отображать" - то формат ячейки.

как обходить диалоговое окно "Вы пытаетесь открыть уже открытый файл"

Не открывать открытый файл (делать проверку перед открытием)


как описывается событие изменения значений ячеек листа?


Код: Выделить всё
Private Sub Worksheet_Change(ByVal Target as Range)
    Target.Font.ColorIndex = 5
End Sub
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 10:53

Cdate помогает только в случае с датами, однако есть ещё несколько моментов, где требуется именно отображать введённые через пользовательскую форму значения в указанном формате, и там тоже не работает.

А с незначащими разрядами нужно именно "принимать" - например, я считаю копейки как раз по 2 цифрам после запятой, используя функцию Excell ПРАВСИМВ. В случае, когда копейки действительно есть, всё показывается правильно, однако когда сумма вроде 1234.00 то значение ячейки просто 1234, и соответственно правые символы не 00, а 34.

Как делать проверку? Сейчас я делаю проверку по схеме
Код: Выделить всё
On Errors GoTi Errr
Windows (FileName).Activate
Errr:
Exit Sub

Но получается где-то 30 "промаргиваний" эрана за минуту, что очень раздражает. Существует ли альтернатива?

С событиями изменения листа - дейсвительно я тупил, причём страшно) Подпись ГСерга напоминает...
'Til the blood on your hans is the blood of the King!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.08.2006 (Пн) 10:56

Да. Просто проверять наличие, а не выполнять действие над объектом.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 21.08.2006 (Пн) 11:27

А с незначащими разрядами нужно именно "принимать" - например, я считаю копейки как раз по 2 цифрам после запятой, используя функцию Excell ПРАВСИМВ.


Как любит выражаться GSerg - "а известна ли автору разница между 10,15 и "10,15"?" (с)

Как делать проверку?

Я делал проверку по имени книги. Можно для надежности и полный путь проверять.
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 11:37

Ну да, можно запихнуть сумму в ячейко с форматом "текст", тогда она как раз будет не "1234", а именно "1234.00", но тут уже возникает проблема с разделителями разрядов, которые нужны.

По имени книги можно проверять только Excell-файлы, а хотелось бы ещё и Word охватывать.
ГСерг, мб ты будешь любезен, не станешь отвечать на вопрос другим вопросом, от которого возникает ещё больше вопросов, а поделишься своими шаманскими методами как проверять наличие? Хотя бы тех же окон с именем файлов.
'Til the blood on your hans is the blood of the King!

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 21.08.2006 (Пн) 11:43

Ну да, можно запихнуть сумму в ячейко с форматом "текст", тогда она как раз будет не "1234", а именно "1234.00", но тут уже возникает проблема с разделителями разрядов, которые нужны.

Н-дя. Вообще-то все наоборот и предыдущим постом я тонко намекнул, что не надо с численными переменными работать как со строковыми.

По имени книги можно проверять только Excell-файлы, а хотелось бы ещё и Word охватывать.

А что, у документа Ворд нет свойства name?
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 12:08

Какую тогда функцию использовать для "узнавания" сколько сотых в значении суммы? ПРАВСИМВ казалась мне оптимальной, но возникла такая вот проблема с незначащими разрядами. Подскажи альтернативу плиз.

Да есть у него свойство name, только я не знаю строчки кода как это проверять. Подскажи пожалуйста :roll:

И остаётся ещё вопрос:
Можно как-нибудь к файлам *.doc и *.xls прикреплять пару-тройку строк, прочитать которые можно только кодом? Чтобы они всегда "путешествовали" по каталогам и дискам вместе с файлами, но не были видны "неискушённому" пользователю? Что-нибудь типа file ID?

Если я дурак раз такое спрашиваю - так и скажите!
'Til the blood on your hans is the blood of the King!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.08.2006 (Пн) 12:11

Bagathur, а какие религиозные соображения запрещают тебе использовать функцию ЦЕЛОЕ?
Lasciate ogni speranza, voi ch'entrate.

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 21.08.2006 (Пн) 12:26

Пора топик похоже переименовывать...

Какую тогда функцию использовать для "узнавания" сколько сотых в значении суммы?


А самому не?
Что первое пришло в голову
Код: Выделить всё
    copeck = summa - Round(summa)
    If copeck < 0 Then copeck = copeck + 1

Точно не помню, может есть встроенная функция по округлению в меньшую сторону.
А если отойти от конкретно ВБА и написать формулой - то вопрос Алибека актуален.

Да есть у него свойство name, только я не знаю строчки кода как это проверять

Код: Выделить всё
if Activedocument.name = openname then ...

Все ж написал, неужели нельзя открыть Ворд, редактор, справку, наконец?

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

Объявить константы.

Если я дурак раз такое спрашиваю - так и скажите!

Все когда то начинают и мало что знают. Но почему при этом не нужно читать справку, не пытаться хотя бы методом тыка что-то написать или узнать самому, почитать какую-нибудь литературу, почему нужно игнорировать замечательные клавиши F1 и F2?
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 12:56

Зачем мне целое? Надо просто узнавать, сколько в сумме копеек, и писать это в соответствующих цифрах с добавлением слова "копеек" в соответствующем числе и падеже.
Для кол-ва рублей я использую функцию ОКРУГЛ (число, 0).
Хотя вообще конечно это умно - отнимать округлённое число от самого числа чтобы узнать цифры, стоящие за запятой - только не вижу чем это отличается от моего использования функции ОСТАТ (число, 1).
Но проблема-то совсем не в этом!
Необходимо чтобы писалось "00 копеек", а пишет либо единицы и десятки рублей (при использовании ПРАВСИМВ), либо просто "0 копеек", и никакого другого пути кроме как написания "вручную" через "&" текста "00" я не нашёл.

Инк, подскажи, какой именно я должен был задать вопрос, чтобы получить тот ответ, который написал ты? Да, я спрашивал, и справка мне отвечала - я узнал много нового, кое-что достаточно успешно применил, но ответа на нужный вопрос не нашёл.

И как всё-таки сделать так, чтобы при введении значения в ячейку через элементы управления оно (значение) принимало заданный ячейке формат? Т.е. чтобы не приходилось пробегать по ячейкам и жать на них Enter.

Вариант с константами я пробовал, но тогда получается что в файле содержится код, на который ругается безопасность макросов при открывании, а этого очень не хотелось.
Сейчас я записываю все интересующие данные в Hidden .txt - файл при помощи File Input, но при перемещении документа на жёстком диске .txt-файл не перемещается вместе с ним.
'Til the blood on your hans is the blood of the King!

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 21.08.2006 (Пн) 13:11

Если ты хочешь получить "результирующую" строку вида "152 руб. 00 коп.", то проще вариантов, кроме как с & не найти.
Код: Выделить всё
if copeck = 0 then
resultstring = resultstring & " 00 коп."
else
resultstring = resultstring & " " & CStr(copeck) & " коп."
end if


как всё-таки сделать так, чтобы при введении значения в ячейку через элементы управления оно (значение) принимало заданный ячейке формат?

Форматировать значение перед внесением в ячейку

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

А как ты собираешься использовать эти значения иначе как в макросе?
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 13:37

В макросе, только запускаемом из другого файла.
Говоря более подробней - заменяя значения "рыбы" на какие-то другие, я хочу сохранять эти значения (максимальное кол-во которое встречалось - пока чуть меньше 900) и прикреплять их к создаваемому из "рыбы" файлу. Смысл подобного - открывать файлы тем же обработчиком-автозаменяльщиком, каким обрабатывалась "рыба", но уже заменять введённые значения на более новые.
С файлами Excell я просто копирую список замены на невидимый лист, откуда потом и извлекаю, но вот аналогов "невидимого листа" в Word я не знаю.

А способ с "&" для "00" и "01-09" коппек и был у меня раньше, но я думал существует способ проще, чисто на формулах Excell, причём достаточно простых. Сейчас же, избавившись от макросов, я вывожу сумму полупрописью при помощи 6-7 дополнительных, тоже "невидимых" ячеек для дополнительных преобразований.

Насчёт форматирования перед внесением в ячейку - должен же быть какой-то способ ткнуть Enter в ячейке кодом, а не руками пользователя? Или нет?
'Til the blood on your hans is the blood of the King!

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 21.08.2006 (Пн) 14:04

В макросе, только запускаемом из другого файла.


На время его работы можно поставить низкий уровень безопасности
Код: Выделить всё
Application.AutomationSecurity = msoAutomationSecurityLow


я думал существует способ проще, чисто на формулах Excell

А что мешает перенести приведенный код на формулы? А проще вряд ли получится.



должен же быть какой-то способ ткнуть Enter в ячейке кодом, а не руками пользователя? Или нет?

Если не ошибаюсь, когда-то подобная проблема на форуме обсуждалась и к "нормальному" решению так и не пришли. Предлагали обратимые операции делать, вроде как. Так что проще приводить к нужному виду сразу программно.
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 15:45

Странно, я думал что машина воспринимает действия пользователя по введению значения в ячейку как то же самое .cells (1,1).value (.formulas, .text) = "то_что_хочешь_написать".
Однако оказывается сама же машина совершенно бессильна, когда необходимо просто-напросто продублировать "человеческое" нажимание Enter-а.
Как же это усложняет всё дело...
'Til the blood on your hans is the blood of the King!

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 15:53

Блин пока писал предыдущий пост меня озарила идея - кинулся реализовывать, оказалось что работает!
Итак, имея число 1234.00, значащееся как "1234", чтобы достать из него "00-09 копеек", но не потерять при этом все копейки от 10 до 99, используется одна формула Excell, а именно ПРАВСИМВ (Число*100; 2) - умножение на 100 даёт именно копейки, и не надо никаких дополнительных преобразований.
Как никогда понимаю подпись ГСерга.
'Til the blood on your hans is the blood of the King!

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 21.08.2006 (Пн) 15:57

угу, а как же 00 копеек? :)
подписи нет и не будет

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 16:21

Да нормально всё, копеечка в копеечку)
1234.00 * 100 будет 123400, а 2 правых символа там как раз "00")
'Til the blood on your hans is the blood of the King!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.08.2006 (Пн) 16:24

А 1234.567 сколько будет?
Lasciate ogni speranza, voi ch'entrate.

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 21.08.2006 (Пн) 16:36

Я работаю с рубля, причём без сотых долей как на биржах)
И 0.7 копейки - это нонсенс) Да и формат ячейки, откуда берутся копейки, стоит как денежный с 2 знаками после запятой, так что думаю такого подвоха не будет)
'Til the blood on your hans is the blood of the King!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.08.2006 (Пн) 20:14

Формат ячейки не связан со значением ячейки.
И в один прекрасный момент ты можешь получить в ячейке значение 123.069999998989181324.
Lasciate ogni speranza, voi ch'entrate.

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 22.08.2006 (Вт) 7:34

Связан, если зайти в Сервис --> Параметры --> Вычисления и поставить там галочку "точность как на экране".
'Til the blood on your hans is the blood of the King!

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 24.08.2006 (Чт) 12:42

Тут возникла ещё одна проблема, которая заставляет меня просто ронять челюсть на пол и озадаченно чесать репу:

При попытках закрыть все открытые кодом файлы какое-то время всё идёт нормально, но потом всё вдруг резко перестаёт работать, и никакой закономерности я тут не вижу.
Закрываю кодом
Код: Выделить всё
  Dim WordApp As New Word.Application
Private Sub Закрыть_Click()
j = -1
Do While j < (ПутиФайлов.ListCount - 1)
j = j + 1
fname = ПутиФайлов.List(j, 0)
t = 1
  Do While t <> 0
i = t + 1
t = InStr(i, fname, "\", 1)
  Loop
fname = Right(fname, (Len(fname) - i + 1))

Select Case Right(fname, 4)
Case ".doc"
WordApp.Windows(fname).Close (savechanges = True)
Case ".xls"
Windows(fname).Close (savechanges = True)
End Select
Loop

End Sub


Всё работает по началу нормально, даже если закрывать-открывать одно и то же - раза 3-4 всё ОК, а на 5ый выдаёт ошибки -
1ая - 5941: Запрашиваемый номер семейства не существует
2ая - 462: Remote server machine does not exists or is unavailable

Причём иногда тот же код (закрыть окно) из-под Word срабатывает, а иногда выдаёт такую же ошибку. Заметил, что в запущенных процессах у меня висит несколько WINWORD.EXE, при убивании их ошибка №1 меняется на ошибку №2.
При перезагрузке всё снова работает - и снова недолго.
Подскажите в чём тут может быть дело?
'Til the blood on your hans is the blood of the King!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.08.2006 (Чт) 13:07

DoEvents делай и задержку.
Lasciate ogni speranza, voi ch'entrate.

Пред.След.

Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

    TopList