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

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

Сообщение Bagathur » 24.08.2006 (Чт) 13:26

А что хоть за ошибки такие? И почему их возникновение никак нельзя предугадать?
И почему если пытаться их ловить через On Error Goto Errors ошибка 5941 ловится только 1ый раз, а потом - нет? Или это я перемудрил, хотя по Step-by-step проходит строка On Error, в тч и после 1ой ошибки.
И почему одна ошибка на русском языке, а вторая - нет?)
'Til the blood on your hans is the blood of the King!

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

Сообщение Bagathur » 25.08.2006 (Пт) 1:05

Я тут использовал для обнуления массивов код типа
Код: Выделить всё
'обнуляемый массив aryAnyFoundFiles (fcount)
fcount = 0

И вроде всё работало, значения массива скидывались, но мне тут сказали что я дурак и не умею работать с массивами?
А над строчкой моего собственного изобретения
aryAnyFoundFiles = aryAnyFoundFiles ()
просто посмеялись и сказали что она ничего не даёт, хотя и съедается компилятором.
Посмотрел по брейк-поинту - на самом деле ничего не даёт :shock:
Скажите плиз как обнулять массивы ПРАВИЛЬНО?
'Til the blood on your hans is the blood of the King!

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

Сообщение inq » 25.08.2006 (Пт) 7:41

Код:

'обнуляемый массив aryAnyFoundFiles (fcount)
fcount = 0

БУГАГА :lol:

Скажите плиз как обнулять массивы ПРАВИЛЬНО?


erase

Bagathur
вот все таки расскажи, неужели сложно книгу почитать или хелп ? Хотя, судя по представленным фрагментам все-таки книгу. С самого начала.
Последний раз редактировалось inq 25.08.2006 (Пт) 7:55, всего редактировалось 1 раз.
подписи нет и не будет

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

Сообщение Bagathur » 25.08.2006 (Пт) 7:54

Ну книги бумажной нету, да и здоровые они слишком
В хелпе вычитал про какой-та Flush и Redim, пробовал применить - не заработало.
А вот с приравниванием переменной кол-ва элементов массива к нулю всё работает, а если работает - зачем искать дальше?)
Это как в том анекдоте -
Сын программисту:" Пап, а почему солнце утром всходит , а вечером садиться?"
Программист сыну: "Система работает? Что-то неисправно? нет? Ну вот и не трогай там ничего!!!"
'Til the blood on your hans is the blood of the King!

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

Сообщение inq » 25.08.2006 (Пт) 7:58

А вот с приравниванием переменной кол-ва элементов массива к нулю всё работает, а если работает - зачем искать дальше?)

Может поделишься новейшими знаниями? :lol:
подписи нет и не будет

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 25.08.2006 (Пт) 9:46

inq писал(а):
А вот с приравниванием переменной кол-ва элементов массива к нулю всё работает, а если работает - зачем искать дальше?)

Может поделишься новейшими знаниями? :lol:

Все работает. Только массив не очищается ;)

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

Сообщение Bagathur » 25.08.2006 (Пт) 11:03

Хм, ну не очищается - и что с того?) Я вроде понял что происиходит, и никаких ошибок это не влечёт.
Просто я обнуляю границу массива, потом перезаписываю в него данные поверх старых, а при извлечении использую не
For i=1 To Ubound (Array())
а For i=1 To fcount (верхняя граница вновь записанных значений, а не массива)
т.е. извлекаю только вновь записанные значения, старые же по-прежнему висят в массиве.
'Til the blood on your hans is the blood of the King!

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

Сообщение inq » 25.08.2006 (Пт) 11:10

Я вроде понял что происиходит

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

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

Сообщение Bagathur » 25.08.2006 (Пт) 11:32

Если это неправильно - то почему тогда работает?
Да и потом, присвоить одной переменной типа Integer значение 0 быстрее, чем стирать из памяти 100+ других переменных типа String :roll:

П.С. Какую литературу читать? Большинство ссылок в соответствующем топике мертво, да и есть фраза "Лучшая книга про VBA - та, которую напишешь ты сам".
'Til the blood on your hans is the blood of the King!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 25.08.2006 (Пт) 12:13

Bagathur писал(а):Если это неправильно - то почему тогда работает?
Да и потом, присвоить одной переменной типа Integer значение 0 быстрее, чем стирать из памяти 100+ других переменных типа String

Неправильно с точки зрения достижения требуемого результата, а не работоспособности кода.
Присвоить, конечно, проще. Но при чем здесь массив? (Если я чихну на монитор, сможет ли вирус попасть в мой компьютер? (с))
И еще скажи, ты про Erase не увидел или злостно проигнорировал? :evil:

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

