Results 1 to 6 of 6

Thread: Formula Vs FormulaR1C1 To Pass Calculation Range Through VBA

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Administrator Excel Fox's Avatar
    Join Date
    Mar 2011
    Posts
    1,401
    Rep Power
    10
    Welcome to ExcelFox


    If the pattern of your formula is exactly the same, and it is in non-contiguous range, then you should use FormulaR1C1 instead of Formula. A formula like "=SUM(R[-9]C,R[-6]C,R[-3]C)" in a cell means that you are summing the values that are 9, 6 and 3 rows above that cell. On the other hand, =SUM(R[9]C,R[6]C,R[3]C) would have meant 9, 6 and 3 rows below that cell. Now, all of these formulas are relative in nature. ie., it will change the reference ranges relative to the cell in which the formula is passed.


    Now, =SUM(R9C,R6C,R3C) is an absolute reference (although partially), where you are fixing the reference rows to 9, 6 and 3. The column is still relative. These should now give you an idea how to build up your VBA sub-routine.


    And example


    Code:
    Sub ExcelFox()
    
    
        Dim strFormula As String
        Const strRowIndex As String = "9/6/3"
        Dim lng As Long
        For lng = UBound(Split(strRowIndex, "/")) To 0 Step -1
            strFormula = strFormula & ",R[-" & Split(strRowIndex, "/")(lng) & "]C"
        Next lng
        strFormula = "=SUM(" & Mid(strFormula, 2) & ")"
        Range("B29:E29").FormulaR1C1 = strFormula
        
    End Sub
    A dream is not something you see when you are asleep, but something you strive for when you are awake.

    It's usually a bad idea to say that something can't be done.

    The difference between dream and aim, is that one requires soundless sleep to see and the other requires sleepless efforts to achieve

    Join us at Facebook

  2. #2
    Junior Member
    Join Date
    Oct 2013
    Posts
    9
    Rep Power
    0
    Thanks for your response. I tried using your suggested solution by trying out the following test procedure. After the "InsertMetricsTable" procedure call, the debug.print is printing the correct sum formula which is "=SUM(R[-B11]C,R[-B14]C,R[-B17]C,R[-B20]C,R[-B23]C,R[-B26]C,R[-B29]C,R[-B32]C,R[-B35]C,R[-B38]C)" but when I am trying to assign it to the range formulaR1C1, I get an error saying: Run-time 1004: Application-defined or object-defined error. I am not sure what's wrong now!

    Code:
    Application.ScreenUpdating = False
    Set oMetrics = ActiveSheet
    Call InsertMetricsTables
    sForMetricsTotalLineFormula = "=SUM(" & Mid(sForMetricsTotalLineFormula, 2) & ")"
    Debug.Print "After = " & sForMetricsTotalLineFormula
    Range("B39:D39").FormulaR1C1 = sForMetricsTotalLineFormula
    Application.ScreenUpdating = True

  3. #3
    Junior Member
    Join Date
    Oct 2013
    Posts
    9
    Rep Power
    0
    Thanks for your response. I tried using your suggested solution which works now.

Similar Threads

  1. Replies: 2
    Last Post: 08-17-2013, 08:37 PM
  2. Replies: 7
    Last Post: 04-21-2013, 07:50 PM
  3. Formula Following Order Of Calculation BODMAS
    By paul_pearson in forum Excel Help
    Replies: 7
    Last Post: 03-27-2013, 02:07 PM
  4. VBA To Pass A Variable In An Excel Formula
    By devcon in forum Excel Help
    Replies: 4
    Last Post: 12-17-2012, 09:12 PM
  5. Replies: 11
    Last Post: 10-07-2012, 12:05 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •