
1for i=1 to m
for j=1 to i
sheet1cells(i,j)=inputbox("输入数据A(" &cstr(i) &"," &cstr(j) &"):","0")
next j
next i
2for i=2 to m
for j=1 to i-1
sheet1cells(j,i)=sheet1cells(i,j)
next j
next i
剪贴板 *** 作有许多函数据,可以对剪贴板进行各种 *** 作包括写入\读出\清空等
下面给出对剪贴板是否有数据,有数据的情况下读取首行和末行的内容并赋值给变量a和b
具体例子如下:
Public Sub 调试1()
Dim a As New DataObject
aGetFromClipboard
gx = aGetText
if gx<>"" then
aa = Split(gx, Chr(9))
bb = UBound(aa)
a1 = aa(0)
a2 = aa(bb)
endif
End Sub
Dim i&, Myr&, r%, Arr, Arr1(), ks, js, j& '声明变量
ApplicationScreenUpdating = False '关闭屏幕更新
Sheet1Activate '激活sheet1表为活动表
Myr = [f65536]End(xlUp)Row '记录当前表里数据区域最末行的行号至Myr
Arr = Range("a1:q" & Myr) '将数据区A1:Q(Myr)赋给变量Arr,Q的行号有Myr确定
For i = 2 To UBound(Arr) '循环 UBound(Arr)去arr数组最大下标,因为省略参数,默认是第一维,可以理解为区域的行数, 循环条件是i 从2步进到这个最大小标数
If Arr(i, 2) <> "" Then '判断B列的当前行的单元格是否为空
r = r + 1 '非空则r计数加1
ReDim Preserve Arr1(1 To r) '重定义Arr1数组维数,并保护之前的数组信息
Arr1(r) = i '将该行行号至数组arr1
End If
Next '这个循环也就是说会记录B列有非空单元格的行号至数组arr1中
For i = r To 1 Step -1 '循环,条件是i= r到1,按1递减
If i <> r Then
js = Arr1(i + 1) - 1 '非初始循环时,i都是小于r的,都会执行这条语句将,其目的是记录上一个B列非空单元格的行号
Else
js = UBound(Arr) '初始循环时i=r,会执行这条语句,将arr第一维下标最大值 赋给js,其实就是记录arr这个range区域的行数
End If
ks = Arr1(i) '将arr1第i数组数赋给ks,目的是在循环中将B列的每个非空单元格的行号赋给ks
If Arr(js, 4) = "小计" Then '如果B列空单元所对应行与E列交叉单元格是“小计”
Cells(ks + 1, 1)Resize(js - ks, 3)Delete shift:=xlUp '判断条件成立则删除对应的区域,(此代码可能有问题哦),目的应该是清除小计之前的明细区域
Cells(ks, 4)Resize(js - ks, 8)Delete shift:=xlUp '此行也是删除区域的代码,(可能有问题分析下来)
End If
Next
ApplicationScreenUpdating = True 开启屏幕更新
Dim arr(1 To 10, 1 To 100)是10行,100列的2维数组
行就是第一维,列是第二维。行的最大值是10,行和列的最小值都是1,所以第一维的最大索引号是10,第二维的最小索引号是1
晕了,原来数组的第一个元素是(1),新鲜。
参考下面的资料吧
一、数组的分类
按元素数目分:元素数目大小固定的数组和元素数目大小不固定的动态数组。
按维数分:一维数组、多维数组。
Arr(1 to 12)、Arr1(0 to 24)----一维固定数组;
Arr2(1 to 5,1 to 8)---- 二维固定数组;
Arr3(5 to 10,6 to 12,1 to 100) ---- 三维固定数组。
动态数组
Dim Arr2(),r%
r=r+1
ReDim Preserve Arr2(1 To r) ―――动态数组;可以重新声明(只有最后一维的数目才能重新声明);
用了关键字 Preserve 可确保原来包含数据的数组中的任何数据都不会丢失
二、数组的赋值
21,单元格区域保存到数组
arr = [e22:i24]
arr=Range(“e22:i24”)
22,Array函数
myArray = Array("AAA", "BBB", 200, 500, "2006-7-12")
如果代码头没有 Option Base 1 的语句,则数组myArray的上限为4,下限为0。
即下限LBound(myArr)=0 ,上限 UBound(myArr)=4
二维数组的第一维的上限:UBound(Arr,1)
二维数组的第二维的上限:UBound(Arr,2)
多维数组上限的求法一样。
23,把单元格区域公式赋给数组
如果a5=B4+1
arr = [a4:c8]Formula '将单元格绝对引用公式保存到数组
[e4:g8]=arr 此时e5中的公式也=B4+1;
如果将单元格相对引用公式保存到数组
arr = [a4:c8]FormulaR1C1
如果a5=B4+1
[e4:g8]=arr 此时e5中的公式就=E4+1;
三、数组的处理
31,数组里的最大值和最小值
最大值aa = ApplicationWorksheetFunctionMax(Arr)
aa= ApplicationWorksheetFunctionLarge(Arr,1)
最小值aa = ApplicationWorksheetFunctionMin(Arr)
aa= ApplicationWorksheetFunctionSmall(Arr,1)
楼上的方法把计算公式中的值都一次性定死了,填充的就是一个字符串,不能用于后续运算。
如果各统计单元格之间的相对位置保持不变的话,建议用R1C1相对格式表示法插入计算公式。这样做的好处是,如果以后重新排版,数据发生整体移位,照样可用。
Cells(i, 7)Value = Cells(9, j) Cells(i, j) + Cells(i, 7)Value
改为
Cells(i, 7)FormulaR1C1 = "=R[9-" & i & "]C[" & j & "-7]RC[" & j & "-7]+RC"
相对位移都是针对填充公式的Cells(i, 7)单元格的。
注意将公式中的变量放到引号外面,并用字符串连接符&连接就对了。否则变量会被识别为字符串而不是相应的值。
(楼主给的数据所在位置与程序不匹配,因此没法试验。有问题请补充或hi我。)
_____________________________________________________________________
我试过,楼主你修改后是可以正确填充公式的,但计算结果的时候有问题,因为公式里不能再重复引用自身单元格,不信可以手动填充一个公式试试。
所以建议重新规划一下单元格的使用,可以用隐蔽角落里的单元格保存中间计算结果(如果有图表的话可以使用隐藏在其后的单元格),并保护这些单元格防止被修改。
我快不能再修改回答了,修改次数已接近上限,有问题最好用百度hi直接hi我。
你第一次重定义的时候,一定要把可变的维数定义在最后一维,比如
ReDim s(1 To 2, 1 To 50)
然后第二次重定义的时候就可以
Redim Preserve s(1 To 2, 1 To j)
强调:重定义动态数组时,要想保持数组中原有的数据,只能修改最后一维的维数!
以上就是关于如何用VBA在excel中插入一个矩阵全部的内容,包括:如何用VBA在excel中插入一个矩阵、vba 先判断剪贴板不为空,然后将其中的数据赋值给一个数组。然后检测行数和维数。、受累帮我解释一下这段excel的vba代码吧,谢谢您了,越详细越好,用//在每行后面写吧,再次谢谢,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)