excel vba替换一个特定范围内多个Chr(xx)

gab6jxml  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(182)

在我的代码中有这样一段,我必须从一个范围中删除一些字符。
我可以使用.Replace方法,而不是循环遍历范围内每个单元格中的每个字符,对吗?

  • 不能使用正则表达式。*
Dim subst_ni As Range: Set subst_ni = ActiveSheet.Range("G2", ActiveSheet.Range("G" & ActiveSheet.Rows.Count).End(xlUp))
With subst_ni
    .Replace What:=Chr(65), Replacement:="@"
    .Replace What:=Chr(69), Replacement:="@"
    .Replace What:=Chr(73), Replacement:="@"
    .Replace What:=Chr(79), Replacement:="@"
    .Replace What:=Chr(85), Replacement:="@"
    .Replace What:=".", Replacement:=vbNullString
    .Replace What:="/", Replacement:=vbNullString
    .Replace What:=":", Replacement:=vbNullString
    .Replace What:=";", Replacement:=vbNullString
End With

但是,我有几个替代品做相同的范围。
我遇到的问题是Chr(xx)部分,在这里我有机会删除范围值的不可打印位,使用XX作为**“0到31**,127,129,141,143,144,157”和其他一些我不能使用的特定字符。
我们如何才能用更好的方式编写它,而不是为每个XX编写一行代码?

h7wcgrx3

h7wcgrx31#

你现在编写代码的方式可能已经足够高效了(这取决于你要处理的数据集的大小),你可能正在寻求的是将代码块提取到它自己的子例程中,这样你就可以在多个范围上执行相同的操作。
如果是这样的话,创建一个模块并将代码放入一个新的子例程中。

  • (我还添加了一个您所问的0到31的示例,不包括0和1,因为它们与.Replace不匹配)*
Public Sub CleanRange(ByRef TheRange As Range)
    
  With TheRange
    
    .Replace What:=Chr(65), Replacement:="@"
    .Replace What:=Chr(69), Replacement:="@"
    .Replace What:=Chr(73), Replacement:="@"
    .Replace What:=Chr(79), Replacement:="@"
    .Replace What:=Chr(85), Replacement:="@"
    .Replace What:=".", Replacement:=vbNullString
    .Replace What:="/", Replacement:=vbNullString
    .Replace What:=":", Replacement:=vbNullString
    .Replace What:=";", Replacement:=vbNullString
    
    'example of iterating through a range of characters
    For x = 2 To 31
      .Replace What:=Chr(x), Replacement:="@"
    Next x
    
  End With
  
End Sub

现在你可以使用新的sub CleanRange,方法是将你的range传递给它。

Private Sub CleanAllTheRanges()
  
  With ActiveSheet
    CleanRange .Range("C2", .Range("C" & .Rows.Count).End(xlUp))
  End With
  
  With Worksheets("different sheet name")
    CleanRange .Range("G2", .Range("G" & .Rows.Count).End(xlUp))
  End With
  
  With Worksheets("another sheet name")
    CleanRange Intersect(.Range("G:G"), .UsedRange)
  End With
  
End Sub

相关问题