嵌套用于下一循环:外循环不迭代

时间:2014-10-28 02:13:35

标签: excel-vba for-loop nested-loops vba excel

我有A2:A34的一系列数据,其中包含各种名称,我需要将其复制到范围E9:E14。我只需要复制和粘贴唯一的名称(我不需要同名的双倍)。我很确定使用嵌套的For Next循环是可行的方法,但是我无法让外循环进入下一次迭代。现在,这只是给我A2:A34中重复范围E9:14中的姓氏。我正在研究使用Exit For但是当我在代码中添加它时,外部循环迭代但内部循环从2开始。

对此的任何帮助将不胜感激。谢谢! 以下是我的代码:

Sub FillTable()
  Dim tableCount As Integer
  Dim rowCount As Integer

  For tableCount = 9 To 13
    If Range("E" & tableCount).Value = "" Then
      For rowCount = 2 To 34  
        If Range("E" & tableCount).Value = Range("A" & rowCount).Value Then

        ElseIf Range("E" & tableCount).Value <> Range("A" & rowCount).Value Then
          Range("E" & tableCount).Value = Range("A" & rowCount).Value
        End If
      Next rowCount
    End If
  Next tableCount
End Sub

2 个答案:

答案 0 :(得分:0)

我不确定VBA是否真的需要这个确切的问题,但希望下面的代码会有所帮助。我切换循环,以便您只迭代大型名称列表一次,然后遍历第二个列表检查重复项。我还添加了一个变量,因此它允许超过5个唯一名称(与tablecount为9到13时不同)。

公平警告 - 这是一种快速简便的解决方案。既不优雅也不优化。

Sub FillTable()

Dim tableCount As Integer
Dim rowCount As Integer
Dim n As Integer

n = 0
For rowCount = 2 To 34

  For tableCount = 9 To 9 + n
      If Range("E" & tableCount).Value = Range("A" & rowCount).Value Then
        ' name already found, break out of loop
        Exit For
      ElseIf Range("E" & tableCount).Value = "" Then
        Range("E" & tableCount).Value = Range("A" & rowCount).Value
        n = n + 1
      End If
  Next tableCount

Next rowCount

End Sub

答案 1 :(得分:0)

您的目标描述似乎与代码不符。

您正在复制(简化一下)col A到col E. col E是否已包含数据?如果没有,为什么第一个&#34;如果&#34; stmt查看某个单元格是否为空? 如果是,E已经包含数据,那么您想要遍历E以查看E是否已包含新名称。 我还要指出,E有6个名字的空间(按照你的规格),而来源有33个名字。

在不了解您的目标的情况下,我不会建议真正的代码,但也许是一种解决问题的方法: 创建仅执行非常简单的小事的函数。例如,也许最简单,一个函数来查看名称是否已在列表中。请注意,我假设使用最高行的值,请务必定义它,无论是14还是某个计数器。

Function Is_Name_Already_Present_in_E( Name-to-check as String ) As Bool
   Is_Name_Already_Present_in_E = False               ; Default we'll return if don't find name.
   for r = 9 to highest-so-far-used
      if Name-to-check = Range( "E" & r ).value then  ; If found name in list,
         Is_Name_Already_Present_in_E = true          ; then return true.
         exit function
      end if
   next r
end function                                          ; If scan whole list, and not found,false.

我确定存在一些语法错误,但它们应该很容易解决。

然后,创建一个简单的函数将你的新名字添加到E.也许就像(当心假设!):

Function Add_New_Name_To_List( Name  as string ) as bool
   if highest_used_so_far >= 14 then
      Error "No room to insert name:" & Name & ". Rejected."
      Add_New_Name_To_List = false
      exit function
   end if
   highest_used_so_far = highest_used_so_far + 1
   range( A & h_u_s_r ).value = Name
   Add_New_Name_To_List = true
exit function

然后,你的主要变得非常简单(假代码示例,因为我不知道你的意图):

for r = 2 to 34
    if not Is_Name_Already_Present_in_E( range( "A" & r ).value ) then
        if not Add_Name_to_E( range( "A" & r ).value ) then
           ... what to do if add fails. ...
        end if
    end if
next name

将问题分解成碎片,应该清楚如何写出每一件。祝你好运。