Вмъкнете Round функция в текущата клетка с помощта на VBA

Опитвам се да улесня вмъкването на функцията Round в редица клетки, които вече имат формули в тях.

Например, ако клетка A1 има формулата =b1+b2, след използването на този макрос, искам съдържанието на клетката да се чете =Round(b1+b2,). Формулите във всяка от клетките не са еднакви, така че частта b1+b2 трябва да бъде всякаква.

Всичко, до което мога да стигна, е това:

Sub Round()

    Activecell.FormulaR1C1 = "=ROUND(b1+b2,)"     
End Sub

Така че наистина търся някакъв начин да получа формулата в избрана клетка и след това да редактирам това съдържание с помощта на VBA. Никъде не мога да намеря отговора.


person user1050200    schedule 16.11.2011    source източник


Отговори (6)


Какво ще кажете за това?

Sub applyRound(R As Range)
    If Len(R.Formula) > 0 Then
        If Left(R.Formula, 1) = "=" Then
            R.Formula = "=round(" & Right(R.Formula, Len(R.Formula) - 1) & ",1)"
        End If
    End If
End Sub
person DontFretBrett    schedule 16.11.2011
comment
@user1050200: не забравяйте да приемете отговора, ако отговаря на вашите нужди - person JMax; 16.11.2011

Това е вариант на подхода на brettville, базиран на код, който написах в друг форум, който

  1. Работи върху всички клетки с формули в текущата селекция
  2. Използва масиви, SpecialCells и низови функции за оптимизиране на скоростта. Преминаването през диапазони може да бъде много бавно, ако имате много клетки

    Sub Mod2()
    Dim rng1 As Range
    Dim rngArea As Range
    Dim i As Long
    Dim j As Long
    Dim X()
    Dim AppCalc As Long
    
    On Error Resume Next
    Set rng1 = Selection.SpecialCells(xlFormulas)
    On Error GoTo 0
    If rng1 Is Nothing Then Exit Sub
    
    With Application
        AppCalc = .Calculation
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
    
    For Each rngArea In rng1.Areas
        If rngArea.Cells.Count > 1 Then
            X = rngArea.Formula
            For i = 1 To rngArea.Rows.Count
                For j = 1 To rngArea.Columns.Count
                    X(i, j) = "=ROUND(" & Right$(X(i, j), Len(X(i, j)) - 1) & ",1)"
                Next j
            Next i
            rngArea = X
        Else
            rngArea.Value = "=Rround(" & Right$(rngArea.Formula, Len(rngArea.Formula) - 1) & ",1)"
        End If
    Next rngArea
    
    With Application
        .ScreenUpdating = True
        .Calculation = AppCalc
    End With
    End Sub
    
person brettdj    schedule 17.11.2011
comment
Колко bretts са необходими, за да се отговори на въпрос на VBA, LOL. Не тествах вашето решение, но изглежда солидно. - person DontFretBrett; 17.11.2011

Печатна грешка във втората функция "=round" беше въведена като "=Rround". Веднъж модифициран с кръг от 2, вместо 1, процесът работи чудесно за мен. Мога да добавя друг израз if, за да проверя дали вече има формула "=round", за да попреча на някой да изпълнява повече от веднъж или да закръгля в рамките на кръг.

Дарил

person Darryl Worth    schedule 25.03.2014
comment
Това би било по-подходящо в раздела за коментари на отговора, към който се позовавате. - person djv; 26.03.2014

Пълната модифицирана програма ще бъде така

    Sub Round_Formula()
    Dim c As Range
    Dim LResult As Integer
    Dim leftstr As String
    Dim strtemp As String
    Set wSht1 = ActiveSheet
    Dim straddress As String
    Dim sheet_name As String
    sheet_name = wSht1.Name
    'MsgBox (sheet_name)

    straddress = InputBox(Prompt:="Full cell Address where to insert round function as D8:D21", _
      Title:="ENTER Address", Default:="D8:D21")


    With Sheets(sheet_name)
    For Each c In .Range(straddress)
       If c.Value <> 0 Then
        strtemp = c.Formula
        'MsgBox (strtemp)
        LResult = StrComp(Left(strtemp, 7), "=ROUND(", vbTextCompare)
        'MsgBox ("The value of LResult is " & LResult)
        If LResult <> 0 Then
            'c.Formula = "=ROUND(" & Right(c.Formula, Len(c.Formula) - 1) & ",2)"
            c.Formula = "=ROUND(" & Right(c.Formula, Len(c.Formula) - 1) & ",0)"
        End If
    End If
Next c

End With
End Sub
person Sumit Saha    schedule 13.09.2015

Опитайте тази

За всяко n в селекцията N.formula="round (" & mid (n.formula,2,100) & ",1)" Next n

Предположих, че дължината на вашата съществуваща формула е по-малка от 100 знака и чувствителността е 1. Можете да промените тези стойности

person ExcelinEfendisi    schedule 13.09.2015

Подобрих отговора, предоставен от Sumit Saha, за да предоставя следните функции:

  1. Изберете диапазон или различни диапазони с мишката
  2. Въведете желания брой цифри, вместо да редактирате кода
  3. Въведете броя на цифрите за различни избрани региони, като промените реда на iNum, както е обяснено.

За разбирането,

    Sub Round_Formula_EREX()
    Dim c As Range
    Dim LResult As Integer
    Dim leftstr As String
    Dim strtemp As String
    Set wSht1 = ActiveSheet
    Dim straddress As Range
    Dim iNum As Integer

    Set straddress = Application.Selection
    Set straddress = Application.InputBox("Range", xTitleId, straddress.Address, Type:=8)
    iNum = Application.InputBox("Decimal", xTitleId, Type:=1)

    For Each c In straddress
       If c.Value <> 0 Then
    strtemp = c.Formula

    LResult = StrComp(Left(strtemp, 7), "=ROUND(", vbTextCompare)

    If LResult <> 0 Then
    'If you want to enter different digits for different regions you have selected,
    'activate next line and deactivate previous iNum line.
    'iNum = Application.InputBox("Decimal", xTitleId, Type:=1)

     c.Formula = "=ROUND(" & Right(c.Formula, Len(c.Formula) - 1) & "," & iNum & ")"
      End If
     End If
    Next c

    End Sub
person EREX    schedule 16.12.2017