【问题标题】:Use User-defined range as input for cell parsing使用用户定义的范围作为单元格解析的输入
【发布时间】:2015-08-13 22:12:33
【问题描述】:

我正在 Excel 2010 中编写一个宏,以便删除列的多个单元格中的换行符。此单元格需要由用户选择。继之前的post 之后,我能够创建一个 InputBox 让用户选择范围,但现在,我无法处理选择范围内的数据。
我之前没有选择范围的代码使用正则表达式解析整个列,以在单元格内的字符串中查找模式并更改其内容。 我用这样的For i To Rows.Count 代码块做到了这一点:

For i = 1 To Rows.Count
 
    If Not IsEmpty(Cells(i, 5).Value) Then
       varString = Sheets(ActiveSheet.Name).Cells(i, 5).Text
       Sheets(ActiveSheet.Name).Cells(i,5).Value=objRegExp.Replace(varString, "$1 ")
    End If
Next i

现在我想替换静态列,以便只处理用户范围。 为了实现这一点,我尝试了这个:

Set selection = Application.InputBox(Prompt:= _
            "Please select a range to apply the remove break lines procedure.", _
                Title:="Remove Line Breaks", Type:=8)
                
If selection Is Nothing Then
    Exit Sub
End If

Set RowsNumber = selection.CurrentRegion -> This line gives me an error: "Object required"
Set RowsNumber = RowsNumber.Rows.Count

For i = 1 To RowsNumber
    If Not IsEmpty(Cells(i, 5).Value) Then 
       varString = Sheets(ActiveSheet.Name).Cells(i, 5).Text 
       Sheets(ActiveSheet.Name).Cells(i, 5).Value = objRegExp.Replace(varString, "$1 ") 'Replace pattern found with regular expression in the same line
    End If
Next i

如何访问 InputBox 返回的范围内的单元格?
我还尝试将RowsNumber 更改为selection.Rows.Count,但是这样,虽然它没有给出错误,但是当我运行调试器时,使用的单元格中包含空白字符串。我认为这是因为我尝试在范围可能较小时访问 row = 5,即如果用户只选择 3 个单元格,则为 3。
我尝试了For Each Next 循环,但又一次,我不知道如何访问selection 范围内的单元格。

【问题讨论】:

  • 尝试设置 RowsNumber = 选择而不是 selection.curentregion。为什么你不能这样做 RowNumber = selection.Rows.Count 这样只有一行
  • 我试过这样做 @99moorem 但它给了我同样的错误'需要对象'

标签: vba excel parsing


【解决方案1】:

您可以使用For Each 循环遍历范围的单元格。

以下是您修改的代码。我把变量Selection的名字改成了rng,因为Selection是Excel库的内置函数,应该避免这个名字。

Sub x()
    Dim rng As Excel.Range
    Dim cell As Excel.Range


    Set rng = Application.InputBox(Prompt:= _
                "Please select a range to apply the remove break lines procedure.", _
                    Title:="Remove Line Breaks", Type:=8)

    If rng Is Nothing Then
        Exit Sub
    End If

    For Each cell In rng.Cells
        If Not IsEmpty(cell.Value) Then
           varString = cell.Text
           cell.Value = objRegExp.Replace(varString, "$1 ") 'Replace pattern found with regular expression in the same line
        End If
    Next cell

End Sub

【讨论】:

  • 哦!我明白了,所以我可以直接将范围作为单元格列表访问,就好像我们正在谈论的数组一样。谢谢@mielk
  • 我阅读了 OP 的代码,因为他正在使用选择而不是尝试设置选择:)
  • 别担心。现在发生了一些奇怪的事情,或者我可能只是 vba 的新手,但我的函数已经准备好了,只有当我使用按钮调用它时它才会做它必须做的事情,但如果我从公式创建者调用它,它会正常执行但它什么都不做
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2016-03-16
相关资源
最近更新 更多