Сообщение inq » 25.08.2006 (Пт) 12:14

Если это неправильно - то почему тогда работает?

Без понятия, ЧТО и КАК у тебя работает.

Что по твоему делает этот код?
Код: Выделить всё
redim anyarray(anycount)
anycount = 0


Какую литературу читать? Большинство ссылок в соответствующем топике мертво

Думаю, в Москве полно книжных магазинов (даже специализированные тут не нужны - обычные сойдут), где можно купить книги по основам ВБ

"Лучшая книга про VBA - та, которую напишешь ты сам".

Прежде чем писать книги, надо для начала алфавит узнать
подписи нет и не будет

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

Сообщение Bagathur » 25.08.2006 (Пт) 12:29

У меня нету Redim, а что делает anycount = 0 я выше написал. И, по-моему, это действительно так.
А про алфавит можно так же сказать - лучший букварь - это тот, который напишешь ты сам.
Вообще по-моему ненужная полемика какая-то.
Сколько я бы искал одно-единственное слово "Erase" в книге на 400 страниц? Конечно, я бы в конце-концов его нашёл, но кто виноват, что раньше у меня получилось с anycount = 0 и результат меня устроил?
Если в этом есть какая-то ошибка, грозящая фатальными последствиями - подскажи пожалуйста какая. Если хочешь - пришлю процедур, где это действительно работает.
'Til the blood on your hans is the blood of the King!

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

Сообщение alibek » 25.08.2006 (Пт) 12:39

Bagathur писал(а):Если в этом есть какая-то ошибка, грозящая фатальными последствиями - подскажи пожалуйста какая. Если хочешь - пришлю процедур, где это действительно работает.

Ты не понимаешь, как это работает.
Для тебя этот код будет неким мистическим заклинанием, которое то работает, то не работает, причем объяснить этого ты не сможешь.
В этом и есть основная ошибка.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение inq » 25.08.2006 (Пт) 12:54

а что делает anycount = 0 я выше написал. И, по-моему, это действительно так.

ты сильно ошибаешься

Вообще по-моему ненужная полемика какая-то.

Абсолютно ненужная ибо если человек не понимает ОСНОВ (да, именно основ, дело не в незнании erase али еще какого оператора или функции) и на недвусмысленные намеки все-таки получить хоть немного самообразования - отвечает - "а на мне это надо и так хорошо", то дискуссия на этом может быть закрыта.

Сколько я бы искал одно-единственное слово "Erase" в книге на 400 страниц?

То есть оглавлением мы пользоваться тоже не умеем? И открыть главу, посвещенную массивам было б ну очень сложно? Хотя, повторюсь, тебе бы хорошо почитать все с САМОГО начала.

но кто виноват, что раньше у меня получилось с anycount = 0 и результат меня устроил?

"Мне нужно было сходить на работу, но раньше я заметил бутерброд и съел его и результат меня устроил".

ПС прошу не считать весь флуд в этом топике этаким выпендрежем - сам относительно недавно стал изучать ВБ из-за необходимости по работе и многие вещи для меня пока если и не темный лес, то достаточно туманны. но вот почему то начал я его изучать именно по литературе и чением (молчаливым!) информации из инета. А не агрессивным зафлуживанием тематических форумов своей тогдашней бредятиной.
А вот Bagathur даже советы пытается давать.
ННЛ
подписи нет и не будет

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

Сообщение Bagathur » 25.08.2006 (Пт) 13:05

ты сильно ошибаешься


Сказать "ты ошибаешься" может каждый.
Сказать, в чём - единицы.

2Ник: видел я Erase, сразу на него всё исправил.
В качестве результата мне нужно не именно стирание массива.
Вот в папке и подпапках есть 50 файлов. Я записываю их в массив, фильтрую по расширению и открываю либо как файлы Excell, либо как Word.
Закончив их мучать, иду к следующей папке с другим наобором файлов - допустим, их там 30. Я снова записываю их в тот же массив, на место первых 30 предыдущих, а последующие 20 остаются там же. Но открывая эти файлы я иду не от 1 до 50 (как Ubound (Array)), а от 1 до 30 (как значение fcount, равное 30), и открываю как раз нужные мне 30 файлов.
Я написал, как это по-моему работает - причём работает всегда. И никакого шаманства здесь нет.
Последний раз редактировалось Bagathur 25.08.2006 (Пт) 13:16, всего редактировалось 1 раз.
'Til the blood on your hans is the blood of the King!

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

Сообщение alibek » 25.08.2006 (Пт) 13:09

