0

几个月来我一直在研究 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
4

0 回答 0