关于vb redim 二维数组组的问题,我这样写提示“下标越界”请问怎么改,才能保留a (2,i)

I want to Redim Preserve an array I keep getting the error 'subscript out of range'. I am aware of the fact that only the size of the last dimension can be changed. That is exactly what I am doing. What is going wrong over here? The type of the array is Variant.
BmMatrix = Sheets("BENCH").Range("a60", ActiveSheet.Range("a60").End(xlDown).End(xlToRight))
'totaal gewicht per subdeel in array wegschrijven
Dim aBmMatrix()
aBmMatrix = BmMatrix
rij = UBound(BmMatrix, 1)
kol = UBound(BmMatrix, 2) + 1
ReDim Preserve aBmMatrix(rij, kol)
TotGewKol = UBound(aBmMatrix, 2)
For i = 2 To UBound(BmMatrix, 1)
g = 0 'g wordt totaal gewicht van land bv
If BmMatrix(i, bm_kolom) && "x" Then
For j = 2 To UBound(bmexnul, 1)
If bmexnul(j, weightkolom) = BmMatrix(i, bm_kolom) Then g = g + bmexnul(j, 10)
aBmMatrix(i, TotGewKol) = g
aBmMatrix(1, TotGewKol) = "Totaal gewicht" 'titel kolom
解决方案 Because you assign aBmMatrix array using the Value property of a range, the returned array has lower bounds of 1 for each dimension.
When you later redim it without providing lower bounds explicitly, the redim tries to assign each dimension the default lower bound, which is 0.
You need to explicitly provide the lower bounds:
ReDim Preserve aBmMatrix(lbound(aBmMatrix,1) to rij, lbound(aBmMatrix,2) to kol)
本文地址: &
我想 REDIM preserve 数组我不断收到错误“下标超出范围”。我知道的事实,即只有最后一维的尺寸可以改变。这就是我在做什么。这是怎么回事错在这里?该类型的数组是变。
BmMatrix =表(“冷板凳”),范围(“A60”,ActiveSheet.Range(“A60”)。完(xlDown).END(xlToRight))每subdeel“TOTAAL gewicht数组wegschrijven昏暗aBmMatrix()aBmMatrix = BmMatrixRIJ = UBound函数(BmMatrix,1)KOL = UBound函数(BmMatrix,2)+1使用ReDim preserve aBmMatrix(RIJ,KOL)TotGewKol = UBound函数(aBmMatrix,2)对于i = 2到UBound函数(BmMatrix,1)
G = 0'G wordt TOTAAL gewicht面包车土地BV
如果BmMatrix(I,bm_kolom)LT;> “X”然后
对于j = 2至UBound函数(bmexnul,1)
如果bmexnul(J,weightkolom)= BmMatrix(I,bm_kolom)则G = G + bmexnul(J,10)
aBmMatrix(I,TotGewKol)= G
aBmMatrix(1,TotGewKol)=“TOTAAL gewicht”'性标题kolom接下来,我 解决方案 由于您指定 aBmMatrix 使用数组的值一系列属性,返回的数组 1 的下限为每个维度。当您以后REDIM它没有明确提供下界时,REDIM尝试为每个维度的默认下界,这是 0 。您需要显式提供下界: 使用ReDim preserve aBmMatrix(LBOUND(aBmMatrix,1)RIJ,LBOUND(aBmM 2)KOL)
本文地址: &
扫一扫关注官方微信1985人阅读
一个菜鸟觉得很隐蔽的数组下标越界,高手千万别嘲笑,别打击俺的写学习笔记的热情啊……
先看源代码:
#include &stdio.h&
#define MAXSIZE 20
//简单冒泡排序
void SimSort( int a[], int n)
&int i, j,
&for( i=0; i&n; i++ )&&&&& //!!!!!
&&for( j=0; j&n-i; j++ )
&&&if( a[j] & a[j+1] )
&&&&tmp = a[j];
&&&&a[j] = a[j+1];
&&&&a[j+1] =
int main( void )
&int n, i, a[MAXSIZE];
&printf( &输入关键字的个数:& );
&scanf( &%d&, &n );
&printf( &输入待排序的关键字:& );
&for( i=0; i&n; i++ )
&&scanf( &%d&, &a[i] );
&SimSort( a, n );
&printf( &排序后的关键字:& );
&for( i=0; i&n; i++ )
&&printf( &%d& &, a[i] );
&printf( &\n& );
&return 0;
&&&&& 程序刚编写完的时候发现没什么问题,编译也没问题,但结果总有一个数字是乱码,所以首先就应该猜想是输入还是输出的问题。后来发现第一个循环(上面的有注释的方)i初始化为0的问题。如果初始化为0的话注意下面的循环第一次循环就是for( j=0; j&n; j++ )当j=n-1时,下面的if语句就会出现if( a[n-1] & a[n]),使用a[n]就会导致出现数组越界。但比如刚输入的时候n输入的5,a[n]其实才a[5],但定义数组的时候是a[MAXSIZE],MAXSIZE=20,怎么会出现数组越界呢?看起来似乎不会越界啊!
&&&&& 菜鸟就是菜鸟啊,经过我的单步调试,其实应该不是下标越界,其实是使用了a[n],比如就拿上面的a[5],是a[5]没有初始化,a[5]是数组第六个元素,但程序只给前面5个元素赋值了,所以a[5]是个不确定的值。其实导致结果什么情况有可能,也有可能正确哦,比如a[5]比你输入的值都要大时,那它就会排在排完序的数字最后面(程序其实给了6个数排序,而不是你输入的5个),但输出的时候控制只输出5个数字,导致最后一个数字没有输出,就是最大的a[5],导致隐藏了错误(把输出循环i&n改成i&n+1就清楚了)。所以程序要多调试,结果对了程序也不一定对的。
&&&&&程序的最终修改当然就是把最开始的i=0改成i=1就对了。一个简单的程序,收获颇丰。编码认真仔细很总要啊!谨记谨记!!!
&&& 大四了,寻找实习中……地点哪里都可以,首选当然广东了,因为我系广东清远既,但而家系赣州读书。哪个朋友有门路的望告诉我,无限感激啊!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13196次
排名:千里之外
原创:16篇
(10)(3)(3)Excel 运行时错误9下标越界的处理方法
Excel中vba提示下标超界,说明对象不存在或者数组元素不存在。
  举个简单的例子:工作表中没有&1月&这个工作表,却用Sheets(&1月&);数组定义的是arr(1 to 10),却用Arr(11),都会出现下标越界的提示。
  简单的理解:下标越界就是引用超出了所在的范围。
  当我们在excel的VBA中输入下面代码,运行,就会出现&运行时错误9下标越界&的提示。代码如下:
