| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 729 人关注过本帖
标题:新手邮购了《Visual Basic从入门到精通》,仍然解决不了一个小问题
只看楼主 加入收藏
O涅槃O
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-12-20
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
新手邮购了《Visual Basic从入门到精通》,仍然解决不了一个小问题

各位高人,我习惯了用Excel的宏,又买了VB教程,想自学成才;但由于不是科班出身,一个小问题已经困扰7日,不得而解啊,请指点迷津。

我的问题是:我有一段代码,是循环调用的,如下述第一部分; 那么如何把它正确地组织到我的EXCEL的宏(见下述第二部分)里边啊?

第一部分:
——————————————————————————
Sub aaa(i As Long)
    Sheets("Term").Select
    Range("S" & i & ":AB" & i).Select
    Selection.Copy
    Sheets("New Test").Select
    Range("O" & i).Select
    ActiveSheet.Paste
End Sub
    For i = 1 To 163
              aaa i
    Next
————————————————————————————

第二部分:
Sub Macro1()
'
' Macro1 Macro
'
' 快捷键: Ctrl+q
'
    Application.ScreenUpdating = False

' 此处省略一些无关代码
' 我想把前述第一部分加到此处(但总出错,说我“ByRef参数类型不符”或者什么没有定义好?或者说我缺少半个括号...云里雾里啊)

' 下边是接下来的无关的代码
    Range("AG3:AT3").Select
    Selection.Copy
    Sheets("Cnclsn").Select
    Application.ScreenUpdating = True
End Sub

[ 本帖最后由 O涅槃O 于 2012-12-21 08:50 编辑 ]
搜索更多相关主题的帖子: EXCEL Excel 如何 
2012-12-21 08:44
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:7 
不知道你怎么加的,
再关键的是看你的代码,不知道你后面要干什么。

第一部分的代码就有错误。
----------------------------
Sub aaa(i As Long)
    Sheets("Term").Select
    Range("S" & i & ":AB" & i).Select
    Selection.Copy
    Sheets("New Test").Select
    Range("O" & i).Select
    ActiveSheet.Paste
End Sub
'end sub 语句后面不允许出现 需要执行的命令和语句。只能出现 函数或过程的定义,注释 三种内容。
    For i = 1 To 163
              aaa i
    Next
--------------

另外,在 一个 过程的中不允许再出现另一个过程的定义。
如果你增加时,把包括 sub aaa(i as long) 一起复制进去,肯定是报错的。

如果你仅仅是完成 1 到 163 的调用,那么你把
    For i = 1 To 163
              call aaa(i)
    Next
这三行放到你程序里
然后 这些
Sub aaa(i As Long)
    Sheets("Term").Select
    Range("S" & i & ":AB" & i).Select
    Selection.Copy
    Sheets("New Test").Select
    Range("O" & i).Select
    ActiveSheet.Paste
End Sub
是单独放一个模块文件的。

[ 本帖最后由 风吹过b 于 2012-12-21 09:39 编辑 ]

授人于鱼,不如授人于渔
早已停用QQ了
2012-12-21 09:34
O涅槃O
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-12-20
收藏
得分:0 
回复 2楼 风吹过b
谢谢风吹过大侠的好心相助!
按您的指点,我的全部代码改成了下边的写法。在我运行第二个模块的程序的时候,被指出Call aaa i 这里“缺少:语句结束”。请指教。

在第二个模块里:
——————————————————————————
Sub aaa(i As Long)
    Sheets("Term").Select
    Range("S" & i & ":AB" & i).Select
    Selection.Copy
    Sheets("New Test").Select
    Range("O" & i).Select
    ActiveSheet.Paste
End Sub
————————————————————————————

在第一个模块里:

Sub Macro1()
'
' Macro1 Macro
'
' 快捷键: Ctrl+q
'
    Application.ScreenUpdating = False
    For i = 1 To 163
             Call aaa i
    Next

    Range("AG3:AT3").Select
    Selection.Copy
    Sheets("Cnclsn").Select
    Application.ScreenUpdating = True
