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

Excel 嵌套用于下一个循环:外部循环不迭代,excel,for-loop,nested-loops,vba,Excel,For Loop,Nested Loops,Vba,我有一系列A2:A34的数据,其中包含各种名称,我需要复制到范围E9:E14。我只需要复制和粘贴唯一的名称,我不需要相同名称的两个。我非常确定使用嵌套的For Next循环是一种方法,但是我很难让外部循环进入下一个迭代。现在,这只是在E9:14中重复的A2:A34范围内给我的姓氏。我正在考虑使用Exit For,但是当我在代码中添加它时,外部循环迭代,但是内部循环在2开始 在此方面的任何帮助都将不胜感激。谢谢 下面是我的代码: Sub FillTable() Dim tableCount A

我有一系列A2:A34的数据,其中包含各种名称,我需要复制到范围E9:E14。我只需要复制和粘贴唯一的名称,我不需要相同名称的两个。我非常确定使用嵌套的For Next循环是一种方法,但是我很难让外部循环进入下一个迭代。现在,这只是在E9:14中重复的A2:A34范围内给我的姓氏。我正在考虑使用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

我不确定这个问题是否真的需要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

您对目标的描述似乎与代码不匹配

您正在从复制以简化a列到E列。 列E是否已包含数据?如果不是,为什么要先使用If-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
然后,您的main变成了一个非常简单的伪代码示例,因为我不知道您的意图:

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

把你的问题分成几部分,应该清楚如何写每一部分。祝你好运。

看来你的数据总是以非常特定的格式出现,因为你知道要迭代的唯一值的确切数目。如果是这样,为什么不直接将列表复制到E列,然后从数据菜单中使用内置的“删除重复项”呢?如果没有一些示例数据,很难想象您要做什么。最简单的方法是一步一步地调试,找出它为什么没有达到预期效果。例如,可能IF的评估结果与您预期的不符。感谢您的回复。我已经仔细研究过了,问题是,一旦ELSEIF语句为true并且它复制了第一个名称,它就会迭代,但外部循环不会。因此,一旦发生这种情况,For rowCount下的第一个if语句将变为true,并将第二个唯一名称粘贴到表上的同一位置。如果您只想在A2:34范围内搜索唯一值并将其粘贴到它旁边的B列中,代码的一部分会是什么样子?这对于我所需要的非常有用。谢谢。n变量计数器是我缺少的。有一件事我有点困惑,那就是For tableCount=9到9+n。为什么如果将n=n+1保留在代码之外,它将不会迭代到下一行计数,而是陷入tableCount循环?我选择9作为值,因为您说过希望范围从单元格E9开始。通常设置n=1,然后For循环从1到n。如果去掉n=n+1,n将始终等于0,tableCount将始终等于9。内部For循环将运行一次且仅运行一次,因为已达到退出条件tableCount=9+0。带有rowCount的外部For循环仍将迭代,但您无法判断,因为没有任何代码。您可以通过在Next tableCount和Next rowCount之间插入一个MsgBoxrowCount来测试它。