Вы можете попробовать использовать окна, чтобы убить процесс.
command = "Taskkill /IM calc.exe /F"
proc = subprocess.Popen(command)
или
import os
os.system("taskkill /im Calculator.exe /f")
Если вы хотите быть уверенным, попробуйте рекурсивное убийство !!
def kill_process(proc):
# Check process is running, Kill it if it is,
# Try to kill the process - 0 exit code == success
kill = "TaskKill /IM {} /F".format(proc)
res = subprocess.run(kill)
if res == 0:
return True # Process Killed
else:
kill_process(proc) # Process not killed repeat until it is!
kill_process('Calculator.exe')
Если вы хотите продолжить с ActiveSheet
, просто удалите «+ 1».
Предупреждение : эти коды действительны, если у вас только имеется рабочих листов в рабочей книге, а не диаграммы, диалоговые окна или что-то еще.
Я почти всегда использую только рабочие листы в своих книгах, поэтому я никогда не узнал о проблеме Index , на которую JohnyL ссылается в на свой ответ на этот вопрос .
Sub ContinueThroughWorksheets()
Dim i As Long
With ThisWorkbook
For i = .ActiveSheet.Index + 1 To .Worksheets.Count
Debug.Print .Worksheets(i).Name
Next
End With
End Sub
Sub ContinueThroughWorksheets2()
Dim i As Long
Dim j As Long
With ThisWorkbook
Select Case .ActiveSheet.Index
Case 1
j = 1
Case .Worksheets.Count
Exit Sub
Case Else
j = .ActiveSheet.Index + 1
End Select
For i = j To .Worksheets.Count
Debug.Print .Worksheets(i).Name
Next
End With
End Sub
Существуют три листовых коллекции: Worksheets
, Charts
и DialogSheets
. Свойство Index
этих коллекций возвращает индекс коллекции Sheets
, а не фактический индекс в коллекции для конкретного листа.
Скажем, у вас есть четыре листа:
В этом случае Worksheets("Sheet3").Index
возвращает 4
, когда реальный индекс равен 3
. Нижняя строка никогда не полагается на свойство Index
коллекции, относящейся к листу, когда дело доходит до обработки всех листов.
Для решения вашей проблемы вам просто нужно использовать коллекцию Sheets
:
Sub FFF()
Dim x%, sheet As Variant
For x = ActiveSheet.Index + 1 To Sheets.Count
Set sheet = Sheets(x)
'// Do something with sheet
Next
End Sub
Вы можете сделать это таким образом, но учтите, что, как правило, не рекомендуется размещать код на активном листе или активных ячейках, так как они могут быть легко изменены и ваш код может работать некорректно.
Лучшим способом было бы хранить (кодовые) имена листов, обработанных в другом месте, и проходить по вашим листам, исключая эти имена.
Sub x()
Dim i As Long
For i = ActiveSheet.Index To Worksheets.Count
MsgBox Worksheets(i).Name
Next i
End Sub