Проблема следующая: Есть надстройка, которая при открытии файлов обновляет их. Занимает этот процесс разное время на разных файлах. После того, как надстройка закончила работу, должен запуститься скрипт, который сохраняет и закрывает книгу.
Мне необходимо как-то указать vba/vbs скрипту, что надстройка закончила работу и можно сохранять и закрывать файл. Сейчас просто стоит фиксированная задержка, что не является хорошим решением.
Пока что придумал два варианта решения проблемы: 1. Сравнивать текущее время с временем последнего изменения файла + 5-10 секунд. К сожалению, не смог нагуглить возможно ли вообще получить эту информацию. DateLastModified возвращает дату последнего сохранения файла. Поэтому если изменить ячейки в книге сейчас, все равно возвращается дата последнего сохранения. Грубо говоря: В 20:00 открыли файл, в 20:10 внесли изменения в ячейку, книгу не сохраняли. Как можно получить это время 20:10?
2. Проверять загрузку процессора. Во время работы надстройки cpu загружает до 30%, по окончанию падает до 1%. Тоже пока сложности с этим.
Возможно, кто-то может подсказать еще какое-то решение? В идеале хочу реализовать это в рамках именно vbs скрипта, но если поможете подсказать решение хотя бы в vba, то мне будет легче нагуглить как это натянуть на vbs. На крайний случай можно использовать и vba решение.
Нужно при соблюдении условия проигрывать звук, пока условие не прекратит выполнятся. Важная деталь: изменения на листе происходят через ссылки на соседний лист и обработке этой информации То есть, если из соседнего листа передалась новая инфа, и условие начало соблюдаться на нашем листе, то нужно, чтобы начала бить тревога.
Ранее работал этот код
Лист:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If [g22] <> "" And [g22] > [h22] Then
tada = True
Call ZZZ
Else
tada = False
End If
End Sub
Модуль:
Код
Public tada As Boolean
Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
Sub ZZZ()
If tada Then
mciExecute ("Play C:\Windows\Media\tada.wav")
Application.OnTime Now + 1 / 24 / 60 / 10, "ZZZ"
End If
End Sub
Возможно, это можно решить, переместив код Листа в Книгу, сделав WorkBook_SheetChange, но я не могу найти, как в if добавить ссылку на ячейки на листе, то есть, чтобы было что-то вроде:
Код
If [Лист2!g22] <> "" And [Лист2!g22] > [Лист2!h22] Then
Также пытался это решить путем создания функции, которая играет звук при соблюдении условия. Но ее проблема в том, что она проигрывает звук всего 1 раз. Чтобы играла дальше, нужно менять что-то на листе.
Пытался это решить следующим образом:
Код
Private Declare Function sndPlaySound Lib "WINMM.DLL" Alias _ "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As _ Long) As Long
Const SND_SYNC = &H0
Const SND_ASYNC = &H1
Const SND_NODEFAULT = &H2
Const SND_LOOP = &H8
Const SND_NOSTOP = &H10
Код
Function SoundMe() As String
SoundName$ = "c:\windows\tada.wav"
wFlags% = SND_ASYNC Or SND_LOOP
x% = sndPlaySound(SoundName$,wFlags%)
End Function
Звук играет непрерывно, но проблема в том, что играет и тогда, когда условие уже не выполняется. И как отключить его - не совсем понимаю. Точнее я сделал еще 1 функцию, которая проигрывает звук без параметра snd_loop, но тогда этот звук проигрывается каждый раз, когда что-то меняется вручную на листе.
Есть Файл "NewExcelFile.xls", который отдельным скриптом раз в минуту (или другое время) обновляется (а точнее переписывается)
И есть мой файл "Test.xlsm"
Мне нужно в файле Test брать актуальные данные из файла NewExcelFile. На крайний случай можно просто в него копировать данные из файла раз в 15-30 секунд.
Сейчас если я ссылаюсь на ячейки из NewExcelFile, то они не обновляются, пока не откроешь NewExcelFile. Постоянно держать его открытым я не могу, в таком случаи скрипт не может пересоздать этот файл.
Почему-то бывают проблемы с подвисанием экселя при попытке клацнуть в строку формул/вставить данные/изменить тип вставки/протяжки формул и тд. Жду от 5 до 30-60 секунд, пока эксель протупит.
Комп не слабый, ничем не загружен. Возникает и в свежесозданных документах, где данных практически нету
Гуглил, пытался отключать аппаратное ускорение по совету - не помогло. В 2003 ворде да на 7 винде проблем таких не было, но возвращаться на них не хочу.
Может, есть популярные причины таких проблем и что-то посоветуете?
Нужно, чтобы макрос всегда делался в конкретной книге эксель (Test 2) Все работает верно, пока не открываешь какой-то другой эксель документ. В этом случаи я получаю сообщение, что не найден лист "Рынок". Мне же нужно, чтобы в файле Test 2 макрос выполнялся всегда, даже когда я работаю с другими документами excel.
Добавление строчки Set Wb = Workbooks("Test 2.xlsm") привело лишь к тому, что макрос не работает, если файл называется по-другому, но проблему не решил - при открытии еще любого эксель файла выдает ошибку о том, что не находится нужный лист "Рынок"
Module 1
Скрытый текст
Option Explicit
Dim dtNext As Date Dim dtSiguiente As Date
Sub CreateOrUpdateQueryTable() Dim ws As Worksheet Dim qt As QueryTable Dim Wb As Workbook
Dim strQTName As String
Application.DisplayAlerts = False strQTName = "MyQueryTable" Set Wb = Workbooks("Test 2.xlsm") Set ws = Worksheets("Рынок")
On Error Resume Next Set qt = ws.QueryTables(strQTName)
qt.Refresh BackgroundQuery:=False On Error GoTo 0 Application.DisplayAlerts = True End Sub
Механизм работы: Есть внешний источник данных с сайта в интернете. На ресурсе размещена динамически обновляемая таблица, которая тянется в эксель. Обновление в экселе ежеминутное (поставил бы чаще, но возможности такой в экселе не нашел).
Проблема: Иногда сайт, с которого тянется таблица - лежит. Иногда на сайте нету инфы в этой таблице.
В обеих этих случаях я получаю уведомление от экселя, что либо сайт лежит, либо что данных нету. И пока я не нажму "ок" - эксель не будет обновлять данные. А это большая проблема, потому что данные нужно собирать постоянно.
Что хочу: Чтобы не выскакивало уведомление об ошибках получения данных - я о них знаю. Я хочу, чтобы эксель продолжал каждую минуту пытаться тянуть инфу с сайта.
На данный момент я просто юзаю сторонний софт, который тыкает по этой кнопке "ок" - но хотелось бы избавиться от этого костыля.
Я много дней мучал поиск, но похожей проблемы нигде не нашел, по-этому надеюсь на вашу помощь. Заранее спасибо!