|
|
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Здравствуйте уважаемые гуру! Есть программа на VBA в Excel-е, которая открывает другой xls-файл (2) с данными, обрабатывает их и создает третий xls-файл (3). Файл (2) раньше всегда подавался со стандартным, одним и тем же, именем "Набор.xls". Теперь ситуация поменялась, необходимо приписывать к имени файла число, типа: "Набор-1200.xls" "Набор-1201.xls" "Набор-1202.xls" ... число в имени будет постоянно увеличиваться, а количество файлов, поступающих на обработку, будет разное. Возможно, не всегда цифры будут увеличиваться на единицу. На выходе должны получаться файлы: "Итог-1200.xls" "Итог-1201.xls" "Итог-1202.xls" ... Цифры из имени файла (2) добавляются к имени файлу (3) - это сделать просто. Подскажите, как лучше поступить в данной ситуации? В голову ничего не приходит, кроме как сделать диалог для открытия файла (как это делается в стандартном меню: Файл - Открыть - появляется окно, в котором можно выбрать нужный файл и нажать кнопку "Открыть" или "Отмена"). Что-то типа: Код: plaintext 1. 2. Office 2003 SP2 Rus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 10:38 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, Неоходимо сделать ссылку на библиотеку Tools -> References -> Microsoft Scripting Runtime. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 11:30 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
YudzhinAlex37, Неоходимо сделать ссылку на библиотеку Tools -> References -> Microsoft Scripting Runtime. Это в настройках редактора VBA? Включил. Но и без него работало почему то... YudzhinAlex37, Неоходимо сделать ссылку на библиотеку Tools -> References -> Microsoft Scripting Runtime. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 11:49 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Yudzhin Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Спасибо, сейчас попробую по вашей методике сделать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 11:53 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, Поправочка. Функция ничего не возвращала и исправил "Набор" на "Итог" :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 12:03 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, я бы сделал список файлов в папке, заполняемый с помощью функции Dir и оттуда бы уже доставал файлы для обработки. Плюс хотя бы в том, что меньше действий для юзера и не нарушается логика интерфейса посторонними окнами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 12:04 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
YudzhinAlex37, Поправочка. Функция ничего не возвращала и исправил "Набор" на "Итог" :) Код: plaintext 1. 2. 3. 4. 5. 6. Да, путаницу с Набором и Итогом я заметил, спасибо. А с кодом я поломал бы голову! ;) Не сразу бы понял, в чем дело. Ещё раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 12:21 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
mds_worldAlex37, я бы сделал список файлов в папке, заполняемый с помощью функции Dir и оттуда бы уже доставал файлы для обработки. Плюс хотя бы в том, что меньше действий для юзера и не нарушается логика интерфейса посторонними окнами. Тоже интересная мысль. Да и для пользователей все свелось бы к нажатию один раз на кнопку. А как это реализовать? В цикле просмотреть указанную в коде папку на наличие файлов "Набор-*.xls" (не совсем понимаю, как это осуществить). Номера - в массив. Обработать данные - сохранив в массив. Создать итоговые файлы, закачать в них данные из массива, добавить к имени номер - сохранить. Или проще создать список файлов Набор-*.xls (не знаю, как это делается). Потом поочередно их открывать и обрабатывать. Так лучше будет - меньше памяти используется. Можно пример простой посмотреть как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 12:33 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, 1. Указываешь папку, где лежать "наборные" файлы 2. Прога ищет папку "NewFiles" в папку с твоими "наборными" файлами. Если есть, то удаляет её с потрохами. 3. Создаёт папку "NewFiles". 4. Ищет файлы с расширениями xls, xlsx, xlsm, xlsb. 5. Если находит, выдирает номер "набора" и создаёт полный путь к новому файлу в папке "NewFiles". 6. Копирует "наборный" файл в "итоговый" файл в папке "NewFiles". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 12:34 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, Пропустил объявление переменной fName: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 12:41 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, Скриншот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 12:47 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
YudzhinAlex37, 1. Указываешь папку, где лежать "наборные" файлы 2. Прога ищет папку "NewFiles" в папку с твоими "наборными" файлами. Если есть, то удаляет её с потрохами. 3. Создаёт папку "NewFiles". 4. Ищет файлы с расширениями xls, xlsx, xlsm, xlsb. 5. Если находит, выдирает номер "набора" и создаёт полный путь к новому файлу в папке "NewFiles". 6. Копирует "наборный" файл в "итоговый" файл в папке "NewFiles". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. В целом понятно. А маску к имени можно применить? Дело в том, что я задачу упростил, а реально в папке с программой ещё несколько xls-файлов лежат, которые являются "общими" для всех "наборных" файлов - часть инфы берется и из них и прописывается в "итоговые" файлы. Маска бы помогла отсеять ненужное. Или действительно, прийдется создавать вложенную папку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 12:51 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
YudzhinAlex37, Пропустил объявление переменной fName: Код: plaintext 1. Да, выдало ошибку - прописал, все ОК! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 13:01 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
YudzhinAlex37, ....... For Each aFile In fso.GetFolder(rootFolder).Files sExtension = fso.GetExtensionName(aFile.Name) If sExtension Like "xls*" Then ........ End Sub Срабатывание If sExtension Like "xls* оказывается зависит от регистра! Кто бы подумал! :) Случайно один из файлов был с расширением XLS (прописными буквами). Его-то и пропустил цикл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 13:06 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, "прийдется создавать вложенную папку." Вложенная папка создаётся для того, чтобы там собирались "итоговые файлы". Ты можешь создать любую папку (переменная subFolder ). Сначала прога находит чисто экселевские файлы. После того, как она нашла экселевский файл, мы вытягиваем из него название без расширения (переменная fName ). Вот тут ты и можешь применить маску - оператор Like . Посмотри по документации поподробней. Вот пример (переменная sMask ): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 13:10 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Yudzhin, Чтобы не пропускались "XLS", в самом верху модуля под Option Explicit напиши Option Compare Text ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 13:12 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
YudzhinYudzhin, Чтобы не пропускались "XLS", в самом верху модуля под Option Explicit напиши Option Compare Text Понял! Помогло. Огромное спасибо всем за неоценимую помощь!!! Узнал для себя много интересного и нового. Сегодня же начну переделывать программу. А то меня уже на работе запинали... ;) Но не прощаюсь! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 13:30 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, Пиши! На всякий случай вот тебе ссылка на справку формате chm о FileSystemObject. С тех пора, как я узнал про Windows Scripting, больше никогда не пользовался стандартными средствами VBA. :) Windows Script 5.6 Documentation http://www.microsoft.com/downloads/en/details.aspx?familyid=01592c48-207d-4be1-8a76-1c4099d7bbb9&displaylang=en Windows Script 5.7 for Windows XP http://www.microsoft.com/downloads/en/details.aspx?FamilyID=47809025-d896-482e-a0d6-524e7e844d81&displaylang=en ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 13:48 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Yudzhin, Спасибо. А я по старинке, на Турбо Паскале компилирую ЕХЕ-ник с нужной начинкой. Но возможностей и знаний все равно не хватает! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 14:05 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, С FileSystemObject приятно работать. Тем более что если в VBE сделать ссылку на библиотке Microsoft Scripting Runtime, то заработает AutoComplete - будут выпадать все свойства и методы. Удобно! Но можно и late binding с помощью CreateObject, но тогда AutoComplete'a не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 14:34 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, Кстати, небольшое уточнение. Если у тебя есть ещё символ "-" в названии файла, то лучше воспользовацо функцией InStrRev. Она ищет не слева направо, а справа налево. Учитывая, что номера стоят в конце названия файла, и перед этим номер стоит символ "-", то безопаснее будет использовать InStrRev. Итак, итоговая процедура. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 15:07 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Yudzhin, Работать с FileSystemObject интересно. Посмотрел справочник - свойств много! Надо будет взять на вооружение. Жалко, что не поддерживает доступ к двоичным файлам. Иногда бывает надо. А как легко текст набивать, типа: Код: plaintext 1. 2. 3. 4. Ещё раз огромное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 15:40 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, А зачем ты используешь CreateObject? Нет, ну если ты будешь писать на VBScript, то я согласен. В VBScript - это единственный способ, а вот в VBA ты потеряешь AutoComplete! Лучше сделай в VBE ссылку на библиотеку - и увидишь все свойства и методы. Так проще, чем рыться в справке, да и можешь ошибицо при наборе. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2011, 16:42 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Yudzhin, А как применять fso.OpenTextFile? Пытался открыть файл так: Код: plaintext Код: plaintext Использование Код: plaintext Хотелось бы понять , что что же все-таки делает fso.OpenTextFile, как и когда его применять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2011, 11:49 |
|
||
|
Диалог- "Открыть файл"
|
|||
|---|---|---|---|
|
#18+
Alex37, Читаем текстовый файл и выводим содержимое на экран. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2011, 12:26 |
|
||
|
|

start [/forum/topic.php?fid=61&fpage=134&tid=2177009]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 402ms |

| 0 / 0 |
