2017-01-02 86 views
1

我想在excel中編寫一個宏來創建一個新的列,並將這些狀態劃分爲這些區域。我一直得到運行時錯誤13Excel宏幫助。基於數組創建一個新列。

這是我到目前爲止的代碼。

Sub Region() 

Dim Pacific As Variant 
Pacific = Array("WA", "OR", "ID", "CA", "NV", "AZ", "NM", "HI", "AK") 

Dim Continental As Variant 
Continental = Array("AR", "IA", "CO", "KS", "LA", "MS", "MT", "ND", "NE", "OK", "SD", "UT", "WY") 

Dim SouthEast As Variant 
SouthEast = Array("GA", "AL", "FL", "SC", "KY", "TN") 

Dim Midwest As Variant 
Midwest = Array("MN", "WI", "IL", "IN", "MI", "OH") 

Dim NorthAtlantic As Variant 
NorthAtlantic = Array("ME", "NH", "MA", "RI", "CT", "VT", "NY", "PA", "NJ", "DE", "MD", "WV", "VA", "NC") 

Dim Texas As Variant 
Texas = Array("TX」) 

Dim state As String , result As String 
score = Range("F1").Value 
If state = Pacific Then 
    result = "PACIFIC" 
ElseIf state = Continental Then 
    result = "Continental" 
ElseIf state = SouthEast Then 
    result = "SouthEast" 
ElseIf state = Midwest Then 
    result = "Midwest" 
ElseIf state = NorthAtlantic Then 
    result = "North Atlantic" 
ElseIf state = Texas Then 
    result = "Texas" 
Else 
    result = "fail" 
End If 
Range("Z1").Value = result 
End Sub 

回答

1

AFAIK,搜索數組中的字符串的發生在VBA中不是一件簡單的事情。您必須使用循環,或可能使用WorksheetFunction.Match

更簡單的方法可以完全避免陣列 - 你的代碼可以很容易地重構使用Select Case聲明:

Sub Region() 

    Dim state As String , result As String 
    state = Range("F1").Value 

    Select Case state 
     Case "WA", "OR", "ID", "CA", "NV", "AZ", "NM", "HI", "AK" 
      result = "PACIFIC" 
     Case "AR", "IA", "CO", "KS", "LA", "MS", "MT", "ND", "NE", "OK", "SD", "UT", "WY" 
      result = "Continental" 
     Case "GA", "AL", "FL", "SC", "KY", "TN" 
      result = "SouthEast" 
     Case "MN", "WI", "IL", "IN", "MI", "OH" 
      result = "Midwest" 
     Case "ME", "NH", "MA", "RI", "CT", "VT", "NY", "PA", "NJ", "DE", "MD", "WV", "VA", "NC" 
      result = "North Atlantic" 
     Case "TX" 
      result = "Texas" 
     Case Else 
      result = "fail" 
    End Select 

    Range("Z1").Value = result 
End Sub 

注意:您也有兩個代碼問題。

  1. 你有

    score = Range("F1").Value 
    

    當我想你的意思是

    state = Range("F1").Value 
    
  2. 你有"TX」而不是"TX" - 我不知道是否在你的版本會導致出現問題的Excel,但它在我的。


要使其適用於F列所有單元格擴展此功能,您將需要遍歷每一行:

Sub Region() 

    Dim state As String , result As String 
    Dim lastRow As Long 
    Dim r As Long 

    With ActiveSheet 
     lastRow = .Cells(.Rows.Count, "F").End(xlUp).Row 
     For r = 1 to lastRow 

      state = .Cells(r, "F").Value 

      Select Case state 
       Case "WA", "OR", "ID", "CA", "NV", "AZ", "NM", "HI", "AK" 
        result = "PACIFIC" 
       Case "AR", "IA", "CO", "KS", "LA", "MS", "MT", "ND", "NE", "OK", "SD", "UT", "WY" 
        result = "Continental" 
       Case "GA", "AL", "FL", "SC", "KY", "TN" 
        result = "SouthEast" 
       Case "MN", "WI", "IL", "IN", "MI", "OH" 
        result = "Midwest" 
       Case "ME", "NH", "MA", "RI", "CT", "VT", "NY", "PA", "NJ", "DE", "MD", "WV", "VA", "NC" 
        result = "North Atlantic" 
       Case "TX" 
        result = "Texas" 
       Case Else 
        result = "fail" 
      End Select 

      .Cells(r, "Z").Value = result 
     Next 
    End With 
End Sub 
+0

非常感謝!這工作就像一個魅力! –

+0

嘿,對不起還有一個問題。我如何使這適用於整個列? –

+0

@TimothyYelverton - 答案更新,以演示一個循環 – YowE3K

-1

EM爲什麼不,叔您使用Access創建的表像你一樣,然後鏈接到你要創建(我相信有你寫的代碼的一些實際使用)其他的邏輯表這就是爲什麼訪問被創建在第一個地方......

+2

這個答案並不能真正幫助的OP。回答關於Excel的(完全有效的)問題「使用Access,這就是爲什麼創建它」實際上並不是非常有用。 – MichaelMilom

+0

MichaelMilom哈哈... – Nicolas