Если бы ты продемонстрировал желание учиться, тебе бы объяснили, в чем. И даже прочитали бы краткую пояснительную лекцию.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение inq » 25.08.2006 (Пт) 14:03

Bagathur
вот ты расстроишься, когда файлов в папке окажется 52...
подписи нет и не будет

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

Сообщение Bagathur » 25.08.2006 (Пт) 15:55

Да и по 120 тыс бывало - ничего, не расстраивался.
Перед занесением в массив стоит как раз Redim Preserve
Если бы я знал как выкладывать тут файлы - положил бы уже давно, чтобы вы:
1. Показали мне пальцем, где именно и почему я не прав
2. Как НА САМОМ ДЕЛЕ работает то, что получилось, и где там шаманские методы
3. Оставили свои попытки макнуть меня лицом в грязь из-за того лишь, что я сделал что-то нетрадиционным способом.

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

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 25.08.2006 (Пт) 17:33

Bagathur писал(а):Если бы я знал как выкладывать тут файлы - положил бы уже давно...


А зачем файлы, ты код выложи.

Если позволишь, на мой взгляд твоя главная проблема (в данном случае) - это неправильное использование терминов (вероятно все же от непонимания). Думаю, если бы ты сразу сказал (или поправился позже, признав ошибку или смену тактики), что хочешь обнулять счетчик, а не массив, то не было бы спора. А ты вместо этого [с пьяным упрямством] споришь с теми, кто потратил свое время, отвечая на заведомо некорректный вопрос. Да еще выдаешь перл за перлом.
Привет,
KL

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

Сообщение Bagathur » 25.08.2006 (Пт) 17:56

Код длинный и путанный, трудно выделить нужное так, чтобы смысл не терялся.
Но ты прав. Виноват я - вопрос на самом деле звучал "как удалять все значения из массива", и правильный ответ на него дал Инк - "erase". Я же никак не мог понять почему они смеются над тем, что я сделал, если оно работает, причём быстро и правильно.
На самом деле я хотел именно обнулять массив, но вместо этого получилось обнулять счётчик - в обоих случаях результат выходит как раз тот, который был нужен.
А неправильное использование терминов... ещё пару недель назад я вообще не знал что такое массив. Теперь немного о них знаю, и наверное получше, чем если бы просто прочитал в книжке с тем, чтобы забыть половину уже через минуту.
'Til the blood on your hans is the blood of the King!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 25.08.2006 (Пт) 20:00

Bagathur писал(а):...
Перед занесением в массив стоит как раз Redim Preserve
...

Зачем Preserve, если тебе массив все равно очищать?

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

Сообщение Bagathur » 26.08.2006 (Сб) 1:31

Рррр...! :(
Договорились же, что fcount=0 не очищает массивы?)
Намекните, как выкладывать тут файлы - и я покажу вам форму, где это работает.
'Til the blood on your hans is the blood of the King!

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

Сообщение GSerg » 26.08.2006 (Сб) 1:41

Мы и так можем догадаться, где это работает.
Более правильным от этого оно не станет.
А если ты сам не нашёл, как выкладывать файлы, ну... ну поищи, это правда несложно...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Bagathur » 26.08.2006 (Сб) 13:12

Вот, вроде нашёл как выкладывать файлы.
В коде формы ищите FNu=0 и fcount=0 - как раз "псевдообнуление" массивов.
Вложения
Files.xls
Одна форма, без автозапуска.
(128.5 Кб) Скачиваний: 50
'Til the blood on your hans is the blood of the King!

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 26.08.2006 (Сб) 22:58

Привет Bagathur,

Я не очень тебя расстрою, если скажу, что все то же самое достигается след. кодом?

Код: Выделить всё
Option Explicit
Sub test()
    Dim arrFiles As Variant, strFilter As String
    Dim strTitle As String, strMsg As String, i As Long
   
    strFilter = "Text Files (*.txt),*.txt,Excel Files (*.xls),*.xls,Word Files (*.doc),*.doc"
    strTitle = "Hello World!"
   
    arrFiles = Application.GetOpenFilename(strFilter, 2, strTitle, , True)
   
    On Error GoTo ExitSub
    For i = 1 To UBound(arrFiles)
        If strMsg <> "" Then strMsg = strMsg & Chr(13)
        strMsg = strMsg & Dir(arrFiles(i))
    Next i
    MsgBox "Open: " & Chr(13) & Chr(13) & strMsg
    On Error GoTo 0
   
    ' а здесь остальные манипуляции с файлами
   
ExitSub:
End Sub


