VBA在文本中select案例循环

尝试遍历一系列单元格,并根据另一个单元格中的文本值为它们分配一个标签。 所以如果单元格J2 =“这个文本”然后单元格A2 =“这个标签”

截至目前我不断得到一个运行时错误号码424,说明所需的对象

Private Function getPhase(ByVal cell As Range) As String Select Case cell.Text Case "Text1" getPhase = "Label1" Case "Text2" getPhase = "Label2" End Select End Function Sub setPhase() Dim cycle As Range Dim phase As Range Set cycle = Range("J2:J10") Set phase = Range("A2:A10") For Each cell In phase.Cells phase.Text = getPhase(cycle) Next cell End Sub 

你已经得到了你的答案:)让我做一些解释,在我的post虽然:)

你不能使用这个。

 phase.Text = getPhase(cycle) 

.Text是一个Readonly属性。 即你不能写信给它,只能从中读取。 你必须使用.Value

其次,如果您从同一行中选取值,则不需要定义第二范围。 你可以随时使用.Offset属性。 看到这个

 Option Explicit Sub setPhase() Dim rng As Range, phase As Range Set phase = Sheets("Sheet1").Range("A2:A10") For Each rng In phase rng.Value = getPhase(rng.Offset(, 9)) Next End Sub Function getPhase(ByVal cl As Range) As String Select Case cl.Value Case "Text1" getPhase = "Label1" Case "Text2" getPhase = "Label2" End Select End Function 

另外, Select Case cell.Text没有任何问题,因为你只是从中读取数据。 但是,使用.Value总是很好。 原因是.Value属性返回单元格的实际值,其中.Text属性返回屏幕上显示的文本。 Excel的更高版本中的文本的限制约为8k个字符。 另一方面.Value可以存储多达32k个字符。

我改变了循环。 这假定两个范围是相同的长度

 Function getPhase(ByVal cell As Range) As String Select Case cell.Value Case "Text1" getPhase = "Label1" Case "Text2" getPhase = "Label2" End Select End Function Sub setPhase() Dim cycle As Range Dim phase As Range Set cycle = ThisWorkbook.Sheets("myexample").Range("J2:J10") Set phase = ThisWorkbook.Sheets("myexample").Range("A2:A10") Dim i As Integer For i = 1 To phase.Cells.Count phase.Cells(i).Value = getPhase(cycle.Cells(i)) Next i End Sub 

…或者如siddharthbuild议使用一个公式。

或者通过VBA做公式:

 Sub setPhase() Dim phase As Range Set phase = Excel.ThisWorkbook.Sheets("Sheet1").Range("A2:A10") phase.Value = "=IF(J2=""Text1"",""Label1"",IF(J2=""Text2"",""Label2"",""""))" End Sub 

这是我的版本:

 Private Function getPhase(ByVal cell As Range) As String Select Case cell.Text Case "Text1" getPhase = "Label1" Case "Text2" getPhase = "Label2" End Select End Function Sub setPhase() Dim cycle As Range Dim phase As Range Set cycle = ActiveSheet.Range("b2:b10") Set phase = ActiveSheet.Range("A2:A10") For Each cell In phase.Cells cell.Value = getPhase(cycle.Cells(cell.Row, 1)) Next cell End Sub