【问题标题】:How to do a find and replace on truly blank cells如何在真正的空白单元格上进行查找和替换
【发布时间】:2019-04-13 10:08:06
【问题描述】:

我有一个范围,它的大小可以变化,并且可以包含数万个单元格。 对于这个范围内每个有字符串的单元格,我需要用 1 替换。对于根本没有值的每个单元格,我需要用零替换。

我尝试了以下方法,但是虽然它确实将填充的单元格替换为单元格,但空白单元格仍然是空白的。

Selection.Replace What:="*", Replacement:="1", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

我也试过这个,结果是一样的。

Selection.Replace What:=null, Replacement:="0", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

编辑:包含完整代码

Sub MassFindReplace()

        ' This will select an area within the given parameters and replace all blank cells with zeros and all populated cells with Ones

    Dim VRange1 As String
    Dim VRange2 As String
    Dim Doublecheck As Integer

    VRange1 = InputBox("Enter First Cell Address Here" & vbNewLine & vbNewLine & "Make sure you ONLY input a single cell address")

    VRange2 = InputBox("Enter Second Cell Address Here" & vbNewLine & vbNewLine & "Make sure you ONLY input a single cell address")

    Range(VRange1, VRange2).Select

    Doublecheck = MsgBox("The range you have selected is between " & VRange1 & " and " & VRange2 & vbNewLine & vbNewLine & "Does this sound right to you?" & vbNewLine & vbNewLine & "If not press No to cancel", vbYesNo)

    If Doublecheck = vbYes Then

    ' This turns off a number of background functions and greatly speeds up this process
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' choose what to search for and what to replace with here
    Selection.Replace What:="*", Replacement:="1", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Selection.Cells.SpecialCells(xlCellTypeBlanks).Value = 1


    'Resets the background functions. THIS MUST HAPPEN or it will screw up your excel.
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.CalculateFull

    MsgBox "Complete"

    Else
        MsgBox "Canceled"

    End If

End Sub

编辑:我尝试在下面的一些代码之后基于此,但虽然它似乎有效,但我无法让它选择自定义范围。

Sub MassTEST()



Dim ws As Worksheet: Set ws = ActiveSheet
Dim cel As Range
Dim VRange1 As String
Dim VRange2 As String
Dim Doublecheck As Integer


VRange1 = InputBox("Enter First Cell Address Here" & vbNewLine & vbNewLine & "Make sure you ONLY input a single cell address")

VRange2 = InputBox("Enter Second Cell Address Here" & vbNewLine & vbNewLine & "Make sure you ONLY input a single cell address")

Data = ws.Range(VRange1, VRange2).Value

For Each cel In ws.UsedRange
    If cel.Value <> "" Then
        cel.Value = 1
    Else
        cel.Value = 0
    End If
Next

结束子

【问题讨论】:

  • 我得到了“0”来处理你的What:="",你介意仔细检查一下你的数据是否真的是空白单元格吗?
  • 你可以得到:UsedRange.SpecialCells(xlCellTypeBlanks) 并用0 填写它们
  • Wizhi - 起初我以为它可以工作,然后我意识到它只是将零放入具有零长度字符串的单元格中。对于 True Nulls,它不起作用。

标签: excel vba replace find


【解决方案1】:

使用这个:

On Error Resume Next
    Selection.Cells.SpecialCells(xlCellTypeBlanks).Value = 1
On Error GoTo 0

注意它只会填充 UsedRange 和 Selected Cells 的交集。

【讨论】:

    【解决方案2】:

    如果您必须遍历并评估每个单元格,则只需检查每个单元格以查看其是否为空。当然,如果工作表的 UsedRange 不是您需要的范围,您可以手动指定它。

    Sub MassFindReplace()
    
        Dim ws As Worksheet: Set ws = ActiveSheet
        Dim cel As Range
    
        For Each cel In ws.UsedRange
            If cel.Value <> "" Then
                cel.Value = 1
            Else
                cel.Value = 0
            End If
        Next
    
    End Sub
    

    根据 urdearboy 的建议,您也可以将其加载到数组中,然后在那里检查。

    Sub MassFindReplace()
    
        Dim ws As Worksheet: Set ws = ActiveSheet
        Dim data As Variant, v As Variant
    
        data = ws.UsedRange.Value
    
        For i = LBound(data, 1) To UBound(data, 1)
            For j = LBound(data, 2) To UBound(data, 2)
                If data(i, j) <> "" Then
                     data(i, j) = 1
                Else
                    data(i, j) = 0
                End If
            Next
        Next
    
        ws.UsedRange.Resize(UBound(data, 1), UBound(data, 2)).Value = data
    
    End Sub
    

    【讨论】:

    • 单元格太多,不实用,可能有数万个,具体取决于它们从数据库中提取的内容。
    • 如果 OP 必须以任何一种方式更改每个单元格,您可以使用一个函数来查找所有包含内容的单元格,然后再次在整个范围内搜索空白单元格(我正在制作假设这是底层Selection.Replace 的功能),或者您可以搜索整个范围一次。我并不是说它不需要一些时间来处理,并且有很多事情可以做来加速它,但至少,这是一种易于理解的干净方式,可以解决问题.
    • 更好的选择是将UsedRange 写入一个数组,然后使用此处提供的相同测试将1 or 0 写入一个新数组。然后一次性输出数组
    • 我对此进行了一些实验,它似乎有效,但试图让它允许手动输入的范围给我带来了问题。我不习惯使用数组,所以我可能犯了一个明显的错误。我尝试使用上面的范围选择,然后将您显示的代码更改为“For Each cel In ActiveRange”,但它不喜欢那样...
    • 尝试data = ws.Range("A1:J10").Value 并调整您需要的范围。
    【解决方案3】:

    使用“~*”。

    Selection.Replace What:="~*", Replacement:="1", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    

    【讨论】:

    • 这个好像没有效果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多