文本中的 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 对象。最好使用CelmyCell 关于单元格的好点。我有使用我的...的坏习惯(所以我通常会使用“mycell”),因为使用了太多不同的语言并且永远不记得保留了哪些单词! @Scott 大量教科书使用cell - 这不是坏习惯;如果它是保留字,则程序不会运行。 @Scott:不,不是……你一定在想Cellss Alt+F11 > F2 > 搜索Cell

以上是关于文本中的 VBA 选择案例循环的主要内容,如果未能解决你的问题,请参考以下文章

具有多个条件的选择案例函数未循环

VBA如何使用循环直到word文本的结尾?

通过所有循环vba保持选择

VBA循环遍历集合

每个工作表的 VBA 循环

与“选择案例”相结合的循环