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

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

我已经把一个自动化的macros指令串在了一起,但是我主要关心的是它可以做的更好,特别是我有一段代码:

'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,这样我仍然从活动单元格公式中select正确的单元格值(将原始公式更改为包含OFFSET之后)。 我觉得这个庞大而且没有必要,但是这是我唯一可以解决这个问题的方法。 另一个问题,它认为单元格引用将总是5个字符长。 有些情况并非如此。

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

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

我的目标是把这里的单元格值(QR938)和右移12列。 有没有什么办法来select单元格的值(除了使用MID / RIGHT)并将其赋值给一个variables来抵消? 有没有更好的方法来移动除了使用OFFSET以外的单元格12列? 最后,有没有什么办法可以在多个格式相同的工作表上执行相同的操作?

看看这是否有帮助

为了testing主代码:

 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 '(eg) ='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),将会出现错误。 如果这可能是一个问题,你可以添加逻辑来处理。