0

所以,我有一个宏循环遍历工作表上的许多单元格并对它们进行处理。

这是代码http://pastie.org/4290581

Private Sub ReplaceFormulaWithValues()
    Dim lastrow As Long, r1 As Long
    Dim temp As String, arTemp
    Dim temp2 As String
    Dim temp3 As String

    Dim letter

    temp3 = ""

        ' Get the last row in the worksheet
    lastrow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    For r1 = 1 To lastrow

        For r2 = 0 To 10
            letter = Chr(Asc("A") + r2)
            letter = letter + LTrim(Str(r1))


            ' If A & B aren't blank, make the formula of cell C equal to A + B.
            If Sheet1.Range(letter).Value <> "" And Mid(Sheet1.Range(letter).Formula, 1, 1) = "=" Then
                If Asc(Mid(Sheet1.Range(letter).Formula, 2, 1)) >= 65 And Asc(Mid(Sheet1.Range(letter).Formula, 2, 1)) <= 90 Then
                    ' Get the formula for the current C cell
                    temp = Replace(Sheet1.Range(letter).Formula, "=", "")

                    'Create an array by splitting the formula on the + sign
                    arTemp = Split(temp, "+")

                    temp2 = Sheet1.Range(arTemp(0)).Value

                    For i = 1 To UBound(arTemp)
                        temp3 = Sheet1.Range(arTemp(i)).Value
                        temp2 = temp2 & "+" & temp3

                    Next i

                    Sheet1.Range(letter).Value = "=" & temp2
                End If

            End If

        Next
    Next
End Sub

就是它的作用:

for instance, let's say that the formula of cell C2 is C2=A1+B1, where A1 = 10 and B1 = 20.
I would like to change it so that the formula of cell C2 is C2=10+20.
However, I don't want the formula displayed in the cell or anything.

我的问题:如何设置它以便我首先可以从工作表中突出显示/选择一组单元格,然后激活宏以便宏仅适用于该范围内的每个单元格?

4

3 回答 3

1

该程序当前使用两个 for 循环遍历工作表中的所有单元格。可以将这些循环修改为仅使用 Application.Selection 循环遍历当前选择。

因此,您的代码将如下所示:

For Each cell In Selection.Cells


    ' If A & B aren't blank, make the formula of cell C equal to A + B.
    If cell.Value <> "" And Mid(cell.Formula, 1, 1) = "=" Then
            If Asc(Mid(cell.Formula, 2, 1)) >= 65 And Asc(Mid(cell.Formula, 2, 1)) <= 90 Then
                ' Get the formula for the current C cell
                temp = Replace(cell.Formula, "=", "")

                'Create an array by splitting the formula on the + sign
                arTemp = Split(temp, "+")

                temp2 = ActiveSheet.Range(arTemp(0)).Value

                For i = 1 To UBound(arTemp)
                    temp3 = ActiveSheet.Range(arTemp(i)).Value
                    temp2 = temp2 & "+" & temp3

                Next i

                cell.Value = "=" & temp2
            End If

        End If

Next

我还使用 ActiveSheet 而不是 Sheet1,以便您可以在任何工作表上运行它。

于 2012-07-20T18:11:16.723 回答
1

我不会重写您的代码 - 但通常您可以循环遍历您选择的一堆单元格,如下所示:

Sub ClearZeroCells()

    Dim cell As Range
    For Each cell In Selection
        If cell = 0 Then cell.ClearContents
        ' or you can put your own code here.
    Next cell

End Sub
于 2012-07-20T18:16:18.783 回答
0

我试着做一些我认为你想要实现的事情。

它(宏 EvaluateSelection)应该查看您选择中包含公式(开始 =)的每个单元格,并将其更改为半评估公式。

Sub EvaluateTarget(ByVal Target As Range)
Dim Result As String
Dim Cell As Range
Dim Precedent As Range

Dim Formula As String
Dim CellReference As String
Dim CellFormula As String

    Formula = Target.Formula

    For Each Cell In Target.SpecialCells(xlCellTypeFormulas)
        For Each Precedent In Cell.DirectPrecedents
            CellReference = Replace(Precedent.Address, "$", "")
            CellFormula = Replace(Precedent.Formula, "=", "")
            Formula = Replace(Formula, CellReference, CellFormula)
        Next Precedent
    Next Cell

    Target.Value = Replace(Target.Address, "$", "") & Formula

End Sub

Sub EvaluateSelection()
Dim Cell As Range

For Each Cell In Selection.Cells
    If Left(Cell.Formula, 1) = "=" Then
        EvaluateTarget Cell
    End If
Next Cell
End Sub

参考- 找到这个并从中工作。

我根本没有测试过这么多,似乎适用于我的简单示例。

于 2012-07-20T20:45:59.467 回答