我对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列的单元格吗?最后,有没有办法在多个类似格式的工作表中执行相同的操作?
答案 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),则会出现错误。如果可能存在问题,您可以添加逻辑来处理它。