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