VBA中怎么调用offset函数,急!
Private Sub Worksheet_Change(ByVal Target As Range)
SolverOK SetCell:="$E$223", MaxMinVal:=2, ValueOf:="0", ByChange:="$E$202:$E$221"
SoverSolve UserFinish:=True
End Sub
Sub Mmult()
Range("Result").ClearContents
Dim Mat1()
Dim Mat2()
Mat2 = Range("B3:U62")
For i = 1 To 48
Mat1 = Application.WorksheetFunction.Offset(Mat2, i, 0, 60, 20)
Application.SendKeys ("{Enter}")
Range("Result").Cells(i + 1, 2) = ActiveSheet.Range("x_1")
Next i
End Sub 展开
Sub Mmult()
Range("Result").ClearContents
Dim Mat1()
Dim Mat2()
Mat2 = Range("B3:U62")
For i = 1 To 48
Mat1 = Range("B3:U62").Offset(1, 0)
Application.SendKeys ("{Enter}")
Range("Result").Cells(i + 1, 2) = ActiveSheet.Range("x_1")
Next i
你的 mat2 赋值后保持的是单元格区域中的值.而不是单元格区域地址
所以Mat1 = Application.WorksheetFunction.Offset(Mat2, i, 0, 60, 20)会报错,因为这个offset 要求的是单元格地址,详细的offset参数说明如下:
OFFSET(reference,rows,cols,height,width)
Reference 作为偏移量参照系的引用区域。Reference
必须为对单元格或相连单元格区域的引用;否则,函数 OFFSET 返回错误值 #VALUE!。
Rows 相对于偏移量参照系的左上角单元格,上(下)偏移的行数。如果使用 5 作为参数
Rows,则说明目标引用区域的左上角单元格比 reference 低 5 行。行数可为正数(代表在起始引用的下方)或负数(代表在起始引用的上方)。
Cols 相对于偏移量参照系的左上角单元格,左(右)偏移的列数。如果使用 5 作为参数
Cols,则说明目标引用区域的左上角的单元格比 reference 靠右 5 列。列数可为正数(代表在起始引用的右边)或负数(代表在起始引用的左边)。
Height 高度,即所要返回的引用区域的行数。Height 必须为正数。
Width 宽度,即所要返回的引用区域的列数。Width 必须为正数。
例如:OFFSET(C2,1,2,3,1))
所以你的:
Mat1 = Application.WorksheetFunction.Offset(Mat2, i, 0, 60, 20) 这句要想运行正确应改为
Mat1 = Application.WorksheetFunction.Offset(Range("B3:U62").address, i, 0, 60, 20)
不过VBA可以用自己的offset 来做偏移.就像我给你的代码那样
VBA的offset 说明如下:
返回一个 Range 对象,该对象代表某个指定区域以外的区域。只读。
expression.Offset(RowOffset, ColumnOffset)
expression 必需。该表达式返回一个 Range 对象。
RowOffset Variant
类型,可选。区域偏移的行数(正值、负值或 0(零))。正值表示向下偏移,负值表示向上偏移,默认值为 0。
ColumnOffset Variant
类型,可选。区域偏移的列数(正值、负值或 0(零))。正值表示向右偏移,负值表示向左偏移,默认值为 0。
推荐于2016-03-28
返回 Range 对象,它代表位于指定单元格区域的一定的偏移量位置上的区域。
语法
表达式.Offset(RowOffset, ColumnOffset)
表达式 一个代表 Range 对象的变量。
参数
名称 必选/可选 数据类型 描述
RowOffset 可选 Variant 区域偏移的行数(正数、负数或
0(零))。正数表示向下偏移,负数表示向上偏移。默认值是 0。
ColumnOffset 可选 Variant 区域偏移的列数(正数、负数或
0(零))。正数表示向右偏移,负数表示向左偏移。默认值是 0。
示例
此示例激活 Sheet1 上活动单元格向右偏移三列、向下偏移三行处的单元格。
Visual Basic for Applications
Worksheets("Sheet1").Activate
ActiveCell.Offset(rowOffset:=3,
columnOffset:=3).Activate
此示例假设 Sheet1 中包含一个具有标题行的表格。此示例先选定该表格,但并不选择行首。运行此示例之前,活动单元格必须位于表格中。
Visual Basic for Applications
Set tbl =
ActiveCell.CurrentRegion
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, _
tbl.Columns.Count).Select
set mat1=cells(i,"B").resize(60,20)
我没懂啊= =。。就是我已经在excel表格里,用offset把第一次(B3:U62)取出来了。
我是用offset(B3:U62,0,,60,20)这样取出来的,循环的时候我就想用VBA写一个可以吧我这个公式里的0递加的代码。要不要我把excel发给你你帮我看一下?
语法的话,在vba编辑器中选中单词,按F1就能看到怎么用了。
你这里有几个问题
mat2=range("B3:U62")'这一句中得到的mat2其实是一个数组,并不是range,你可以在调试的时候用本地窗口看看。
要指定一个区域要用set
set mat2=range("B3:U62")
还有,vba中的resize方法和excel里面的offset其实是一个作用。
所以,我建议代码改为:
For i = 1 To 48
set Mat1 = cells(i+2,"B").resize(60,20)'i=1时,mat1为b3单元格扩张60行,20列的区域。
next
'帮助文件中的resize的语法:表达式.Resize(RowSize,
ColumnSize)