关于VBA循环问题请指教!
我现在想在EXCEL表中的第一列中查找出值为'AA'(有很多行)的所在行的行号,并付给变量K,用MSGBOX(K),显示出来,请问这个循环怎么写呀?请大家指教! 问题点数:20、回复次数:10Top
1 楼yyzzff(呆头鱼)回复于 2004-08-05 16:10:41 得分 0
没人知道吗?Top
2 楼dunkel(内心和夜 哪个黑)回复于 2004-08-05 20:23:19 得分 18
' 这个应该很简单吧?
Sub ShowAA()
Dim xCell As Range
Dim xUsed As Range
Dim xRange As Range
Dim K As String
' 使用 UsedRange 是为了不必要的对没有数据区域的操作
Set xUsed = ActiveSheet.UsedRange
' 形成首列中可能存在数据的范围
Set xRange = Range(Cells(xUsed.Row, 1), Cells(xUsed.Rows.Count + xUsed.Row - 1, 1))
K = ""
' 逐个单元格进行检查
For Each xCell In xRange
If xCell.Text = "AA" Then
K = K & Str(xCell.Row) ' 是 'AA' 的话, 就将行号保存到 K
End If
Next xCell
MsgBox K ' 最后显示所有为 'AA' 的行号
Set xRange1 = Nothing: Set xRange = Nothing
End Sub ' End of ShowAA()Top
3 楼yyzzff(呆头鱼)回复于 2004-08-05 22:05:37 得分 0
可我现在想要把
AA
2004-2-3
2004-3-4
2004-4-4
AA
2004-2-4
2004-3-4
AA
2004-3-4
2004-5-6
这样一个EXCEL表中的AA所在的行号,以及中间日期的行数!日期的行数很不好确定,因为其中包含有空行,这要用循环实现,不知道怎么写才好!不知道是不是可以先清掉其中的空行,但这怎么做请指教!Top
4 楼dunkel(内心和夜 哪个黑)回复于 2004-08-06 06:58:04 得分 0
如果只是要剔除空行的话, 这个不算太难吧. 我想可以增加两个变量, 一个保存上个 'AA' 的行号, 一个逐行检查是同时看看是否为空行, 是的话就增 1. 在找到下一个 'AA' 行时, 当前行号, 上个行号, 还有这个空行数, 一减就可以了. 至于这个行数, 即可以用 K 的方法保存, 也可以用动态数组. 前者做的时候方便, 但后续操作繁些; 后者正相反. 所以, 具体用那个, 看你实际情况了.Top
5 楼yyzzff(呆头鱼)回复于 2004-08-06 22:29:10 得分 0
For Each xCell In xRange
If xCell.Text <> "AA" And xCell.Text <> "" Then
l = l + 1
End If
If xCell.Text = "AA" Then
K = xCell.Row
m = K - 1
n = l - 1 '两个AA之间记录的行数
MsgBox m
MsgBox n
l = 0
End If
Next xCell
这段是按你所说的写的,要得到的是AA所在行号和两个AA之间的记录的行数,但是现在有个问题解决不了,就是在EXCEL表的第一个AA前有两排是表头,每次运行后第一个N就是不需要的,因为我要是从第一个AA到第二个AA之间的行数以及以后的行数,并在后面需要调用,请问用什么办法可以让第一个N不要!再就是最后一个AA后面还有几行记录,可N只显示到最后一AA和倒数第二个AA之间的行数,最后一个AA后的记录行数就不显示出来了,这个用什么方法可以解决呢?由于是新手,实在不好意思!请多指教!Top
6 楼dunkel(内心和夜 哪个黑)回复于 2004-08-07 08:44:18 得分 0
>> 在EXCEL表的第一个AA前有两排是表头 ... 请问用什么办法可以让第一个N不要
如果表格的格式是固定的, 亦即第一个 'AA' 的位置是已知的话 (比如总是在第三行, 前面两行是表头), 很简单啊, 只要调整一下 xRange 的范围就可以了:
Set xRange = Range(Cells(4, 1), Cells(xUsed.Rows.Count + xUsed.Row - 1, 1))
' 即现在从第四行开始检查匹配, 跳过第一个的 'AA' 行
>> 最后一个AA后的记录行数就不显示出来了
这个, 可以在 Next xCell 之后 MsgBox n 就可以显示最后一组的有效记录行数了
>> n = l - 1 '两个AA之间记录的行数
这里, l 就是两个 AA 之间的有效记录行数吧, 为什么还要 'l - 1' ?Top
7 楼yyzzff(呆头鱼)回复于 2004-08-07 13:03:14 得分 0
n=l-1这是因为第个AA的上一行还有一行内容,是不需要计算在行数内的!
现在发现这样还是不行,表格的格式是固定的不错,第一个AA总是在第三行,若xrange的范围从第四行开始,那么第一个AA的行号就不能得到,因为K在下面的一个循环中要用不能单独用一次,若把xrange的范围改成从第三行开始,那么第一个行数就变成-1了,而这个n也是在后面的循环中要用的,不知道怎么解决才好!
以下是程序
For Each xCell In xRange
If xCell.Text <> "AA" And xCell.Text <> "" Then
l = l + 1
End If
If xCell.Text = "AA" Then
K = xCell.Row
m = K - 1'AA所在的行号
n = l - 1'两个AA间的行数
MsgBox m //第一次循环M到这儿还是第一个AA的行数
Windows("table.xls").Activate
q = K
For ii = 1 To n
q = q + 1 //但到这儿就成第二个AA的行数了(xrange从第三行开始的情况下)
newworksheets.Cells(i, 1).Value = oldworksheets.Cells(m, 3).Value
newworksheets.Cells(i, 2).Value = oldworksheets.Cells(m, 2).Value
newworksheets.Cells(i, 3).Value = oldworksheets.Cells(q, 1).Value
newworksheets.Cells(i, 4).Value = oldworksheets.Cells(q, 2).Value
newworksheets.Cells(i, 5).Value = b
i = i + 1
b = b + 1
Next ii
l = 0
End If
Next xCell
Set xRange1 = Nothing: Set xRange = Nothing
MsgBox l
End If
Top
8 楼wodeyouxian(人生如梦)回复于 2004-08-07 16:02:52 得分 2
Range("A1:A250").Name = "得分" '先将来用的列命名
Dim i As Integer
For i = 1 To Range("得分").Cells.Count '遍历这一列
if(Range("得分").Cells(i).Value=="AA") then
msgbox("ActiveCell.Column ") '这里就是显示你要的东西了
endif '连K都省了
next iTop
9 楼dunkel(内心和夜 哪个黑)回复于 2004-08-07 16:27:36 得分 0
那还是从开始就进行检查, 设个逻辑变量, 初始值为 False, 找到第一个 'AA' 后置为 True, 如果这个变量为 True 时在统计有效数据项数就是了. 虽然这样速度上有些微的牺牲.Top
10 楼yyzzff(呆头鱼)回复于 2004-08-08 08:23:40 得分 0
谢谢了,问题已解决,可能要多设一个变量,来保存前一个AA所在的行号!Top




