Независимо от использования QueryTable, вы можете открывать онлайн-файлы прямо из Excel. Ниже приведен пример того, как сгенерировать URL на основе ввода даты и открыть его из Excel.
Option Explicit
Private Const DATE_FMT As String = "yyyymmdd"
Private Const BASE_URL As String = "https://docs.misoenergy.org/marketreports/"
Private Const POSTFIX1 As String = "_sr_nd_is.xls"
Private Const POSTFIX2 As String = "_rt_lmp_final.csv"
Sub Main()
Dim dDataDate As Date, dToday As Date, oWB As Workbook
dToday = CDate(ThisWorkbook.Sheets(1).Cells(6, 1).Value) ' Not sure what to do with this
dDataDate = CDate(ThisWorkbook.Sheets(1).Cells(1, 1).Value) - 1 ' 1 day before it
Set oWB = GetOnlineFile(CreateURL1(dDataDate))
If Not oWB Is Nothing Then
' Do whatever you need with the opened file
oWB.Close
Set oWB = Nothing
End If
End Sub
Private Function GetOnlineFile(URL As String) As Workbook
On Error Resume Next
Set GetOnlineFile = Workbooks.Open(URL)
End Function
Private Function CreateURL1(DataDate As Date) As String
CreateURL1 = BASE_URL & Format(DataDate, DATE_FMT) & POSTFIX1
End Function
Private Function CreateURL2(DataDate As Date) As String
CreateURL2 = BASE_URL & Format(DataDate, DATE_FMT) & POSTFIX2
End Function
Думаю, вам просто нужно вот это:
Process.Start(...);
Process.WaitForExit();
См. Метод на странице MSDN . У него также есть перегрузка, в которой вы можете указать тайм-аут, поэтому вы не можете ждать вечно.
Что касается примера Microsoft: [ https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents? view=netframework-4.8]
Лучший должен был бы установить:
myProcess.EnableRaisingEvents = true;
otherwiese Код будет заблокирован. Также никакие дополнительные свойства не необходимы.
// Start a process and raise an event when done.
myProcess.StartInfo.FileName = fileName;
// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents = true;
// Eventhandler wich fires when exited
myProcess.Exited += new EventHandler(myProcess_Exited);
// Starts the process
myProcess.Start();
// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
$"Exit time : {myProcess.ExitTime}\n" +
$"Exit code : {myProcess.ExitCode}\n" +
$"Elapsed time : {elapsedTime}");
}
Использовать Process.WaitForExit
? Или подписаться на событие Process.Exited
, если не хотите блокировать? Если это не дает того, что вы хотите, дайте нам дополнительную информацию о ваших требованиях.
В своем приложении я делаю следующее:
Process process = new Process();
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.ErrorDialog = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.Start();
process.WaitForExit(1000 * 60 * 5); // Wait up to five minutes.
В нем есть несколько дополнительных функций, которые могут оказаться полезными ...
Вы можете использовать ожидание выхода или перехватить свойство HasExited и обновить свой пользовательский интерфейс, чтобы пользователь был «информирован» (управление ожиданием):
System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
//update UI
}
//done
Я думаю, что Process.WaitForExit должно быть именно тем, что вы ищете.