使用 Excel VBA 和 iMacros 循环
Looping with Excel VBA and iMacros
好了,场景是这样的。
我正在努力将客户列表从一个后端经理移到另一个后端经理,但不幸的是我正在从中移动列表的那个人(其中包含地址、phone 数字、关于帐户的注释和关于每个客户喜欢什么的一般信息)无法导出到 excel。因此,这开始变得乏味。我的下一步是为 IE 尝试一种叫做 iMacros 的东西。
我现在设置它的方式非常简陋。我有 15 个 imacro 宏(每个需要复制的字段一个)。第一个更改页面以便进行循环并提取第一个字段。其他 14 个中的每一个一次只提取一个字段。
我试图将单个客户的所有信息放在一行中,只是将收集的信息分开列。然后去下一行为下一个客户做准备。它目前从第 3 行开始,但如果需要更改,可以。
dim iim1, iret, row
Sub Button1_Click()
Set iim1 = CreateObject("imacros")
iret = iim1.iimInit
iret = iim1.iimDisplay("Submitting Data from Excel")
row = ActiveCell.row
Range("A3").Select
iret = iim1.iimPlay("Login")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
clientloop1
End Sub
Sub clientloop1()
Do Until ActiveSheet.UsedRange.Rows.Count = 4
iret = iim1.iimPlay("Field1")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 1).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field2")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 2).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field3")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 3).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field4")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 4).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field5")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 5).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field6")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 6).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field7")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 7).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field8")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 8).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field9")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 9).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field10")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 10).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field11")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 11).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field12")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 12).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field13")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 13).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field14")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 14).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field15")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
ActiveCell.Offset(1, 0).EntireRow.Range("A1").Select
Loop
End Sub
当我按原样执行代码时,它正确地执行了第一行,但不断覆盖下一个客户端的信息,而不是转到下一行并将其添加到那里。
如果能提供任何帮助,我将不胜感激。我很难过。
很高兴终于加入这个社区,我无法告诉你们有多少次这里的问题与另一个问题相关并帮助我解决问题,哈哈。
对于非常大的客户列表,可以是这个,也可以一次复制并粘贴 1 个。
您还没有递增 'row' 变量。您需要在 "Loop" 之前包含 "row = row + 1",或者如果您真的想使用 Activecell 的想法,您可以在 'Loop' 之前添加 "row = ActiveCell.row"(尽管另一种方式可以使更多感觉并且会更快)
即使您设置行 = ActiveCell.row,这也不会在您 select 一个新单元格时更改行变量。它只是将行变量设置为当时处于活动状态的任何单元格,然后设置该行的值,直到它被更改。
好了,场景是这样的。 我正在努力将客户列表从一个后端经理移到另一个后端经理,但不幸的是我正在从中移动列表的那个人(其中包含地址、phone 数字、关于帐户的注释和关于每个客户喜欢什么的一般信息)无法导出到 excel。因此,这开始变得乏味。我的下一步是为 IE 尝试一种叫做 iMacros 的东西。 我现在设置它的方式非常简陋。我有 15 个 imacro 宏(每个需要复制的字段一个)。第一个更改页面以便进行循环并提取第一个字段。其他 14 个中的每一个一次只提取一个字段。 我试图将单个客户的所有信息放在一行中,只是将收集的信息分开列。然后去下一行为下一个客户做准备。它目前从第 3 行开始,但如果需要更改,可以。
dim iim1, iret, row
Sub Button1_Click()
Set iim1 = CreateObject("imacros")
iret = iim1.iimInit
iret = iim1.iimDisplay("Submitting Data from Excel")
row = ActiveCell.row
Range("A3").Select
iret = iim1.iimPlay("Login")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
clientloop1
End Sub
Sub clientloop1()
Do Until ActiveSheet.UsedRange.Rows.Count = 4
iret = iim1.iimPlay("Field1")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 1).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field2")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 2).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field3")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 3).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field4")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 4).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field5")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 5).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field6")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 6).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field7")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 7).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field8")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 8).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field9")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 9).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field10")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 10).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field11")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 11).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field12")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 12).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field13")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 13).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field14")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
Cells(row, 14).Value = iim1.iimgetlastextract(0)
iret = iim1.iimPlay("Field15")
If iret < 0 Then
MsgBox iim1.iimgetlasterror()
End If
ActiveCell.Offset(1, 0).EntireRow.Range("A1").Select
Loop
End Sub
当我按原样执行代码时,它正确地执行了第一行,但不断覆盖下一个客户端的信息,而不是转到下一行并将其添加到那里。 如果能提供任何帮助,我将不胜感激。我很难过。 很高兴终于加入这个社区,我无法告诉你们有多少次这里的问题与另一个问题相关并帮助我解决问题,哈哈。
对于非常大的客户列表,可以是这个,也可以一次复制并粘贴 1 个。
您还没有递增 'row' 变量。您需要在 "Loop" 之前包含 "row = row + 1",或者如果您真的想使用 Activecell 的想法,您可以在 'Loop' 之前添加 "row = ActiveCell.row"(尽管另一种方式可以使更多感觉并且会更快)
即使您设置行 = ActiveCell.row,这也不会在您 select 一个新单元格时更改行变量。它只是将行变量设置为当时处于活动状态的任何单元格,然后设置该行的值,直到它被更改。