Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何在真正空白的单元格上查找和替换_Excel_Vba_Replace_Find - Fatal编程技术网

Excel 如何在真正空白的单元格上查找和替换

Excel 如何在真正空白的单元格上查找和替换,excel,vba,replace,find,Excel,Vba,Replace,Find,我有一个范围,它的大小是可变的,可以包含数万个单元格。 对于此范围内每个包含字符串的单元格,我需要将其替换为1。对于所有没有值的单元格,我需要用零替换 我尝试了下面的方法,但是当它用填充细胞代替填充细胞时,空白细胞仍然是空白的。 Selection.Replace What:="*", Replacement:="1", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFor

我有一个范围,它的大小是可变的,可以包含数万个单元格。 对于此范围内每个包含字符串的单元格,我需要将其替换为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
末端接头

使用以下方法:

On Error Resume Next
    Selection.Cells.SpecialCells(xlCellTypeBlanks).Value = 1
On Error GoTo 0
注意,它只会填充UsedRange和所选单元格的交点。

使用此选项:

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

注意,它只会填充UsedRange和所选单元格的交叉点。

如果必须遍历并计算每个单元格,则只需检查每个单元格是否为空。当然,如果工作表的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
根据Urderboy的建议,您还可以将其加载到数组中,然后在那里进行检查

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

如果您必须检查并评估每个单元格,那么只需检查每个单元格是否为空。当然,如果工作表的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
根据Urderboy的建议,您还可以将其加载到数组中,然后在那里进行检查

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
使用~*

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

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

我得到了0来处理您的What:=,您介意再次检查您的数据是否真的是空白单元格吗?您可以得到:UsedRange.SpecialCellsxlCellTypeBlanks并用0Wizhi填充这些单元格-起初我认为它可以工作,然后我意识到它只是将零放入具有零长度字符串的单元格中。对于真正的空值,它不起作用。我用0来处理您的What:=,您介意再次检查您的数据是否真的是空白单元格吗?您可以得到:UsedRange.SpecialCellsxlCellTypeBlanks并用0Wizhi填充这些单元格-起初我认为它起作用,然后我意识到它只是将零放入具有零长度字符串的单元格中。对于真正的空值,它不起作用。太多的单元格使其不实用,根据从数据库中提取的内容,可能会有上万个单元格。如果OP必须以任何方式更改每个单元格,你可以使用一个函数来查找所有包含内容的单元格,然后在整个范围内再次搜索空白单元格。我假设这就是基础选择的方式。替换函数,或者你可以在整个范围内搜索一次。我并不是说它不需要花一些时间来处理,还有很多事情要做来加速它,但至少,这是一种简单易懂的解决问题的方法。更好的替代方法是将UsedRange写入一个数组,然后使用这里提供的相同测试将1或0写入一个新数组。然后一次输出数组我对此做了一点实验,它似乎可以工作,但试图让它允许手动输入范围给我带来了问题。我不习惯使用数组,所以我可能犯了一个明显的错误。我尝试使用上面的范围选择,然后更改您显示的代码,以读取ActiveRange中每个cel的代码,但它不喜欢这样…尝试data=ws.RangeA1:J10.Value并根据您需要的范围进行调整。单元格太多,这不实用,根据从数据库中提取的内容,可能会有成千上万个单元格。如果OP必须以任何方式更改每个单元格,您可以使用一个函数来查找所有包含内容的单元格,然后在整个范围内再次搜索空白单元格。我假设这就是基础选择的方式。替换函数,或者你可以在整个范围内搜索一次。我并不是说它不需要花一些时间来处理,还有很多事情要做来加速它,但至少,这是一种简单易懂的解决问题的方法。更好的替代方法是将UsedRange写入一个数组,然后使用这里提供的相同测试将1或0写入一个新数组。然后一次输出数组我对此做了一点实验,它似乎可以工作,但试图让它允许手动输入范围给我带来了问题。我不习惯使用数组,所以我可能犯了一个明显的错误。我尝试使用上面的范围选择,然后更改显示为ActiveRange中每个cel读取的代码,但不喜欢这样…尝试data=ws.RangeA1:J10.Value并根据需要的范围进行调整。我担心这似乎没有效果我担心这似乎没有效果