2014-10-28 87 views
0

我從A2:A34與它不同的名字,我需要複製到範圍E9:E14的數據範圍。我只需要複製和粘貼唯一的名稱(我不需要同名的雙精度)。我敢肯定,使用嵌套For Next循環的路要走,但我遇到麻煩外環轉到下一次迭代。現在,這只是給我的姓氏在在E9:14重複範圍A2:A34。我正在研究使用Exit For,但是當我在代碼中添加了外部循環時,迭代但內部循環從2開始。嵌套的for next循環:外環不遍歷

任何與此有關的幫助將不勝感激。謝謝! 下面是我的代碼:

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 
+0

看來你的數據永遠是在非常特殊的格式,因爲你知道的唯一值的確切數量迭代通。如果是這樣,爲什麼不直接將列表複製到列E,然後使用內置的「刪除重複」從數據菜單? – 2014-10-28 03:04:36

+0

如果沒有一些樣本數據,想要查看你想要做什麼是非常困難的。最簡單的做法是調試(調試)並找出它爲什麼沒有達到預期的效果。例如,也許一個「IF」沒有像你期望的那樣進行評估。 – 2014-10-28 03:05:40

+0

感謝您的回覆。我一直在進行,問題是,一旦ELSEIF語句爲真,它複製第一個名字,它會迭代,但外部循環不會。因此,一旦發生這種情況,for rowCount下的第一個if語句將變爲true,並將第二個唯一名稱粘貼到表上的同一位置。 – arooney88 2014-10-28 03:20:17

回答

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 
+0

這對我所需要的很好。非常感謝。 n變量計數器是我錯過的。 – arooney88 2014-10-28 03:47:05

+0

我有點困惑的一件事是'For tableCount = 9 to 9 + n'。如果將'n = n + 1'離開代碼,它將不會迭代到下一個rowCount,而是被卡在tableCount循環中? – arooney88 2014-10-28 12:29:21

+0

我剛剛選擇了9作爲值,因爲你說你想要在單元格E9開始範圍。通常,您將設置n = 1,然後For循環將從1到n。如果取出n = n + 1,n將始終爲0,並且tableCount將始終爲9.由於已達到退出條件(tableCount = 9 + 0),因此內部For循環將運行一次且僅運行一次。具有rowCount的外部For循環仍然會迭代,但由於沒有編碼,因此無法分辨。您可以通過在下一個tableCount和Next rowCount之間插入一個「MsgBox(rowCount)」來測試它。 – 2014-10-29 03:41:47

0

看來您對您的目標的描述與代碼不符。

您是從複製(以簡化位)山坳對col E. 山坳是否已經ê包含數據?如果不是,爲什麼第一個「如果」要查看某個單元格是否爲空? 如果是,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 

把你的問題分解成幾塊,它應該清楚如何寫每一塊。祝你好運。