Dim arr() As String
arr(1) = &你好&
  其实上面的&运行时错误9下标越界&是因为定义的动态数组没有确定维数和尺寸。定义成固定维数和尺寸的,或用Redim界定一下维数和尺寸即可解决此问题。
  改正后的代码如下:
Dim arr() '定义一个动态数组
Dim i As Integer
ReDim arr(1 To 3) '定义一个3个元素的数组,并且对数组进行初始化
arr(1) = 3
arr(2) = 4
arr(3) = 5
'在下面语句重新定义一个10个元素的数组,清除前面的元素,并重新分配新的存储变量
ReDim arr(1 To 10)
For i = 1 To 10
arr(i) = i
标签(Tag):
------分隔线----------------------------
------分隔线----------------------------后使用快捷导航没有帐号?
只需一步,快速开始
查看: 5195|回复: 10
split生成二维数组的问题
UID171253在线时间 小时积分5026帖子离线17186 天注册时间
880|450|120,420|230|350
我想把以上6个数字生成一个二维数组,第一个用&,&分隔,第二个用&|&分隔,然后通过数组把每一个数调用出来,请问怎实现
& && && && &场地/时间& && && && && && && && && && && && && &&&价格& && && && && && && && &&&库存
11-,12-& &&&880|450|120,420|230|350& &&&50|30|20,25|17|39
然后通过数组循环或其它方法写出
11& && & 880,450,120& &50,30,20
12& && & 420,230,350& &25,17,39
并且每一种价格对应一种库存
UID153322在线时间 小时积分164帖子离线17186 天注册时间
初级会员, 积分 164, 距离下一级还需 36 积分
a=split(“880|450|120,420|230|350”,“,”)
b=split(a(0),&|&)
c=split(a(1),&|&)
UID171253在线时间 小时积分5026帖子离线17186 天注册时间
a=split(&880|450|120,420|230|350&,&,&)
b=split(a(0),&|&)
c=split(a(1),&|&)
调用时怎么调用呢?
response.Write(a(0,0))& &这样的话会说下标越界,如果事先用dim生明一个二维数组就会提示类型不匹配
UID203413在线时间 小时积分187帖子离线17186 天注册时间
初级会员, 积分 187, 距离下一级还需 13 积分
如果事先用dim生明一个二维数组就会提示类型不匹配
用cint()函数转换一下.
UID171253在线时间 小时积分5026帖子离线17186 天注册时间
怎么转?麻烦能说清楚些吗
UID171253在线时间 小时积分5026帖子离线17186 天注册时间
有知道的吗,我真的急用啊.谢谢
UID173014在线时间 小时积分6078帖子离线17186 天注册时间
cint转化什么?是看见数字了就转?
楼主看看jyq200的帖子,就是答案吧。
UID171253在线时间 小时积分5026帖子离线17186 天注册时间
帖子看过了
a=split(“880|450|120,420|230|350”,“,”)
b=split(a(0),&|&)
c=split(a(1),&|&)
意思也能明白,单独执行这三句也不会出错,但不能到此为止呀.我的最终目的是要用数组的形式把它调用出来,用response.write写出来呀,应该怎么写呢.
比如我写出来第一个数880应该用数组怎么写呢
麻烦版主能说详细些吗
UID173014在线时间 小时积分6078帖子离线17186 天注册时间
你不会而且比较懒,对不对?
&%
On Error Resume Next
Dim aa
str=&880|450|120,420|230|350|500|100|500&
aa=UBound(split(str,&,&))
a=split(str,&,&)
b=UBound(split(a(0),&|&))
c=UBound(split(a(1),&|&))
If b&c Then
d=b
Else
d=c
End If
Dim temp()
ReDim temp(d,aa)
For i=0 To aa
& & & &&&For j=0 To d
& & & &&&response.write(&第&&i&&行为:&)
& & & & & & & && &temp(j,i)=Split(split(str,&,&)(i),&|&)(j)
& & & & & & & && &response.write(temp(j,i)&&&hr/&&)
& & & &&&Next
%&
复制代码
.
第0行为:880
--------------------------------------------------------------------------------
第0行为:450
--------------------------------------------------------------------------------
第0行为:120
--------------------------------------------------------------------------------
第0行为:
--------------------------------------------------------------------------------
第0行为:
--------------------------------------------------------------------------------
第0行为:
--------------------------------------------------------------------------------
第1行为:420
--------------------------------------------------------------------------------
第1行为:230
--------------------------------------------------------------------------------
第1行为:350
--------------------------------------------------------------------------------
第1行为:500
--------------------------------------------------------------------------------
第1行为:100
--------------------------------------------------------------------------------
第1行为:500
复制代码
下次这样我就锁了。
第二次比较去最大的ubound值,循环检查,你自己写,以上针对特殊的
str=&880|450|120,420|230|350|500|100|500&复制代码
你慢慢思量一下
UID228129在线时间 小时积分669帖子离线17186 天注册时间
高级会员, 积分 669, 距离下一级还需 331 积分
对的,可以用ubound取得数组的上限,
a=split(“880|450|120,420|230|350”,“,”)
b=split(a(0),&|&)
c=split(a(1),&|&)
for i=0 to ubound(b)
response.write b(i)
UID482954在线时间 小时积分12帖子离线17186 天注册时间
新手上路, 积分 12, 距离下一级还需 38 积分
何必这么复杂,四行搞定
a=split(“880|450|120,420|230|350”,“,”)
b=split(a(0),&|&)
c=split(a(1),&|&)
arr=array(b,c)
Powered by

我要回帖

更多关于 vba 下标越界 的文章

 

随机推荐