Кстати, прочитав описание главной задачи, предоставленное тобой в начале, прихожу к твердому выводу, что это надо делать через Слияние (MailMerge). Практически все манипуляции с текстом нужно производить еще в Excel с помощью формул (инициалы и др.), а также с использованием UDF (падежи, перевод цыфр в слова). Числовые форматы и форматы дат нужно делать в Word, правя код вручную непосредственно в введенных полях.

Часть информации найдешь здесь:

http://homepage.swissonline.ch/cindymei ... rgFram.htm
http://www.gmayor.com/formatting_word_fields.htm

Думаю также, что тебя заинтересуют след. странички (да и сайты целиком):

John Peltier: http://peltiertech.com/Excel/XL_PPT.html
Chip Pearson: http://www.cpearson.com/excel/optimize.htm
Ole Erlandsen: http://www.erlandsendata.no/english/
Charles Williams: http://www.decisionmodels.com/calcsecretsj.htm
Bob Philips: http://www.xldynamic.com/source/xld.EarlyLate.html
John Walkenbach: http://j-walk.com/ss/excel/tips/index.htm
Karl Pedterson: http://vb.mvps.org/samples/
Ron de Bruin: http://www.rondebruin.nl/tips.htm
Daniel Josserand: http://dj.joss.free.fr/

и масса других... :-)
Привет,
KL

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

Сообщение Bagathur » 27.08.2006 (Вс) 1:26

Привет)
Нет, нисколько не расстроишь, всё ОК)
Моя форма позволяет просто указать директорию и сразу распечатать из неё все файлы .doc и .xls, включая те, что находятся во всех директориях более низкого уровня. Обычный же диалог открытия файлов такого не позволяет, поэтому в итоге я от него отказался и попытался сделать свой. Теперь 2-3 кликнув мышью и нажав ей же одну кнопку можно наплодить кучу страниц :)
Плюс у меня есть возможность формирования-редактирования списка открываемых-распечатываемых файлов "вручную".
Но всё же на главный вопрос ты так и не ответил -
Способно ли "обнуление" массивов при помощи FNu=0 и fcount=0 вызвать какие-то ошибки? Конечно, я уже давно поставил вместо этого Erase, но всё таки...?

Слияние конечно отличная возможность Office, и теперь я её достаточно часто использую (спасибо тем, кто посоветовал в самом начале топика), но бывают случаи, когда даже этого недостаточно - например, когда правишь присланный тебе по почте документ на 100 страниц. Делать из него документ слияния и растаскивать поля намного дольше и трудней, чем использовать банальную автозамену.
'Til the blood on your hans is the blood of the King!

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 27.08.2006 (Вс) 4:54

Привет Bagathur,

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


Ну хозяин-барин :-)

Bagathur писал(а):Плюс у меня есть возможность формирования-редактирования списка открываемых-распечатываемых файлов "вручную".


При беглом тестировании первое, что режет глаз - это возможность многократно добавлять в список один и тот же файл

Bagathur писал(а):Но всё же на главный вопрос ты так и не ответил -
Способно ли "обнуление" массивов при помощи FNu=0 и fcount=0 вызвать какие-то ошибки?.


Вообще то я в данном споре не участвовал :-), но [опять таки бегло] так, как ты используешь массив, работать должно. Хотя память ты расходуешь по-варварски. Ну и код у тебя в общем конечно "спагетти" - черт ногу сломит. Так что я после 10 мин вникания сдался.

Bagathur писал(а):но бывают случаи, когда даже этого недостаточно - например, когда правишь присланный тебе по почте документ на 100 страниц. Делать из него документ слияния и растаскивать поля намного дольше и трудней, чем использовать банальную автозамену.


На все случаи жизни кода не напишешь. Если твоя задача решается банальной автозаменой в неизвестном тебе файле на 100 стр., то то, о чем ты говорил вначале (падежи, инициалы, форматы дат и т.д.) полная белиберда. И конечно в этом случае речь о Слиянии также не идет. Как я уже упоминал ранее, проблема не в коде (или не столько в нем), а в коммуникации :-(
Привет,
KL

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

Сообщение Bagathur » 27.08.2006 (Вс) 13:10

Спасибо, Лапинк! Похоже, ты единственный, кто меня понял и поддержал.
Насчёт спагетти... я наверное уже и сам до конца не знаю, где там и что - но, опять же, вспоминаю анекдот про программиста и его сына :)
Возможность многкратного добавления в список одного и того же файла уже убрал, спасибо за хинт :)
'Til the blood on your hans is the blood of the King!

Пред.

Вернуться в VBA

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

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

    TopList