文本中的 VBA 选择案例循环
Posted
技术标签:
【中文标题】文本中的 VBA 选择案例循环【英文标题】:VBA Select Case Loop in Text 【发布时间】:2012-06-28 06:28:57 【问题描述】:尝试遍历一系列单元格并根据另一个单元格中的文本值为它们分配标签。所以如果 Cell J2 = "This Text" Then Cell A2 = "This Label"
截至目前,我不断收到运行时错误编号 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
【问题讨论】:
你试过cell.value
吗?
错误出现在哪一行?
刚试了一下,"phase.Text = getPhase(cycle)"失败
您需要 VBA 吗?您也可以使用 Excel 公式解决此问题。
【参考方案1】:
你已经得到了答案 :) 让我在我的帖子中做一些解释 :)
你不能用这个。
phase.Text = getPhase(cycle)
.Text
是 只读 属性。即您不能写入它,而只能从中读取。你必须使用.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 个字符。
【讨论】:
@Jean-FrançoisCorbett +1 同意;昨晚我只是急于得到我的(不知道为什么,因为我怀疑 OPer 不会将任何标记为答案) 我很喜欢 Offset 的快捷方式...只是rng(0,9)
而不是rng.Offset(0,9)
@whytheq:我最近才开始在 Stack 上回答问题,但它是上瘾的,不是吗!我也同意该快捷方式很好 - 我倾向于不使用它,只是因为我不记得它,但我确实记得 Excel 中的偏移量,因为它在公式中非常重要。
@Siddarth-rout:你的建议绝对是更干净的建议。【参考方案2】:
我改变了循环。这假设两个范围的长度相同
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
...或者正如 siddharth 建议的那样,使用公式。
或者通过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
【讨论】:
phase.value 可能是对的,但现在根本不使用循环范围。 true - 需要进一步编辑 - 肯定需要在循环中使用单元格;否则没有循环 @JulianKnight 然后给我一个 +1 嗯,也许吧。如果你把私人放回去! @JulianKnight:它叫sportsmanship!【参考方案3】:这是我的版本:
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
【讨论】:
+1 自己就是这样做的。同样值得注意的是@Salmonerd 将变量声明为Cell
是不好的做法,因为它是一个预定义的 VBA 对象。最好使用Cel
或myCell
关于单元格的好点。我有使用我的...的坏习惯(所以我通常会使用“mycell”),因为使用了太多不同的语言并且永远不记得保留了哪些单词!
@Scott 大量教科书使用cell
- 这不是坏习惯;如果它是保留字,则程序不会运行。
@Scott:不,不是……你一定在想Cells
和s
?
Alt+F11 > F2 > 搜索Cell
以上是关于文本中的 VBA 选择案例循环的主要内容,如果未能解决你的问题,请参考以下文章