|
0 / 0 / 0
Регистрация: 25.09.2008
Сообщений: 21
|
|
Запись/чтение файлов в Excel25.09.2008, 05:42. Показов 10894. Ответов 15
Метки нет (Все метки)
Задача такая:
Есть: Строка (фиксированного формата) в Excel-листе, которая периодически обновляется (перезаписывается). Нужно: Добавлять эту строку в txt-файл так, чтобы потом без лишнего геморроя: а) извлекать ее обратно в новый лист вместе с 'историческими' данными; б) последняя строчка в txt-шке должна быть первой в формируемом новом листе. Еще вопрос: Как 'вытащить'/изменить переменные окружения, типа, текущего каталога и т.п.? Буду признателен за помощь (читаемый код ![]() PS: Не пинайте сильно Я ведь только учусь
0
|
|
| 25.09.2008, 05:42 | |
|
Ответы с готовыми решениями:
15
Excel, чтение и запись ячеек
Чтение данных из txt файла и запись их в Excel |
|
Comanche
|
|
| 25.09.2008, 18:54 | |
|
Ну не то чтобы 'пну', но замечание сделаю: книжку-то купить можно было, а?! Даже если взять самую плохую книжку по VB(VBA), то такая вещь, как операции с дисковыми файлами, расписана в ней всегда подробнейшим образом (включая ввод/вывод, определение текущего каталога, каталога приложения, чтение списка всех файлов из каталога и т.д.). Как 'дёрнуть' чё-нить с листа Экселя в строковую переменную или в клипборд (и потом обратно на лист) - тоже описано. Время на поиск в книжке этой информации - 2 минуты; на прочтение и усвоение - от 5 до 30 минут; на откатку на примерах (в своём коде) - от 5 до 15 минут. Итого получаем 50 минут по максимуму. Вы же поместили свой топик в 05.05, а сейчас уже 18.10 ...
|
|
|
0 / 0 / 0
Регистрация: 25.09.2008
Сообщений: 21
|
|
| 26.09.2008, 01:32 [ТС] | |
|
[2 Comanche] Ну ты кроме как наезжать, лучше бы присоветовал что-нить... Проблема в том, что я живу НЕ в огромном городе (где обычно можно найти нормальную литературу) и приличных магазинов у нас тут не наблюдается. Я так и сделал сегодня, как ты говорил. Пошел в обед, купил единственную книгу, в которой хоть что-то про VBA написано. Называется она: 'Марион Коттингхэм - Excel 2000 - руководство разработчика, Изд-во BHV'. Я до сих пор не могу оправиться от шока. Блин, ну это просто фуфло, когда автор на протяжении всей книги учит записывать макросы, а затем пытается в них разбираться - никакой 'фундаменталки'. Завтра пойду обратно сдам (283р за такое дерьмо жалко). Я это к чему, а к тому, что столкнулся с VBA, да и с программированием совсем недавно (девченке помогаю), поэтому и не шарю нифига в этой области. Я вообще на врача учусь...
0
|
|
|
Comanche
|
||||||
| 26.09.2008, 15:02 | ||||||
|
// Строка (фиксированного формата) в Excel-листе
Считаем, что вы имели в виду ЯЧЕЙКУ на листе Эксель, в которой содержатся некоторые (возможно строковые) данные. // Добавлять эту строку в txt-файл так, чтобы потом без лишнего геморроя // извлекать ее обратно в новый лист вместе с 'историческими' данными Добавлением занимается процедура Workbook_SheetChange, которая определяет, какая ячейка и на каком листе текущей книги изменилась. Под 'историческими' данными понимаем дату/время изменения ячейки (для примера). Извлечением обратно в текущий лист занимается Sub Main ('без лишнего геморроя'). // последняя строчка в txt-шке должна быть первой в формируемом новом листе Это достигается засчёт сортировки полученной таблички в конце Итак, см. ниже код, который надо поместить в конкретную книгу (в которой - на одном из листов - содержится изменяемая ячейка):
|
||||||
|
0 / 0 / 0
Регистрация: 25.09.2008
Сообщений: 21
|
|
| 28.09.2008, 07:00 [ТС] | |
|
Блин, вааще все просто супер! Доступно и понятно! Ты лучший!! Спасиба тебе! Немного адаптировал под себя и заработало!
![]() Только еще один вопрос остался... Нашел я тут такую фишку, как QueryTables. Типа, все работает, получаем инфу из веба. Только вот не пойму, как сделать чтобы после обновления (не важно какого... ручками из 'Данные'->'Обновить данные', или просто программно '.Refresh') запускался макрос. Нашел в хелпе что-то типа QueryTable_AfterRefresh, но вот никак не получается с этим зверем что-либо сделать. Куда его запихать?
0
|
|
|
Comanche
|
|
| 28.09.2008, 13:35 | |
|
// не получается с этим зверем что-нибудь сделать
В чём проблема? В том, что это событие 'не отлавливается' (т.е. то, что ты в него пихаешь, не выполняется), или в том, что ты не знаешь, как вызвать из своего кода другой макрос? |
|
|
0 / 0 / 0
Регистрация: 25.09.2008
Сообщений: 21
|
|
| 28.09.2008, 14:32 [ТС] | |
|
Да, проблема в том, что такое событие, как обновление листа через веб не 'отлавливается'.
(Смысл сейчас в том, чтобы после веб-запрса запускался макрос. На изменения в листе вызванные этим запросом Workbook_SheetChange(.) не реагирует)
0
|
|
|
Comanche
|
|
| 28.09.2008, 17:46 | |
|
А если попробовать событие WorkSheet_Calculate()?
Кроме того, в 'Поиске' Экселевского хелпа задай строку поиска 'Using Events with the QueryTable Object' - там чё-то написано про особенности использования событий у энтой самой QueryTable. Также можешь поискать по 'QueryTable Object Events'. Вообще странно, что _AfterRefresh не пашет... Этой штуке, по идее, должно быть наплевать, откуда именно берутся внешние данные - с Веба, из Аксесса, с другого листа, - неважно. Попробуй, кстати, вместо Веба брать данные с какой-нить Аксессовской простенькой базы (наваяй её за пару минут). Если и тогда событие _AfterRefresh работать не будет, то это явный глюк. То, что WorkSheet_Change(...) может не работать, - фиг бы с ним: в конце концов, при изменении данных на листе по F9 (расчёт листа) оно не работает, - в хелпе так и написано. Но вот _AfterRefresh, если тому же хелпу верить, работать должно! А ты на msdn.microsoft.com не искал про какие-нить глюки у QueryTable? |
|
|
0 / 0 / 0
Регистрация: 25.09.2008
Сообщений: 21
|
|
| 28.09.2008, 20:01 [ТС] | |
|
2Comanche
Да, там действительно что-то написано про Using Events with the QueryTable Object. Только я не понимаю, что куда пихать... Надо создать какой-то 'class module', что-то там прописать... Для меня это пока все темный лес - надо брать книжку и начинать с самых основ. Только жаль, что время уже поджимает.Ты не мог бы посмотреть, что тут к чему... Я так понимаю, для знающего перца все будет тривиально. Глянь, плиз, расскажи что конкретно надо сделать, чтоб после обновления запускать еще какой-нить макрос...
0
|
|
|
Comanche
|
|
| 28.09.2008, 21:59 | |
|
Ты сначала скажи: ты пробовал вместо Веба использовать Аксессовскую базу (т.е. MDB-файл)? _AfterRefresh с ней тоже не работает?
Плюс к этому кинь свой код мне на мыло (pc-er@mail.ru) - так легче разбираться будет. |
|
|
Comanche
|
|||||||||||
| 29.09.2008, 02:43 | |||||||||||
|
1. Запусти ВБА-редактор. Через Ctrl+R открой дерево проекта. Добавь в проект 'Модуль Класса' (меню 'Insert').
2. Выбери в дереве проекта созданный класс, нажми F4, дай ему имя ClsModQT вместо Class1. 3. В код модуля класса вставь следующее:
и реальной таблицей с внешними данными, имеющейся на одном из листов книги. А при каждом авто-обновлении этой таблицы - будет выполняться некий код (в моём примере - просто MsgBox). Можно вместо ActiveSheet.QueryTables(1) поставить WorkSheets('Лист1').QueryTables(1). А вместо Workbook_Open() - завязаться на кнопку на рабочем листе или на пункт меню. Откатал пример на MDB-базе в качестве источника внешних данных - вроде всё работает. Хотя... для меня всё же загадка, почему оно стало работать, только когда я заменил (интуитивно) Dim clsQueryTable на Static clsQueryTable. Я, конечно, объяснил это в тексте выше, но всё равно что-то здесь не так. Разве может быть такой большой scope у static-переменных?! Если кто понимает, о чём это я, - объясните, please. |
|||||||||||
|
Comanche
|
|
| 29.09.2008, 11:29 | |
|
А можно и проще:
Сделай 'зеркальный' лист в своей книге, на который 'отобрази' таблицу внешних данных. Т.е. выдели на исходном листе свою QueryTable, нажми Copy, перейди на зеркальный лист, иди в 'Правка' | 'Специальная вставка' | нажми 'Вставить связь'. На зерк. листе появится тоже самое. Вот теперь у этого нового листа можешь, наконец, задействовать событие Worksheet_Calculate(): оно БУДЕТ иметь место при изменениях этого листа, вызванных изменением связанных данных на первом листе. Т.е. у первого листа ни _Change, ни _Calculate не работают при обновлении QueryTable, а у зеркального - _Calculate работает: и за этот отрадный факт мы и цепляемся. Кстати, зеркальный лист можешь сделать скрытым: работать оно всё равно будет. Это гораздо проще, чем предыдущее решение. Однако, оба решения грешат одним и тем же: у них нет аргумента вроде Target типа Range (как у Worksheet_Change()), а стало быть, нет простого и удобного механизма понять, какая именно ячейка изменилась. Если тебе надо в txt-файл вываливать только реальные изменения, то, скорее всего, тебе придётся завести массивчик для 'старых значений', и при каждом обновлении пробегаться по таблице листа, поячеечено сравнивая её с соответствующими элементами массива: если изменилась ячейка из числа тех, которые надо мониторить, то заменяем 'старые' значения в массиве на новые значения соотв. ячеек и выполняем некий код. Если ячейка всего лишь одна, то ситуация упрощается. Понятно, что у работоспособности этого варианта есть определённый предел, связанный с размером таблицы. Если таблица не с десять экранов и если твой комп не хуже Целерона, то, думаю, этот перебор особо сильно никого не напряжёт: всё равно у периода обновления QueryTables миним. величина = 1 минуте. |
|
|
0 / 0 / 0
Регистрация: 25.09.2008
Сообщений: 21
|
|
| 01.10.2008, 14:40 [ТС] | |
|
2Comanche [просто так]
Блин, вааще все супер!! Ты лучший! Я разобрался, все работает!!! )
0
|
|
|
0 / 0 / 0
Регистрация: 22.08.2011
Сообщений: 7
|
|
| 30.08.2011, 12:49 | |
|
ругался тут с одним модератором на одном сайте, пытаясь объяснить ему что на вопросы народа нужно обязательно отвечать, причем желательно развернуто, касаясь всех вопросов топика Ж). сейчас наткнулся на эту ветку и сразу для нашел для себя ответы на несколько важных для меня вопросов. - вот так вот надо отвечать на вопросы, господа. COMANCHI молодец, так держать! На таких людях и держится форум!
0
|
|
|
0 / 0 / 0
Регистрация: 12.06.2015
Сообщений: 1
|
|
| 12.06.2015, 11:17 | |
|
Comanche
в сообщении 4 Не отображается весь код сообщения. Приложите пожалста файликом txt или как нить там. Спс заранее.
0
|
|
|
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
|
|
| 12.06.2015, 11:34 | |
|
Я думаю тот код уже 7 лет как по...ерен... Почти 7....
И Cipher тоже столько же тут не был...
0
|
|
| 12.06.2015, 11:34 | |
|
Помогаю со студенческими работами здесь
16
Excel: чтение в массив полей таблицы Excel? Экспорт нескольких Excel файлов в один Excel файл Копировать листы из файлов Excel в один файл Excel Хранение файлов и файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа Excel Чтение и запись данных с имен Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|