#excel #vb.net #windows-10
#excel #vb.net #windows-10
Вопрос:
Я создал приложение в Visual Studios с помощью VB.NET , при загрузке форма загружает электронную таблицу Excel и выполняет набор задач перед сохранением и выходом.
Я могу вручную запустить EXE-файл, щелкнув, но когда я планирую его через встроенный планировщик задач, он ничего не делает. Задача не останавливается или не выдает ошибку, она просто отображается как запущенная, но никогда не запускается
Я провел различные поисковые запросы в сети для получения помощи в этом, но, похоже, я нигде ничего не могу найти. У меня есть другая форма, которая открывает текстовый файл, выполняет свою работу, а затем закрывает текстовый файл, и это работает отлично, поэтому меня это так сильно смущает. Я попытался добавить свой код в текстовый файл и скопировать команды из диспетчера задач текстового файла, но это не работает! Я пришел к выводу, что это как-то связано с Excel, поскольку код отлично работает сам по себе, а планирование отлично работает с формой, которая ссылается на текстовый файл.
Любая помощь или предложения приветствуются
Код ниже
Dim filepath1, filepath3, colcontents, rowcontents, txtfile As String
Dim objExcel, objworkbook As Object
Dim coln, rown, rowval As Integer
Dim obj = CreateObject("Scripting.FileSystemObject")
txtfile = FULLFILEPATH
filepath1 = FULLFILEPATH
filepath3 = FULLFILEPATH
filepath3 = FULLFILEPATH
'Define as getfile filepath
Dim objfile = obj.getfile(filepath1)
If ran = False Then
objExcel = CreateObject("Excel.Application")
objExcel.visible = False
rown = 2
coln = 1
colcontents = "Text"
objworkbook = objExcel.workbooks.open(filepath1)
objExcel.sheets("KPIStock").activate
Do Until colcontents = ""
colcontents = objExcel.cells(1, coln).text
coln = coln 1
Loop
colvalglo = coln
rown = 1
rowcontents = "Text"
'Counts the number of rows that have data in them
Do Until rowcontents = ""
rowcontents = objExcel.cells(rown, 1).text
rown = rown 1
rowval = rown
Loop
rowvalglo = rowval
MsgBox("Limits Found")
If obj.FileExists(filepath4) Then
'If the file exists then delete it
obj.DeleteFile(filepath4)
Else
End If
'Pass values to set variables
colcontents = "Text"
param1 = Nothing
param2 = Nothing
'Define the object as getting a file from the selected filepath
Dim objfile = obj.getfile(filepath1)
objExcel = CreateObject("Excel.Application")
objExcel.visible = False
'Open selected file
objworkbook = objExcel.workbooks.open(filepath1)
colnc = 9
count = 1
'Loop until there are no column contents and then save this column number into a global variable
Do Until colcontents = ""
rown = 2
'Activate the Parameteres sheet
objExcel.sheets("Parameters").activate
colcontents = objExcel.cells(rown, colnc).text
'Set Param1 equal to what is contained in the parameters sheet and cells
param1 = objExcel.cells(rown, colnc).text
rown = 3
'Set Param2 equal to what is contained in the parameters sheet and cells
param2 = objExcel.cells(rown, colnc).text
objExcel.sheets("KPIStock").activate
colpaste = colvalglo - 1
'Header
rown = 1
'Save the contents of the cell into the selected Variable
objExcel.cells(rown, colpaste).value = param1
'Formula
rown = 2
'Save the contents of the cell into the selected Variable
objExcel.cells(rown, colpaste).value = param2
'Increase various variables by 1
colnc = colnc 1
colpaste = colpaste 1
colvalglo = colvalglo 1
count = count 1
Loop
rowvalglo = rowvalglo - 2
'Copy all of added data and paste to the bottom
With objExcel
.range(.cells(2, colvalglo - count), .cells(2, colvalglo)).copy
.range(.cells(2, colvalglo - count), .cells(rowvalglo, colvalglo)).pastespecial
End With
'Set specific cell range to a certain colour
With objExcel
.range(.cells(1, colvalglo - count), .cells(1, colvalglo - 65)).Interior.Color = System.Drawing.ColorTranslator.ToOle(Color.LightCyan)
End With
'Set specific cell range to a certain colour
With objExcel
.range(.cells(2, colvalglo - count), .cells(rowvalglo, colvalglo - 65)).Interior.Color = System.Drawing.ColorTranslator.ToOle(Color.LightYellow)
End With
'Set specific cell range to a certain colour
With objExcel
.range(.cells(1, colvalglo - 65), .cells(1, colvalglo - 30)).Interior.Color = System.Drawing.ColorTranslator.ToOle(Color.LightGreen)
End With
'Set specific cell range to a certain colour
With objExcel
.range(.cells(2, colvalglo - 65), .cells(rowvalglo, colvalglo - 30)).Interior.Color = System.Drawing.ColorTranslator.ToOle(Color.LightSalmon)
End With
'Set specific cell range to a certain colour
With objExcel
.range(.cells(1, colvalglo - 30), .cells(1, colvalglo - 3)).Interior.Color = System.Drawing.ColorTranslator.ToOle(Color.LightSteelBlue)
End With
'Set specific cell range to a certain colour
With objExcel
.range(.cells(2, colvalglo - 30), .cells(rowvalglo, colvalglo - 3)).Interior.Color = System.Drawing.ColorTranslator.ToOle(Color.GhostWhite)
End With
'Copy all of added data and paste as values
With objExcel
.range(.cells(2, colvalglo - count), .cells(rowvalglo, colvalglo)).copy
.range(.cells(2, colvalglo - count), .cells(rowvalglo, colvalglo)).Pastespecial(-4163, -4142, True, False)
End With
'Save Output workbook to Filepath4
objExcel.ActiveWorkbook.SaveAs(filepath4)
objworkbook.Close
objExcel.Quit
objExcel = Nothing
objworkbook = Nothing
'Set updated Boolean to TRUE
updated = True
rowval = rowval 1
'Display message box informating the task has now been complete and to review as required
MsgBox("Defined columns have now been added, please review")
Комментарии:
1. вполне может быть. Используете ли вы COM-взаимодействие для доступа к Excel? Это часто немного неудобно, если выполняется как автоматизированный процесс. Он никогда не предназначался для этого. Лучше использовать библиотеку, которая напрямую взаимодействует с самим файлом Excel (в отличие от приложения). Но это только предположение. Возможно, вам нужно добавить в свое приложение улучшенные выходные данные для ведения журнала / отладки, чтобы вы могли видеть, что на самом деле происходит не так. А также покажите нам некоторый соответствующий код, чтобы мы могли понять, что вы делаете и как вы это делаете.
2. Теперь добавлен полный код
![]()
3. Хорошо, как я и подозревал, вы взаимодействуете с приложением Excel, а не с файлом Excel. Таким образом, вы автоматизируете действия Excel, как если бы пользователь открыл его на экране перед ними. Этот сценарий не подходит для запуска в качестве запланированной задачи, которая, конечно, не является пользовательской средой. Скорее всего, он где-то зависает или вылетает (у меня есть опыт работы с этим в очень старом приложении, которое я должен был поддерживать, и пытался сделать что-то подобное). Кроме того, использование инструмента с графическим интерфейсом, такого как MsgBox, в непользовательской среде также не имеет особого смысла, вам лучше записать в файл журнала или что-то в этом роде.
4. Я не знаю, работаете ли вы с файлами .xls или .xlsx, но в Интернете вы можете найти библиотеки, которые взаимодействуют с каждым из них напрямую, открывая сам файл, и не зависят от приложения Excel. Я бы посоветовал переписать код, используя один из них. Если вы используете .xlsx, вам, вероятно, будет легче найти подходящий (а также бесплатный один раз, поскольку сам формат файла открыт).
5. В настоящее время у меня нет никакого опыта работы с библиотеками таким образом, поэтому я посмотрю, что смогу найти в сети
![]()