2015-11-30 76 views
2

我想運行一個選擇案例,當一個單元格在某個範圍內更改,以便在輸入特定文本時運行宏。對於「F50」,我已經爲單個單元(和後面的代碼)工作,但是當我嘗試在幾行後使用相同樣式的代碼時,它不起作用。VBA選擇案例運行時錯誤13

Private Sub Worksheet_Change(ByVal Target As Range) 

If Not Intersect(Target, Range("F50")) Is Nothing Then 
Select Case Range("F50") 
    Case "MPR-9A": Resize9 
    Case "MPR-8A": Resize8 
    Case "MPR-6A": Resize6 
    Case "MPR-3A": Resize3 
End Select 
End If 

If Not Intersect(Target, Range("F4:F45")) Is Nothing Then 
Select Case Range("F4:F45") 
    Case "M-20A": M20A 
    Case "M-2X20A": M2X20A 
    Case "M-20A-SP": M20ASP 
End Select 
End If 

End Sub 

我想有這樣的代碼運行時我在F4的範圍內把一個新的價值的地方:F45。當輸入該值時,該案例將檢查運行哪個宏。 這些宏在另一個工作表上覆制一個範圍,並將其粘貼到剛剛觸發宏的單元格(其中還包括右側和下方的幾個單元格),而且這些宏在我手動觸發它們時運行良好。

我去了複製/粘貼路線,因爲我放棄了計劃A,試圖合併剛剛接收到新值的單元格與其下面的1或3,然後將文本輸入到單元格右側。如果我應該回到嘗試這條路線,我很樂意嘗試並避免複製和粘貼。

+2

'範圍(「F4:F45」)'是測試的情況,但不會返回一個字符串 - 這正是您要測試的對象。如果您在該塊中添加了「Case Else:Debug.Assert False」,代碼將停止,您將看到。 –

+0

這是因爲您需要禁用事件並在某處添加一個'DoEvents' - 我假設您正在調用的子工具在某個時間點更改工作表,因此代碼會調用它自己 - 導致無限循環,從而導致Excel崩潰。使用事件觸發器的常見缺陷。 –

+0

感謝您的幫助!我嘗試了宏人的解決方案,但它使Excel崩潰。我也試過R3UK的解決方案,但它返回了一個運行時錯誤。我編輯了操作系統,以澄清宏在發生什麼 –

回答

-1

您可以使用Range("F4:F45").Cells(1,1)其實際上是F4單元格。

但我想,你要測試的就是Target.Value,小區改變了值:

Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.Cells.Count > 1 Then Exit Sub 

If Not Intersect(Target, Range("F50")) Is Nothing Then 
Select Case Range("F50") 
    Case "MPR-9A": Resize9 
    Case "MPR-8A": Resize8 
    Case "MPR-6A": Resize6 
    Case "MPR-3A": Resize3 
End Select 
End If 

If Not Intersect(Target, Range("F4:F45")) Is Nothing Then 
Select Case Target.value 
    Case "M-20A": M20A 
    Case "M-2X20A": M2X20A 
    Case "M-20A-SP": M20ASP 
End Select 
End If 

End Sub 
+1

'Target'或'Cells(1,1)'只會返回一個值_single_ cell - 但是OP想要測試一個_range_ cells,所以這不會起作用。這些選項可以從正在測試的單元格中創建一個字符串,或者循環遍歷該範圍內的每個單元格並單獨進行測試。 –

+1

@MacroMan:是的,我也評論你的回答!等待OP澄清! – R3uK

+0

@MacroMan:顯然,我的解決方案做到了這一招,並且OP消失了!^^ – R3uK

2

使用此爲您的第二塊,而是如果你只是要檢查是否存在這些字符串:

If Not Intersect(Target, Range("F4:F45")) Is Nothing Then 
tempStr = Join([TRANSPOSE[F4:F45)]," ") 
    Select Case True 
     Case InStr("M-20A", tempStr): M20A 
     Case InStr("M-2X20A", tempStr): M2X20A 
     Case InStr("M-20A-SP", tempStr): M20ASP 
    End Select 
End If 

如果要逐個檢查每個單元格,那麼你將通過具有循環範圍:

If Not Intersect(Target, Range("F4:F45")) Is Nothing Then 
    For Each cell In Range("F4:F45").Cells 
     Select Case cell.Value 
      Case "M-20A": M20A 
      Case "M-2X20A": M2X20A 
      Case "M-20A-SP": M20ASP 
     End Select 
    Next 
End If 
+0

等待OP澄清,但這可能會產生多個關於範圍內的先前值的情況。但是用'Instr'很好地使用'Select',我從來沒有見過這種情況,但可能有一天會用到它! Thx爲此! – R3uK

+2

我已經基本翻轉了「Select Case」的邏輯 - 您可以將測試用例設置爲「True」,然後創建您想測試的任何表達式 - 有時比使用「If/ElseIf」塊更簡單,並且_always_更快。 –