VBA问题,两个vba 数组赋值A(1,1 To 1,5)和B(1,1 To 1,5),求A(1,1)-B(1,1)+A(1,2)-B(1,2)+...A(1,5)-B(1,5)

两个文件方法相同,可一个正常,另一个有问题,不知何故?(已解决) - 『 VBA交流 』 -
OFFICE精英俱乐部 OFFICE|WORD|EXCEL|ACCESS|OUTLOOK|PPT|VBA|软件开发|办公应用 - Powered by Discuz!
两个文件方法相同,可一个正常,另一个有问题,不知何故?(已解决)
UID51142&帖子2794&精华1&积分4361&水晶4283 枚&威望10 点&阅读权限80&性别男&注册时间&
两个文件方法相同,可一个正常,另一个有问题,不知何故?(已解决)
第一个文件运行正常,第二个文件稍加改动,按说没有任何技术上的增减,方法基本一样。
可不知为何,第二个文件就是不能运行。重复作了一天了,看来需要高手帮忙了!
第二个文件,未完成...
[ 本帖最后由 hshj 于
18:24 编辑 ]
附件: 您需要才可以下载或查看附件。没有帐号?
俺是winxp+office2003
UID51142&帖子2794&精华1&积分4361&水晶4283 枚&威望10 点&阅读权限80&性别男&注册时间&
顺便把有问题的这段代码贴出来:
《自动筛选数据》
Private Sub CommandButton1_Click()
& & Dim FirstAddress As String, Arr()
& & Dim Rng As Range, Rnge As Range
& & Dim c%, i%, j%, k%, r%
& & Dim aa As Worksheet, bb As Worksheet, cc As Worksheet
& & Set aa = Sheets(&原始数据&)
& & Set bb = Sheets(&辅助计算表&)
& & Set cc = Sheets(&计算书&)
& & 'On Error Resume Next '最后找不到结果时防止代码中断
& & c = bb.Range(&IV2&).End(xlToRight).Column
& & r = bb.UsedRange.Rows.Count
& & If c = 1 Then MsgBox &名称没有设定&: Exit Sub
& & If r && 2 Then bb.Rows(&3:& & r).ClearContents
& & r = cc.UsedRange.Rows.Count
& & If r && 1 Then cc.Rows(&2:& & r).ClearContents
& & Application.ScreenUpdating = False
& & k = 3: i = 2
& & Do While aa.Cells(1, k) && &&
& & With aa.Columns(k)
& && &&&Do While bb.Cells(2, i) && &&
& && && && && &Set Rng = .Find(What:=bb.Cells(2, i), _
& && && && && && && && && & After:=.Cells(.Cells.Count), _
& && && && && && && && && & LookIn:=xlValues, _
& && && && && && && && && & LookAt:=xlPart, _
& && && && && && && && && & SearchOrder:=xlByColumns, _
& && && && && && && && && & SearchDirection:=xlNext, _
& && && && && && && && && & MatchCase:=False)
& && && && && &If Not Rng Is Nothing Then
& && && && && && & FirstAddress = Rng.Address: j = 0
& && && && && && & Do '循环搜索一种名称,把地址记入数组
& && && && && && && &&&ReDim Preserve Arr(j)
& && && && && && && &&&Arr(j) = Rng.Address: j = j + 1
& && && && && && && &&&Set Rng = .FindNext(Rng)
& && && && && && & Loop While Not Rng Is Nothing And Rng.Address && FirstAddress
& && && && && && & '在每个地址的后面搜索特征值的位置
& && && && && && & For j = 0 To UBound(Arr)
& && && && && && && &&&r = 7
& && && && && && && &&&Do While aa.Cells(r, 2) && &&
& && && && && && && &&&Set Rng = .Find(What:=aa.Cells(r, 2), _
& && && && && && && && && & After:=.Range(Arr(j)), _
& && && && && && && && && & LookIn:=xlValues, _
& && && && && && && && && & LookAt:=xlPart, _
& && && && && && && && && & SearchOrder:=xlByColumns, _
& && && && && && && && && & SearchDirection:=xlNext, _
& && && && && && && && && & MatchCase:=False)
& && && && && && && &&&If Not Rng Is Nothing Then
& && && && && && && && && &'从找到的位置向前二次搜索“图层:”的位置
& && && && && && && && &&&Set Rnge = .Find(What:=&图层:&, _
& && && && && && && && && && &After:=Rng, _
& && && && && && && && && && &LookIn:=xlValues, _
& && && && && && && && && && &LookAt:=xlPart, _
& && && && && && && && && && &SearchOrder:=xlByColumns, _
& && && && && && && && && && &SearchDirection:=xlPrevious, _
& && && && && && && && && && &MatchCase:=False)
& && && && && && && && && &'如果二次搜索的位置等于数组中记录的位置(交叉验证)
& && && && && && && && && &'则测试第一搜索位置的特征值后面是否为数字
& && && && && && && && && &If Rnge.Address = Arr(j) And Application.WorksheetFunction.IsNumber(Mid(Rng, Len(aa.Cells(r, 2)) + 1)) Then
& && && && && && && && && && &r = bb.Cells(65536, i).End(xlUp).Row + 1
& && && && && && && && && && &bb.Cells(r, i) = Right(Rng, Len(Rng) - Len(aa.Cells(r, 2)))
& && && && && && && && && && &Exit Do
& && && && && && && && && &End If
& && && && && && && &&&End If
& && && && && && && &&&r = r + 1
& && && && && && && &&&Loop
& && && && && && & Next j
& && && && && &End If
& && &&&i = i + 1
& && &&&Loop
& & End With
& & k = k + 1
& & Set Rng = Nothing: Set Rnge = Nothing
& & Application.ScreenUpdating = True
俺是winxp+office2003
UID19812&帖子7403&精华5&积分3799&水晶3528 枚&威望41 点&阅读权限110&性别男&注册时间&
After:=.Range(Arr(j))& &===& After:=Range(Arr(j))
UID51142&帖子2794&精华1&积分4361&水晶4283 枚&威望10 点&阅读权限80&性别男&注册时间&
原帖由 HOmT398 于
10:47 发表
After:=.Range(Arr(j))& &===& After:=Range(Arr(j))
可以运行了,但没有结果。
俺是winxp+office2003
UID19812&帖子7403&精华5&积分3799&水晶3528 枚&威望41 点&阅读权限110&性别男&注册时间&
原帖由 hshj 于
11:04 发表
可以运行了,但没有结果。
那就是代码的思路问题了 :P
UID51142&帖子2794&精华1&积分4361&水晶4283 枚&威望10 点&阅读权限80&性别男&注册时间&
问题解决了,多谢HOmT398 总监察!那个点“.”没能逃过你的眼睛,佩服!
虽然一切正常了,可是运行有点慢,不像find的风格,不知何故!
先贴出来再说:
Private Sub CommandButton1_Click()
& & Dim FirstAddress As String, Arr()
& & Dim Rng As Range, Rnge As Range
& & Dim c%, i%, j%, k%, r%, n%, Mr%, Mc%, w$
& & Dim aa As Worksheet, bb As Worksheet, cc As Worksheet
& & Set aa = Sheets(&原始数据&)
& & Set bb = Sheets(&辅助计算表&)
& & Set cc = Sheets(&计算书&)
& & 'On Error Resume Next '最后找不到结果时防止代码中断
& & Mr = aa.Cells(65536, 2).End(xlUp).Row
& & Mc = aa.Cells(1, 256).End(xlToLeft).Column
& & If Mr = 1 Then MsgBox &特征值没有设定&: Exit Sub
& & If Mc = 1 Then MsgBox &原始数据表中没有数据&: Exit Sub
& & c = bb.Range(&IV2&).End(xlToLeft).Column
& & r = bb.UsedRange.Rows.Count
& & If c = 1 Then MsgBox &名称没有设定&: Exit Sub
& & If r && 2 Then bb.Rows(&3:& & r).ClearContents
& & r = cc.UsedRange.Rows.Count
& & If r && 1 Then cc.Rows(&2:& & r).ClearContents
& & 'Application.ScreenUpdating = False
& & For k = 3 To Mc '遍及数据表各列
& & With aa.Columns(k)
& && && &For i = 2 To c '搜索计算表中各名称
& && && && && &Set Rng = .Find(What:=bb.Cells(2, i), _
& && && && && && & After:=.Cells(.Cells.Count), _
& && && && && && & LookIn:=xlValues, _
& && && && && && & LookAt:=xlPart, _
& && && && && && & SearchOrder:=xlByColumns, _
& && && && && && & SearchDirection:=xlNext, _
& && && && && && & MatchCase:=False)
& && && && && &If Not Rng Is Nothing Then
& && && && && && & FirstAddress = Rng.Address: j = 0
& && && && && && & Do '循环搜索一种名称,把地址记入数组
& && && && && && && &&&ReDim Preserve Arr(j)
& && && && && && && &&&Arr(j) = Rng.Address: j = j + 1
& && && && && && && &&&Set Rng = .FindNext(Rng)
& && && && && && & Loop While Not Rng Is Nothing And Rng.Address && FirstAddress
& && && && && && & '在每个地址的后面搜索特征值的位置
& && && && && && & For j = 0 To UBound(Arr)
& && && && && && && &&&For r = 7 To Mr '搜索各特征值
& && && && && && && && && &Set Rng = .Find(What:=aa.Cells(r, 2), _
& && && && && && && && && && & After:=Range(Arr(j)), _
& && && && && && && && && && & LookIn:=xlValues, _
& && && && && && && && && && & LookAt:=xlPart, _
& && && && && && && && && && & SearchOrder:=xlByColumns, _
& && && && && && && && && && & SearchDirection:=xlNext, _
& && && && && && && && && && & MatchCase:=False)
& && && && && && && && && &If Not Rng Is Nothing Then
& && && && && && && && && && &'从找到的位置向前二次搜索“图层:”的位置
& && && && && && && && && && &Set Rnge = .Find(What:=&图层:&, _
& && && && && && && && && && && & After:=Rng, _
& && && && && && && && && && && & LookIn:=xlValues, _
& && && && && && && && && && && & LookAt:=xlPart, _
& && && && && && && && && && && & SearchOrder:=xlByColumns, _
& && && && && && && && && && && & SearchDirection:=xlPrevious, _
& && && && && && && && && && && & MatchCase:=False)
& && && && && && && && && && &'如果二次搜索的位置等于数组中记录的位置(交叉验证)
& && && && && && && && && && &'则测试第一搜索位置的特征值后面是否为数字
& && && && && && && && && && &w = Mid(Rng, Len(aa.Cells(r, 2)) + 1, 1)
& && && && && && && && && && &If Rnge.Address = Arr(j) And Asc(w) &= 48 And Asc(w) &= 57 Then
& && && && && && && && && && && &n = bb.Cells(65536, i).End(xlUp).Row + 1
& && && && && && && && && && && &bb.Cells(n, i) = Right(Rng, Len(Rng) - Len(aa.Cells(r, 2)))
& && && && && && && && && && && &Exit For
& && && && && && && && && && &End If
& && && && && && && && && &End If
& && && && && && && &&&Next r
& && && && && && & Next j
& && && && && &End If
& && && &Next i
& & End With
& & Next k
& & Set Rng = Nothing: Set Rnge = Nothing
& & r = bb.UsedRange.Rows.Count
& & For i = 3 To r
& && &&&bb.Cells(i, 1) = i - 2
& & For i = 2 To c
& && &&&r = bb.Cells(65536, i).End(xlUp).Row
& && &&&cc.Cells(i, 1) = bb.Cells(2, i)
& && &&&cc.Cells(i, 2) = Application.WorksheetFunction.Sum(Sheets(&辅助计算表&).Columns(i))
& && &&&cc.Cells(i, 3).FormulaR1C1 = &=MyString(辅助计算表!R[& & 3 - i & &]C[& & i - 3 & &]:R[& & r - i & &]C[& & i - 3 & &])&
& & 'Application.ScreenUpdating = True
附件: 您需要才可以下载或查看附件。没有帐号?
俺是winxp+office2003
UID19812&帖子7403&精华5&积分3799&水晶3528 枚&威望41 点&阅读权限110&性别男&注册时间&
将Find的方法和数组结合
估计是应该比单单用Find方法要快些
毕竟可以一次写入单元格
而,如此反复查找,慢是没办法的
UID51142&帖子2794&精华1&积分4361&水晶4283 枚&威望10 点&阅读权限80&性别男&注册时间&
原帖由 HOmT398 于
18:30 发表
将Find的方法和数组结合
估计是应该比单单用Find方法要快些
毕竟可以一次写入单元格
而,如此反复查找,慢是没办法的
原意是想用Find的方法和数组结合,以便在处理大量数据时体现很好的速度。
可是我的office是2000,我早就发现这个版本不支持一维数组转置,所以,
也没能完全用“Find的方法和数组结合”,速度大打折扣!
如果是2000以上的版本,首先把结果存入数组,然后一次性放入表内,
速度将会很快。
不过,2000可能也有办法优化。有机会,再优化吧!
俺是winxp+office2003
[通过 QQ、MSN 分享给朋友]求答案,vb题把两个按升序从小到大排列的数列a(1),a(2)。。。a(n)和b(1),b(2)...b(n)合并成一个仍为升序排列的新数列,在新的数组中保存,并在文本框中显示。
求答案,vb题把两个按升序从小到大排列的数列a(1),a(2)。。。a(n)和b(1),b(2)...b(n)合并成一个仍为升序排列的新数列,在新的数组中保存,并在文本框中显示。 5
例如,原有a数组含有元素1,3,5,7,9,b数组含有元素2,4,6,8,合并保存在c数组内,则c数组元素为1,2,3,4,5,6,7,8,9。
代码:
&
&
Private Sub Command1_Click()&&& Dim a(1 To 5) As Integer, b(1 To 4) As Integer, c(1 To 9) As Integer&&& Dim i As Integer, j As Integer, k As Integer, t As Integer&&& k = 1&&& For i = 1 To 5&&&&&&& a(i) = 2 * i - 1&&&&&&& c(k) = a(i)&&&&&&& k = k + 1&&& Next i&&& For i = 1 To 4&&&&&&& b(i) = 2 * i&&&&&&& c(k) = b(i)&&&&&&& k = k + 1&&& Next i&&& Print "合并后C的值是:"&&& For i = 1 To 8&&&&&&& For j = i + 1 To 9&&&&&&&&&&& If c(j) & c(i) Then&&&&&&&&&&&&&&& t = c(j)&&&&&&&&&&&&&&& c(j) = c(i)&&&&&&&&&&&&&&& c(i) = t&&&&&&&&&&& End If&&&&&&& Next j&&& Next i&&& For i = 1 To 9&&&&&&& Print c(i)&&& Next iEnd Sub
&
&
&
图:
&
的感言: 谢谢
等待您来回答
编程领域专家以下两个数组的维数一样吗?为什么?
Sub 数组1()
arr = [a1:e1]&&
Sub 数组3()
arr = [{&A&,&B&,&C&,&D&,&E&}]& &&&
在线时间3889 小时经验7168 威望0 最后登录注册时间阅读权限95UID354161积分7168帖子精华0分享0
积分排行111帖子精华0微积分0
arr = [a1:e1]&&这是二维数组呢
在线时间168 小时经验262 威望0 性别保密最后登录注册时间阅读权限20UID2611410积分262帖子精华0分享0
EH初级, 积分 262, 距离下一级还需 88 积分
积分排行4749帖子精华0微积分0
dragonthree 发表于
arr = [a1:e1]&&这是二维数组呢
谢谢侠圣!但这个不也是一行的数据吗? 第二个也是一行的数据定义的啊?
它们的本质区别在哪里呀?
在线时间5071 小时经验12123 威望10 性别女最后登录注册时间阅读权限95UID218774积分13773帖子精华1分享0
积分排行34帖子精华1微积分0
楼主,首先,一样不一样,不是你说了算,而是微软工程师说了算。
在线时间5071 小时经验12123 威望10 性别女最后登录注册时间阅读权限95UID218774积分13773帖子精华1分享0
积分排行34帖子精华1微积分0
楼主就是一个数组小白,需要从头学习数组知识。
在线时间168 小时经验262 威望0 性别保密最后登录注册时间阅读权限20UID2611410积分262帖子精华0分享0
EH初级, 积分 262, 距离下一级还需 88 积分
积分排行4749帖子精华0微积分0
香川群子 发表于
楼主,首先,一样不一样,不是你说了算,而是微软工程师说了算。
香川老师说的对,就这个贴子的问题,第一个是数组是二维的,都是用一行数据定义的,不明白为什么第二个就是一维的? 求香川老师给个解。
在线时间5071 小时经验12123 威望10 性别女最后登录注册时间阅读权限95UID218774积分13773帖子精华1分享0
积分排行34帖子精华1微积分0
【数组】定义
连续可索引的具有相同内在数据类型的元素所成的集合,数组中的每一元素具有唯一索引号。更改其中一个元素并不会影响其它元素。
其中、数组中的每一元素具有的唯一的索引号,可以类比为坐标。
那么,决定坐标的参数个数,我们叫做数组的维度,可以类比为空间维度。(数组允许使用维度范围1 - 60)
一维数组,就是说只用一个唯一的Index索引值即可对应每一个数组元素。
形式为 arr(1 To m)&&其中m为整数,可以类比为一个直线数轴。
二维数组,同时使用两个Index索引值来得到唯一确定的坐标,并以此对应每一个数组元素。
形式为 arr(1 To m,1 To n)&&其中m、n为整数,可以类比为一个平面坐标系。
工作表区域内任意单元格区域,都是一个二维结构的数组。
其中第1维度的 1 To m 对应为行数,即 1 - 65536 (或 1048576)
& &而第2维度的 1 To n 对应为列数,即 1 -256 (或 16384)
当 m=1 时,即 arr(1 To 1,1 To n) 时,数据范围对应为 第1行的第1到n列。
当 n=1 时,即 arr(1 To m,1 To 1) 时,数据范围对应为 第1列的第1到m行。
所以,任何一个工作表单元格区域,不论是否多行多列,还是只有1行或1列,
把它们直接导入VBA数组时,都是二维数组。
你先记住这些吧。
在线时间168 小时经验262 威望0 性别保密最后登录注册时间阅读权限20UID2611410积分262帖子精华0分享0
EH初级, 积分 262, 距离下一级还需 88 积分
积分排行4749帖子精华0微积分0
香川群子 发表于
【数组】定义
连续可索引的具有相同内在数据类型的元素所成的集合,数组中的每一元素具有唯一索引号。更改 ...
终于明白了! 之前是听人说VBA里面的一维数组对应于单元格区域的一行!看来不是这样的!
在线时间5071 小时经验12123 威望10 性别女最后登录注册时间阅读权限95UID218774积分13773帖子精华1分享0
积分排行34帖子精华1微积分0
本帖最后由 香川群子 于
17:28 编辑
HC天南海北 发表于
终于明白了! 之前是听人说VBA里面的一维数组对应于单元格区域的一行!看来不是这样的!
【VBA里面的一维数组对应于单元格区域的一行。】
这句话部分正确。
当把VBA中的数组内容输出到工作表区域时,存在以下限制:
1. 二维数组可以直接整体输出 (行数、列数不超过工作表范围时)
& &Dim arr(1 To 10, 1 To 2)
& &[a1:b10]=arr
2. 三维及以上数组无法直接输出
& & Dim arr(1 To 2, 1 To 10, 1 To&&2)
&&[a1:b10]=arr&&这样是错误的无法执行。
3. 一维数组的输出。
a. 可以按照等同于单行区域,即1行多列区域进行直接输出
& & 例如:
& & Dim arr(1 To 10)
& & [a1:j1] = arr& &或 [a1].Resize(,10) = arr
b. 如需按照单列区域、即多行1列区域进行输出时,必须使用数组转换公式处理一下
& & 例如:
& & Dim arr(1 To 10)
& & [a1:a10] = WorksheetFunction.Transpose(arr)
或 [a1].Resize(10) = WorksheetFunction.Transpose(arr)
那么,别人对你说的那句话,就只是蓝色字对应的部分的意思。
但需注意,仅此而已,不包含其它的意思。呵呵。
也就是说,正确的、完整的说法应该是:
【VBA中的一维数组在向工作表区域进行内容输出时,可以直接等效于一个单行多列区域。】
通俗的说法就成为:【VBA里面的一维数组(输出时)(可以直接)对应于单元格区域的一行(而不需要进行Transpose转换)。】
在线时间168 小时经验262 威望0 性别保密最后登录注册时间阅读权限20UID2611410积分262帖子精华0分享0
EH初级, 积分 262, 距离下一级还需 88 积分
积分排行4749帖子精华0微积分0
香川群子 发表于
【VBA里面的一维数组对应于单元格区域的一行。】
这句话部分正确。
香川老师解释得好详细!现在知道了,那我再问老师一个问题:我上面的两个数组
arr = [a1:e1]&&和& &arr = [{&A&,&B&,&C&,&D&,&E&}]& && && &虽然都可看成是一行数据,之所以它们的维数不一样,是因为定义的方式不一样, 没有其他的原因了吧?& &&&
积分≥4700即可申请
金牌优秀会员
金牌优秀会员奖章No.3
金牌优秀会员
金牌优秀会员奖章No.2
金牌优秀会员
金牌优秀会员奖章No.1
优秀会员奖章No.4
优秀会员奖章No.3
优秀会员奖章No.2
优秀会员奖章No.1
- 注意:自起,未完成邮箱认证的会员将无法发帖!如何完成邮箱认证?请点击下方“查看”。
关注我们,与您相约微信公众平台!
Copyright 1999 - 2017 Excel Home. All Rights Reserved.本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!
Powered by
本站特聘法律顾问:徐怀玉律师 李志群律师 &&急求C语言大神帮我做两题。我是初学者哦,要用最简单的数组知识做。1、假设有两个数组,分别为a[5]={1,3,5,7,9}和b[7]={2,4,6,8,10,15,17},将这两个有序数组合并存放到另一个一维数组中,并保证合并后的一维数组也是有序的。&br/&2、从键盘上输入两个字符串,
急求C语言大神帮我做两题。我是初学者哦,要用最简单的数组知识做。1、假设有两个数组,分别为a[5]={1,3,5,7,9}和b[7]={2,4,6,8,10,15,17},将这两个有序数组合并存放到另一个一维数组中,并保证合并后的一维数组也是有序的。2、从键盘上输入两个字符串,
代码有点发不上去,加q发给你,
int a[5]={1,9,5,7,9},b[7]={2,4,6,8,10,15,17},s[12],c,d,t=0;
for (c=0;c&5;c++)
s[c]=a[c];
for (c=5;c&12;c++)
s[c]=b[c-5];
for (c=0;c&12;c++)
printf (&%d &,s[c]);
printf (&\n&);
for (c=0;c&12;c++)
{ for (d=c+1;d&1
2;d++) { if (s[c]&s[d]) { t=s[c];s[c]=s[d];s[d]=t; } } } for (c=0;c&12;c++) printf (&%d &,s[c]); }
int main(void) { char a[2][100];/*能输入两个串,每个字符串长度不能超过100,你自己可以根据需要改的*/ for (i = 0; i & 2; i++) { gets(a[i]); } for (i = 0; i & 2; i++) { puts(a[i]); } return 0; }
提问者 的感言:谢谢你帮了我大忙!
其他回答 (4)
饿啊啊啊是是是
1.首先把a,b合并,然后再排序
等待您来回答
编程领域专家

我要回帖

更多关于 vba 数组赋值 的文章

 

随机推荐