Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1964|回复: 6

[已解决]求高手指出宏代码错误指出

[复制链接]
发表于 2012-10-11 21:17 | 显示全部楼层 |阅读模式
题目是蓝版第11讲的题目:要求选定一个区域,执行宏后,选定的是以前选定的区域中所有大于0的数字的行
Sub 选取所在行()
Dim rg As Range, rg1 As Range, i As Byte
  For Each rg In Selection
  If Application.WorksheetFunction.IsNumber(rg) = True And rg > 0 Then
    i = i + 1
    If i = 1 Then rg1 = rg
      Else: Set rg1 = Union(rg1, rg)
    End If
   
    End If
  Next
  rg1.EntireRow.Select
End Sub
运行后,显示:end if没有if块,这是咋回事啊,我两个if语句不都有end if吗?请高手指导!
最佳答案
2012-10-11 22:44
本帖最后由 hwc2ycy 于 2012-10-11 22:45 编辑
  1. Sub 选取所在行()
  2.     Dim rg As Range, rg1 As Range, i As Byte
  3.     For Each rg In Selection
  4.         If Application.WorksheetFunction.IsNumber(rg) = True And rg > 0 Then
  5.         'THEN后无非注释语句,为IF块
  6.             i = i + 1
  7.             If i = 1 Then Set rg1 = rg Else Set rg1 = Union(rg1, rg)
  8.             'THEN后有非注释语句,为单行形式
  9.         End If
  10.     Next
  11.     rg1.EntireRow.Select
  12. End Sub
复制代码
发表于 2012-10-11 22:34 | 显示全部楼层
next前面的END IF是多余的。
  Else: Set rg1 = Union(rg1, rg) 是单行语句,而非块,所以也就不需要END IF来结束。
然后上面的rg1赋值也有问题
rg1是一个对象,向对象赋值需用SET 语句。
回复

使用道具 举报

发表于 2012-10-11 22:38 | 显示全部楼层
If condition Then [statements][Else elsestatements]

或者,可以使用块形式的语法:

If condition Then
[statements]

[ElseIf condition-n Then
[elseifstatements] ...

[Else
[elsestatements]]

End If

回复

使用道具 举报

发表于 2012-10-11 22:41 | 显示全部楼层
说明
可以使用单行形式(第一种语法)来做短小简单的测试。但是,块形式(第二种语法)则提供了更强的结构化与适应性,并且通常也是比较容易阅读、维护及调试的。
注意 在单行形式中,按照 If...Then 判断的结果也可以执行多条语句。所有语句必须在同一行上并且以冒号分开,如下面语句所示:
If A > 10 Then A = A + 1 : B = B + A : C = C + B
在块形式中,If 语句必须是第一行语句。其中的 ElseElseIf,和 End If 部分可以只在之前加上行号或行标签。If 块必须以一个 End If 语句结束。
要决定某个语句是否为一个 If 块,可检查 Then 关键字之后是什么。如果在 Then 同一行之后,还有其它非注释的内容,则此语句就是单行形式的 If 语句。
回复

使用道具 举报

发表于 2012-10-11 22:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hwc2ycy 于 2012-10-11 22:45 编辑
  1. Sub 选取所在行()
  2.     Dim rg As Range, rg1 As Range, i As Byte
  3.     For Each rg In Selection
  4.         If Application.WorksheetFunction.IsNumber(rg) = True And rg > 0 Then
  5.         'THEN后无非注释语句,为IF块
  6.             i = i + 1
  7.             If i = 1 Then Set rg1 = rg Else Set rg1 = Union(rg1, rg)
  8.             'THEN后有非注释语句,为单行形式
  9.         End If
  10.     Next
  11.     rg1.EntireRow.Select
  12. End Sub
复制代码
回复

使用道具 举报

发表于 2012-10-11 22:47 | 显示全部楼层
用好代码缩进,代码间的关系就很清楚,从属关系一目了然。
回复

使用道具 举报

 楼主| 发表于 2012-10-12 21:26 | 显示全部楼层
hwc2ycy 发表于 2012-10-11 22:44

受教了,非常感谢指导
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 15:20 , Processed in 0.336090 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表