End Sub
2012-12-21 12:06
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
标准写法是  call aaa(i)  ,注意有一个括号。
简略写法就是 你第一楼的写法   aaa  i
没有 call 单词,也没括号。

授人于鱼,不如授人于渔
早已停用QQ了
2012-12-21 15:58
O涅槃O
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-12-20
收藏
得分:0 
谢谢指教。我改正了call的写法,却仍然有下述红字所说的错误:

Sub bbb()
    For i = 1 To 163
              Call aaa(i)  编译错误:ByRef 参数类型不符
    Next
(接下来是复制和粘贴的指令,这里省略了)
End Sub

上述是写在模块2里边的。

我已经预先把aaa写在同一个EXCEL文档的模块1里边了,全文如下:
Sub aaa(i As Long)
    Sheets("Term").Select
    Range("S" & i & ":AB" & i).Select
    Selection.Copy
    Sheets("New Test").Select
    Range("O" & i).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
 End Sub
还请继续指导一下。谢谢。
2012-12-21 20:59
剑拔弩张
Rank: 1
等 级:新手上路
帖 子:3
专家分:7
注 册:2012-12-25
收藏
得分:7 
新手新手,观光观光!不懂不懂。
2012-12-25 17:06
剑拔弩张
Rank: 1
等 级:新手上路
帖 子:3
专家分:7
注 册:2012-12-25
收藏
得分:0 
Sub aaa(i As Long) as long
试一下吧。
2012-12-25 17:08
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:7 
回复 7楼 剑拔弩张
别乱指点,只有函数可以指定返回类型,过程和子程序是没有返回值,不能指定类型的。
对于楼主的问题就是:写任何程序都要有定义变量的习惯,如果再专业点,还要有规划程序变量以及程序功能模块的习惯。
2012-12-25 22:22
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
Sub bbb()
    For i = 1 To 163
              Call aaa(i)  编译错误:ByRef 参数类型不符
    Next
…………
End Sub

Sub aaa(i As Long)
----------------
分析:
call aaa(i) 调用过程。那么 i 是按地址传递的(这是 默认情况)。
而 aaa 对这个 i 的要求是什么?
  Sub aaa(i As Long) 这句里,明确对 I 的要求是 long 类型的数据。
在这种情况下,只能传递 一个 long 类型的数据的地址过去。
那么,这里 传递的是 什么呢?
在调用时, i 是没有定义的,那么 i 的类型就应该是: Variant (变体类型)

Variant 是一种特殊的数据类型,它保存了以下二个部分的内容: 当前数据类型,数据值。
Variant 占用的内存长度超过 long 的内存占用。这里你传递一个 Variant 过去,自然不符合要求,编译器当然报错。
-------------------------
为什么存在 Variant 这种特殊的数据类型。这种变体类型 实际上是为了兼容 旧版的 BASIC 程序所产生的。
在 QB 之前,对于变量是不要 定义的,只要求定义 数组 ,在QB 时代,是建议对 变量 进行定义,不强制要求。
到了 VB 时代,是以兼容 QB 以基础的,那么就产生了这个兼容性问题,就出现了这个类型的变量。

------------------------
如何修改?
第一种方法:
在 Sub bbb()
这个函数里,定义一下 I 的数据类型。
dim i as long
这样就可以了。建议使用。
第二种方法。
在Sub aaa(i As Long) 这句里。
改成
Sub aaa(i)
这样也行了,但极力不建议这样做。这种写法只能给程序带来混乱和麻烦。

还有一种修改方法,就是 指定 传值的方式进行 调用。这种情况下,也很容易导致程序发生很难找到的错误。也不建议使用。
================================================
写在最后的话
要养成 7 楼所说的习惯:变量要定义。

授人于鱼,不如授人于渔
早已停用QQ了
2012-12-26 16:49
快速回复:新手邮购了《Visual Basic从入门到精通》,仍然解决不了一个小问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048943 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved