Excel精英培训网

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

[已解决]解析代码?

[复制链接]
发表于 2013-9-16 20:14 | 显示全部楼层 |阅读模式
本帖最后由 sdfsdfs 于 2013-9-16 22:51 编辑

Sub test()
    Application.ScreenUpdating = False
    Columns("A:I").ClearContents
    WOK = Dir(ThisWorkbook.Path & "\*.xls")
    Do While WOK <> ""
        If WOK <> ThisWorkbook.Name Then
            With Workbooks.Open(ThisWorkbook.Path & "\" & WOK)
                For i = 1 To .Sheets(1).Range("A65536").End(3).Row
                   If ThisWorkbook.Sheets(1).Range("A65536").End(3).Row = 1 Then
                        W = 10
                    Else
                        W = 2
                    End If
                    If .Sheets(1).Range("H" & i) = "备注" Then .Sheets(1).Rows(i).Copy ThisWorkbook.Sheets(1).Range("A65536").End(3)(W)
                Next
                .Close False
            End With
        End If
        WOK = Dir
    Loop
    Application.ScreenUpdating = True
End Sub
描红的地方想不明白,一般End(3).Row,怎么End(3)(W)???



最佳答案
2013-9-16 21:48
本帖最后由 yyyydddd8888 于 2013-9-16 21:56 编辑
sdfsdfs 发表于 2013-9-16 21:41
Range("A65536").End(3)(W)
如果只有A1单元格有数据,代码就是Range("A1")(W) ,怎么是A(W) ???

如果只有A1有数据,那么W=10,这时,range("A1")(10)的意思就是把数据粘贴在从A1为1开始往下数的第10个位置。也就是A10。
如果range("c6")(5),就是以C6为第1往下数,粘贴在第5个位置,也就是粘贴在C10。
如果是:range("e2")(3) ,就是以e2为第1,接着往下数3行,e3就是第2,e4就是第3,就粘贴在e4单元格。
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-9-16 20:22 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-9-16 20:29 | 显示全部楼层
我心飞翔410 发表于 2013-9-16 20:22
自己搜搜有个代码解释器

代码解释器没用?
回复

使用道具 举报

发表于 2013-9-16 21:10 | 显示全部楼层
本帖最后由 yyyydddd8888 于 2013-9-16 21:54 编辑

1、   WOK = Dir(ThisWorkbook.Path & "\*.xls")
  这一句代码得到从代码所在路径下的其中一个文件名。一般是按文件名的顺序显示的。
                 

2、  If ThisWorkbook.Sheets(1).Range("A65536").End(3).Row = 1 Then
                        W = 10
                    Else
                        W = 2
                    End If
    这一句代码判断目标工作表(工作簿中第一个工作表)的A列的最后一个有数据的单元格的行号。  如果这一列没有数据,或者只有第一行有数据,那么会返回行号:1。如果A列没有数据,或者只有A1单元格有数据,那么W=10。否则W=2。结合ThisWorkbook.Sheets(1).Range("A65536").End(3)(W) 这一句代码,就是把复制的内容粘贴到以 A(W)为顶点的区域中。这个A(W)是以上一个有数据的单元格为第1开始,向下数W行,把数据粘贴到第W行。

   
3、                 If .Sheets(1).Range("H" & i) = "备注" Then .Sheets(1).Rows(i).Copy ThisWorkbook.Sheets(1).Range("A65536").End(3)(W)
               
    这一句代码是判断从代码所在工作簿的同一文件夹下的xls文件的H列的第I行单元格是否是备注,如果是,那么把整个这一行的数据进行复制,并粘贴到代码所在的工作簿的第一个工作表中以A列最后一行数据为参照,如果最后一行在第一行,也就是第一行以下没有数据,那么从这一行开始,往下数10行(因为这时W=10),把复制的一整行粘贴到第10行(也就是以A10为顶点一个区域)。如果A列的最后一行数据不等于1,那么就粘贴到:以最后一行往下数的第二行(因为这时W=2)。如果最后一行数据在第三行,那么从第三行开始往下数2行,第3行为第1,第4行为第2,所以就是把数据粘贴到第4行,也就是刚好接上上面的数据。
   
4、     WOK = Dir
    这一句代码就得到下一个xls文件名。Dir 每次只显示一个文件名。前面一句代码:WOK = Dir(ThisWorkbook.Path & "\*.xls") 得到了第一个文件名,要想得到下一个文件,就是给变量WOK 重新赋值来得到下一个xls文件名。这时,Dir使用前一个文件路径,也就是ThisWorkbook.Path & "\*.xls" 。因此要把WOK = Dir 写在循环内部,让它每循环一次就得到一个新的文件名。

5、描红的地方想不明白,一般End(3).Row,怎么End(3)(W)???

     你说的不错,一般用End(3).Row得到最后一行有数据的行号,这里End(3)(W) 只能用于粘贴时,用 End(3) 后面的数据确定粘贴的起点。而且数据必须写在括号里。
   

评分

参与人数 1 +1 收起 理由
sdfsdfs + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-9-16 21:41 | 显示全部楼层
yyyydddd8888 发表于 2013-9-16 21:10
1、   WOK = Dir(ThisWorkbook.Path & "\*.xls")
  这一句代码得到从代码所在路径下的其中一个文件名。一 ...

Range("A65536").End(3)(W)
如果只有A1单元格有数据,代码就是Range("A1")(W) ,怎么是A(W) ???
回复

使用道具 举报

发表于 2013-9-16 21:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 yyyydddd8888 于 2013-9-16 21:56 编辑
sdfsdfs 发表于 2013-9-16 21:41
Range("A65536").End(3)(W)
如果只有A1单元格有数据,代码就是Range("A1")(W) ,怎么是A(W) ???

如果只有A1有数据,那么W=10,这时,range("A1")(10)的意思就是把数据粘贴在从A1为1开始往下数的第10个位置。也就是A10。
如果range("c6")(5),就是以C6为第1往下数,粘贴在第5个位置,也就是粘贴在C10。
如果是:range("e2")(3) ,就是以e2为第1,接着往下数3行,e3就是第2,e4就是第3,就粘贴在e4单元格。
回复

使用道具 举报

 楼主| 发表于 2013-9-16 22:04 | 显示全部楼层
yyyydddd8888 发表于 2013-9-16 21:48
如果只有A1有数据,那么W=10,这时,range("A1")(10)的意思就是把数据粘贴在从A1为1开始往下数的第10个位置 ...

我把否则W=2 改成W=1,为什么只有一行数据复制到第10行?
否则W=2改成W=3,所有的数据是复制过来了,但每行之间有个空行?
回复

使用道具 举报

发表于 2013-9-16 22:19 | 显示全部楼层
sdfsdfs 发表于 2013-9-16 22:04
我把否则W=2 改成W=1,为什么只有一行数据复制到第10行?
否则W=2改成W=3,所有的数据是复制过来了,但每 ...

如果A列最后一行数据是在第一行的话,这时W=10,这时W不等于1,也不等于2,也不等于3。所以数据复制到第10行。
当你再把W=2改在W=3,这时,因为最后一行数据已经不再第一行了,所以W=3,它不会等于10。这时,会以最后一行数据为第一,往下数3行,粘贴到第3行,第一是原来的数据,第3是新粘贴的数据,第二当然就会空一行了。
回复

使用道具 举报

 楼主| 发表于 2013-9-16 22:32 | 显示全部楼层
本帖最后由 sdfsdfs 于 2013-9-17 19:45 编辑
yyyydddd8888 发表于 2013-9-16 22:19
如果A列最后一行数据是在第一行的话,这时W=10,这时W不等于1,也不等于2,也不等于3。所以数据复制到第1 ...


非常感谢!!!
回复

使用道具 举报

 楼主| 发表于 2013-9-16 22:50 | 显示全部楼层
yyyydddd8888 发表于 2013-9-16 21:48
如果只有A1有数据,那么W=10,这时,range("A1")(10)的意思就是把数据粘贴在从A1为1开始往下数的第10个位置 ...

再问一个,复制过来的数据自动一行一行往下粘贴,不会把原来的数据覆盖,这代码怎么运行的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 00:21 , Processed in 0.489986 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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