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

跨多个工作表更新外部单元格引用(使用vba宏),vba,excel,Vba,Excel,一般来说,我对VBA和Excel宏完全陌生,所以我会尽可能清楚地解释我的困境。基本上,我有两个工作簿,源工作簿包含一个包含近数千行和列的工作表,另一个工作簿包含90多个工作表,每个工作表都有两个表格引用源工作簿中的单元格(这些表格涵盖了过去四个会计年度的月度数据) 我已经串连了一个主要工作的自动化宏,但我主要关心的是它可以做得更好,特别是我有一段代码: 'October cellVarO = ActiveSheet.Range("B8").Formula cellVarO = Right(cel

一般来说,我对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进行另一次迭代,因此我仍然从活动单元格公式中选择正确的单元格值(在更改原始公式以包括偏移量之后)。我觉得这个问题太大,没有必要,但这是我唯一能集中精力解决这个问题的方法。另一个问题是,它认为单元格引用的长度始终为5个字符。有些情况并非如此

但基本上我的月份是按列排列的,我的年份是按行排列的,我的目标是在单元格公式中查找单元格引用,选择单元格值,然后使用偏移量将值12列移到最近的一列,并将新值打印到最近的一年。假设我有单元格公式:

='C:\external\[reference_sheet.xls]Mnthly Rdgs'!QR938
我的目标是在这里获取单元格值(QR938)并将其右移12列。有没有办法选择单元格值(除了使用中间/右边)并将其指定给要偏移的变量?除了使用偏移量,还有更好的方法将单元格值移动12列吗?最后,有没有办法跨多个格式类似的工作表执行相同的操作?

看看这是否有帮助

对于测试主代码:

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),则会出现错误。如果这可能是一个问题,您可以添加逻辑来处理它。

我想我明白了,但我不明白。:)对不起,你能举例说明一个简单的样本数据和预期结果吗?我只是缺乏想象力。+1,尽管我不是100%确定这回答了OP的所有问题。但我认为它确实有帮助。是的,这和我想要的一模一样。我仍然有点困惑如何自动化整个流程来运行多张工作表。我是否可以将它全部“包装”在一个For-Each语句中,一次激活一个工作表?抱歉这么含糊不清,我还是一个完全的新手:)我不确定你的工作表是如何设置的,但请参见我上面的编辑。