Я работаю над макросами PCOMM-VBA уже пару месяцев.Эта проблема в основном происходит с каждым макросом, который я пишу.Хотя не во всех случаях, когда я пытаюсь запустить макрос.
, я весьма подозреваю, что источником проблемы является PCOMM, который не успевает за Excel, поэтому некоторые части кода будут пропущены.Однако, прочитав пару постов, я чувствую, что у Excel могут возникнуть проблемы с циклами и активными таблицами в моем коде.Я не уверен, что является причиной проблемы, но я надеюсь, что вы можете направить меня к ответу.
Цель макроса - обновить адрес электронной почты поставщиков.Чтобы выбрать поставщиков, я создал шаблон, который содержит код поставщика и пару дополнительных сведений вместе с адресом электронной почты, которые необходимо загрузить (4 столбца с простым .xls)
Поэтому будьте краткими: Когда я запускаю код в F8, код проходит без ошибок.Когда я пытаюсь запустить его в F5, компилятор пропускает некоторые строки и делает бесконечный цикл (так как запрошенные данные никогда не появятся в поле) или в худшем случае фактически обновляет его с неверными данными.
Вот фактический код:
Sub email_upload()
Dim appExcel As Excel.Application
Dim appWb As Excel.Workbook
Dim appWs As Excel.Worksheet
'This part creates a connection between an existing PCOMM session and Excel
Set autECLConnMgrObj = CreateObject("PCOMM.autECLConnMgr")
Set autECLOIAObj = CreateObject("PCOMM.autECLOIA")
Set autECLSessionObj = CreateObject("PCOMM.autECLSession")
Set autECLPSObj = CreateObject("PCOMM.autECLPS")
Set autECLConnList = CreateObject("PCOMM.autECLConnList")
autECLOIAObj.SetConnectionByHandle (autECLConnList(1).Handle)
autECLPSObj.SetConnectionByHandle (autECLConnList(1).Handle)
autECLConnList.Refresh
'Opens the template where the supplier codes are in (normal .xls)
With Application.FileDialog(1)
.Title = "Please select a file to import!"
.AllowMultiSelect = False
If .Show <> -1 Then
Exit Sub
End If
FileSelected = .SelectedItems(1)
End With
fileName = FileSelected
Set appExcel = Excel.Application
Set appWb = appExcel.Workbooks.Open(fileName:=fileName)
Set appWs = appWb.Worksheets("input")
appExcel.Visible = True
appWb.Worksheets("input").Activate
With appWs
autECLOIAObj.WaitForAppAvailable
'Loop thru every row in the template worksheet
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row Step 1
'Start system navigation in AS/400
autECLPSObj.SetCursorPos 6, 23
autECLPSObj.SendKeys Cells(i, "A")
autECLPSObj.WaitForAttrib 6, 23, "00", "3c", 3, 10000
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SendKeys "[enter]"
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SendKeys "[pf13]"
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SendKeys "[pf10]"
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SetCursorPos 13, 24
autECLPSObj.SendKeys Cells(i, "B")
autECLPSObj.WaitForAttrib 13, 24, "00", "3c", 3, 10000
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SendKeys "[enter]"
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SendKeys "[pf8]"
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
If Cells(i, "C") = "" Then
autECLPSObj.SetCursorPos 13, 21
autECLPSObj.SendKeys "1"
autECLPSObj.WaitForAttrib 13, 21, "00", "3c", 3, 10000
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
Else
autECLPSObj.SetCursorPos 13, 21
autECLPSObj.SendKeys Cells(i, "C")
autECLPSObj.WaitForAttrib 13, 21, "00", "3c", 3, 10000
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
End If
autECLPSObj.SetCursorPos 21, 1
autECLPSObj.SendKeys Cells(i, "D")
autECLPSObj.WaitForAttrib 21, 1, "00", "3c", 3, 10000
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SendKeys "[pf8]"
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SendKeys "[pf12]"
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
autECLPSObj.SendKeys "[pf12]"
autECLOIAObj.WaitForInputReady
autECLOIAObj.WaitForAppAvailable
Next i
End With
appWb.Close
MsgBox ("Input done!")
End Sub