跨多个工作表更新外部单元格引用(使用vba宏)

时间:2014-10-20 02:04:23

标签: excel vba excel-vba

我对VBA和Excel宏一般都是新手,所以我会尽可能清楚地解释我的困境。基本上我有两个工作簿,源工作簿包含一个包含近千行和列的工作表,另一个包含90多个工作表的工作簿,每个工作表都有两个引用源工作簿中的单元格的表(表格涵盖了每月的数据)过去四个财政年度。)

我已经将自动化宏块整合在一起,但主要关注的是它可以做得更好,特别是我有一段代码:

'October
cellVarO = ActiveSheet.Range("B8").Formula
cellVarO = Right(cellVarO, 5)
Range("B8").Select
ActiveCell.Formula = "=OFFSET('C:\external\[reference_sheet.xls]Mnthly Rdgs'!" & cellVarO & ",0," & fyNum * 12 & ")"

需要注意的一点是,此代码重复24次,每月一次,以及另一次使用MID的迭代,以便我仍然从活动单元格公式中选择正确的单元格值(在将原始公式更改为包含之后) OFFSET)。我发现这个笨重而且不必要,但这是我能够解决问题的唯一方法。另一个问题是,它认为单元格引用总是长5个字符。有些情况并非如此。

但基本上我的月份是按列排列的,我的年份是按行排列的,我打算在这里做的是查看单元格公式中的单元格引用,选择单元格值,然后使用OFFSET来移动将12列列为最新值,并将新值打印到最近一年。假设我有单元格公式:

='C:\external\[reference_sheet.xls]Mnthly Rdgs'!QR938

我的目标是在此处获取单元格值(QR938)并将其右移12列。有没有办法挑选单元格值(除了使用MID / RIGHT之外)并将其分配给变量来抵消?除了使用OFFSET之外,还有更好的方法来移动12列的单元格吗?最后,有没有办法在多个类似格式的工作表中执行相同的操作?

1 个答案:

答案 0 :(得分:1)

看看这是否有帮助

测试主要代码:

Sub Tester()

    'offset 12 cols to right
    OffsetFormulaReference ActiveSheet.Range("B8"), 0, 12

    'offset 12 cols to left
    OffsetFormulaReference ActiveSheet.Range("B9"), 0, -12

    'offset 12 rows down
    OffsetFormulaReference ActiveSheet.Range("B10"), 12, 0

    'offset 12 rows up
    OffsetFormulaReference ActiveSheet.Range("B11"), -12, 0


    'EDIT: loop over sheets and edit a specific range
    Dim c As Range, sht as WorkSheet
    For Each sht in ThisWorkbook.Sheets
        For each c in sht.Range("B8:B20").Cells
            OffsetFormulaReference c, 12, 0
        Next c
    Next sht

End Sub

实用程序方法,用于从具有外部引用的单元格中获取公式并将其移动指定的行数/列数:

Sub OffsetFormulaReference(c As Range, offsetRows, offsetCols)

    Dim origForm As String, origAddr As String
    Dim arr, rng As Range, newAddr As String

    If c.HasFormula Then
        origForm = c.Formula
        '(e.g.)  ='C:\external\[reference_sheet.xls]Mnthly Rdgs'!QR938

        If InStr(origForm, "!") > 0 Then

            arr = Split(origForm, "!") 'arr(1) = "QR938"
            Set rng = ActiveSheet.Range(arr(1)) 'get a range reference
            Set rng = rng.Offset(offsetRows, offsetCols) 'move the reference
            newAddr = rng.Address(False, False) 'get the offset address
            'replace old formula with new offset reference
            c.Formula = arr(0) & "!" & newAddr
        End If
    End If
End Sub

注意:如果您尝试使用Offset()移动rng引用超出工作表的限制(例如,行或列< 1),则会出现错误。如果可能存在问题,您可以添加逻辑来处理它。