VBA中怎么调用offset函数,急!

是这样的,我的原始数据是一个108*20的矩阵(B3:U110)现在我需要运用这个矩阵进行一系列运算,第一次运算我用前60行(B3:U62),第二次运算我用(B4:U63... 是这样的,我的原始数据是一个108*20的矩阵(B3:U110)现在我需要运用这个矩阵进行一系列运算,第一次运算我用前60行(B3:U62),第二次运算我用(B4:U63)依次类推一直到(B51:U110)一共48次运算,手算的话当然就会死掉了。所以我用offset语句把(B3:U62)取了出来,之后就想通过修改offset语句中的row来使得矩阵每次下移一行,同时我还要用到规划求解(Solver)去运算。求大神解释在VBA中怎么实现。我写的代码如下(只是部分,运行到offset就会出错)。需要的话我可以把excel表格发给你。急,在线等

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
展开
 我来答
2724421
2013-12-19 · TA获得超过2493个赞
知道大有可为答主
回答量:1551
采纳率:71%
帮助的人:954万
展开全部
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 属性
返回 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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hbpaoxiao2
推荐于2018-03-01 · TA获得超过2898个赞
知道大有可为答主
回答量:1962
采纳率:72%
帮助的人:878万
展开全部
不要用offset,直接用resize,定义区域要用set
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)
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式