Vba 从单元格中删除字符的最快方法

Vba 从单元格中删除字符的最快方法,vba,excel,Vba,Excel,删除每个单元格字符的最快方法是什么?我有300k行,循环每个单元格并不理想。我试着将文本转换为列,但我需要知道每个单元格中可能有多少个符号。有更好的方法吗 这是我在电话里看到的。时间太长了 For Each destineCell In destinRange cellVal = destineCell.Value If (InStr(cellVal, ", ")) Then removed = Left(cellVal, InStr(cellVal, ", ")

删除每个单元格字符的最快方法是什么?我有300k行,循环每个单元格并不理想。我试着将文本转换为列,但我需要知道每个单元格中可能有多少个符号。有更好的方法吗

这是我在电话里看到的。时间太长了

For Each destineCell In destinRange
    cellVal = destineCell.Value
    If (InStr(cellVal, ", ")) Then
        removed = Left(cellVal, InStr(cellVal, ", ") - 1)
        ActiveCell.Value = removed & " "
    End If
    ActiveCell.Offset(1, 0).Select
Next destineCell
[[更新]] 下面是示例数据的外观

New York, NY, USA
Rome, Italy - Tier 1 City
数据本身各不相同。有时它会有逗号、破折号或两者兼有

编辑

尝试此操作并相应地更改您的范围:

Option Explicit

Sub FindAndReplace()

Dim Arr() As Variant
Arr = Range("A1:A3")

Dim x As Integer

For x = LBound(Arr) To UBound(Arr)
    Arr(x, 1) = Left(Arr(x, 1), InStr(Arr(x, 1), ",") - 1)
Next x
Range("A1").Resize(UBound(Arr), 1) = Arr

End Sub
编辑

尝试此操作并相应地更改您的范围:

Option Explicit

Sub FindAndReplace()

Dim Arr() As Variant
Arr = Range("A1:A3")

Dim x As Integer

For x = LBound(Arr) To UBound(Arr)
    Arr(x, 1) = Left(Arr(x, 1), InStr(Arr(x, 1), ",") - 1)
Next x
Range("A1").Resize(UBound(Arr), 1) = Arr

End Sub

您可以将范围复制到数组中,在数组上迭代替换值,然后粘贴回数组。因此,您将限制Excel recalc调用—在300k上它应该比Range.Replace快光年。以下是一个例子:

Sub fastReplace()

    ' range to run the replace operation on
    Dim rngRepl As Range
    Set rngRepl = ActiveSheet.[a1:a4]

    ' read range into array (it is a 2D array)
    Dim arr()
    arr = rngRepl

    ' do the replace
    Dim i As Long
    Dim j As Long
    For i = LBound(arr, 1) To UBound(arr, 1)
        For j = LBound(arr, 2) To UBound(arr, 2)
            arr(i, j) = Replace(arr(i, j), "o", "a")
        Next j
    Next i

    ' paste array back
    rngRepl = arr

End Sub

您可以将范围复制到数组中,在数组上迭代替换值,然后粘贴回数组。因此,您将限制Excel recalc调用—在300k上它应该比Range.Replace快光年。以下是一个例子:

Sub fastReplace()

    ' range to run the replace operation on
    Dim rngRepl As Range
    Set rngRepl = ActiveSheet.[a1:a4]

    ' read range into array (it is a 2D array)
    Dim arr()
    arr = rngRepl

    ' do the replace
    Dim i As Long
    Dim j As Long
    For i = LBound(arr, 1) To UBound(arr, 1)
        For j = LBound(arr, 2) To UBound(arr, 2)
            arr(i, j) = Replace(arr(i, j), "o", "a")
        Next j
    Next i

    ' paste array back
    rngRepl = arr

End Sub
删除每个单元格字符的最快方法是什么?我有300k行,循环每个单元格并不理想。我试着将文本转换为列,但我需要知道每个单元格中可能有多少个符号。有更好的方法吗

@PNUT基本上删除了42分钟前逗号或-jamandjammie之后的所有内容

@第一个逗号/破折号后的pnuts–37分钟前的JamAndJammies

根据您的问题和您在评论中所说的,最简单和最快的不使用VBA的方法是

设置一个您认为不在数据中的单字母分隔符。假设是。或者你可以选择其他特殊角色?让我们称之为关键字。 按Ctrl+H键打开“查找和替换”对话框并进行替换。查找,并将其替换为关键字。类似地,替换为关键字。 对列执行文本转换,并根据关键字将其拆分。 保留第一列,删除其余列 删除每个单元格字符的最快方法是什么?我有300k行,循环每个单元格并不理想。我试着将文本转换为列,但我需要知道每个单元格中可能有多少个符号。有更好的方法吗

@PNUT基本上删除了42分钟前逗号或-jamandjammie之后的所有内容

@第一个逗号/破折号后的pnuts–37分钟前的JamAndJammies

根据您的问题和您在评论中所说的,最简单和最快的不使用VBA的方法是

设置一个您认为不在数据中的单字母分隔符。假设是。或者你可以选择其他特殊角色?让我们称之为关键字。 按Ctrl+H键打开“查找和替换”对话框并进行替换。查找,并将其替换为关键字。类似地,替换为关键字。 对列执行文本转换,并根据关键字将其拆分。 保留第一列,删除其余列
对于300000个数据点,这两种方法实际上花费了相似的时间,在我的系统上大约是0.5秒

我确实更新了数组代码以处理实际需要的替换,更重要的是测试是否存在要替换的字符串,否则代码将失败

我没有在其他代码中使用额外的列,我可能会在使用此方法之前使用工作表的副本,以便在不影响现有其他数据的情况下删除所有其他列

代码到时间的方法

整理阵列

文本到列


对于300000个数据点,这两种方法实际上花费了相似的时间,在我的系统上大约是0.5秒

我确实更新了数组代码以处理实际需要的替换,更重要的是测试是否存在要替换的字符串,否则代码将失败

我没有在其他代码中使用额外的列,我可能会在使用此方法之前使用工作表的副本,以便在不影响现有其他数据的情况下删除所有其他列

代码到时间的方法

整理阵列

文本到列


或一行VBA,相当于在每个字符串上使用LEFT:

[a1:A300000] = Application.Evaluate("=IF(ISERR(FIND("","",A1:a300000)),A1:A300000,LEFT(A1:A300000,FIND("","",A1:A300000)-1))")

或一行VBA,相当于在每个字符串上使用LEFT:

[a1:A300000] = Application.Evaluate("=IF(ISERR(FIND("","",A1:a300000)),A1:A300000,LEFT(A1:A300000,FIND("","",A1:A300000)-1))")

你想在某些单元格中去掉结尾的逗号?字符串中还有逗号吗?还是只有一个?只需使用一次删除所需内容即可。它甚至可以在一行代码中完成:destinRange.Replace,使用数组而不是重复写入单元格。有关一些示例,请参见。另外,ActiveCell.Offset1、0.Select和ActiveCell.Value=removed&是循环中最慢的东西。@Nathan_Sav我不确定联接/拆分是否比VBA的内置替换快。您的方法只有在对分割数组执行其他操作时才有好处,否则它是次优的。@pnuts询问

一些关键问题。线索就在这里:所以你想在某些单元格的末尾去掉一个逗号?字符串中还有逗号吗?还是只有一个?只需使用一次删除所需内容即可。它甚至可以在一行代码中完成:destinRange.Replace,使用数组而不是重复写入单元格。有关一些示例,请参见。另外,ActiveCell.Offset1、0.Select和ActiveCell.Value=removed&是循环中最慢的东西。@Nathan_Sav我不确定联接/拆分是否比VBA的内置替换快。您的方法只有在对拆分数组执行其他操作时才有好处,否则它是次优的。@pnuts提出了一些关键问题。线索就在那里:让我试试,但这不只是取代,没有空间。。。所以它不会删除逗号后的任何内容,不是吗?是的,它会删除。在这一点上有点不清楚。请添加您希望您的示例在替换后的外观。是的,我刚刚尝试过,它只是替换为零。我希望符号后面的所有内容都被删除。不过速度稍微快一点。@Brian-为什么要调整范围。调整大小?它的大小与您将其复制到阵列中后的大小完全相同。只是重复使用范围。。。我也添加了这个例子——看一看。我也不会假设它只是一列-参见我的示例-它可以在任何范围内工作,甚至是多列的。@LoganReed我只是没有像分配数组时那样放置RangeA1:A3。您可以通过数据类型为Range的变量执行此操作。如果OP需要多个列,为什么要尝试文本到列?让我试试,但这不只是替换,没有空间。。。所以它不会删除逗号后的任何内容,不是吗?是的,它会删除。在这一点上有点不清楚。请添加您希望您的示例在替换后的外观。是的,我刚刚尝试过,它只是替换为零。我希望符号后面的所有内容都被删除。不过速度稍微快一点。@Brian-为什么要调整范围。调整大小?它的大小与您将其复制到阵列中后的大小完全相同。只是重复使用范围。。。我也添加了这个例子——看一看。我也不会假设它只是一列-参见我的示例-它可以在任何范围内工作,甚至是多列的。@LoganReed我只是没有像分配数组时那样放置RangeA1:A3。您可以通过数据类型为Range的变量执行此操作。如果OP在多个列中需要文本,为什么要尝试文本到列?这稍微快一点,但如何删除字符后面的所有内容?replace不起作用您将使用Left,就像您在原始示例中所做的那样,但将它写回数组,而不是单元格。如果它仍然不够快,您的下一个选择是用C编写它并引用DLL…是的,您是对的!眨眼间,这是超快速的。谢谢大家!@是的,你拿错了史蒂夫·乔布斯。速度稍微快一点,但我如何删除角色之后的所有内容?replace不起作用您将使用Left,就像您在原始示例中所做的那样,但将它写回数组,而不是单元格。如果它仍然不够快,您的下一个选择是用C编写它并引用DLL…是的,您是对的!眨眼间,这是超快速的。谢谢大家!@是的,你拿错了事实上,我重新阅读了这个问题,认为可能我误解了,但很快意识到这可能是一种报复性的否决票:德洛根的方式很快。比你提到的更快。我实际上重新阅读了这个问题,认为可能我误解了,但很快意识到这可能是一种报复性的否决票:德洛根的方式非常快。比你提到的要快。texttocolumns的问题是,你必须计算出单元格内的长度,以及单元格内有多少逗号和其他内容。。。还需要插入列等等。。。还有很多额外的步骤。你只要把它复制到一张空白纸上,运行拆分,丢弃其余的。texttocolumns的问题是,你必须计算出单元格中的长度,以及单元格中有多少逗号和其他内容。。。还需要插入列等等。。。还有很多额外的步骤。你只需要把它复制到一张空白的纸上,运行拆分,丢弃其余的。