Excel精英培训网

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

求助:删除&排序

[复制链接]
发表于 2019-7-30 13:04 | 显示全部楼层 |阅读模式
新人求助,烦请大神指教
1. D列先将4月份的删除
2. 然后将C列City排序, 然后每个城市再按D列Date二次排序.

求大神帮忙写一下VBA,万分感谢!

Sample List for training (2).zip

8.86 KB, 下载次数: 9

发表于 2019-7-30 14:25 | 显示全部楼层
Sub kk()
    Dim cn As Object, rs As Object
    Dim sql As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source =" & ThisWorkbook.FullName
    sql = "select * from [Old$a1:f] where month(Date)<>4 order by City,Date"
    Set rs = cn.Execute(sql)
    Range("i2").CopyFromRecordset rs
    For i = 1 To rs.Fields.Count
        Cells(1, 8 + i).Value = rs.Fields(i - 1).Name
    Next i
    cn.Close
    Set cn = Nothing: Set rs = Nothing
End Sub
回复

使用道具 举报

 楼主| 发表于 2019-7-30 14:46 | 显示全部楼层
mytto88 发表于 2019-7-30 14:25
Sub kk()
    Dim cn As Object, rs As Object
    Dim sql As String

谢谢大神,如果有一些注释就更好了...
回复

使用道具 举报

发表于 2019-7-30 16:07 | 显示全部楼层
本帖最后由 hfwufanhf2006 于 2019-7-30 16:26 编辑
Wynne1986 发表于 2019-7-30 14:46
谢谢大神,如果有一些注释就更好了...

我帮你解释:
    Dim cn As Object, rs As Object
    Dim sql As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source =" & ThisWorkbook.FullName
    sql = "select * from [Old$a1:f] where month(Date)<>4 order by City,Date"


rem 上面是定义ado连接参数,除了最后一行sql参数是根据需要来写外,其他照抄就行了;
rem select * from [Old$a1:f] where month(Date)<>4 order by City,Date 意思是从工作表Old的a1:f列 选取数据,条件是月份<>4,并按照 City,Date排序

    Set rs = cn.Execute(sql)      '执行 SQL 查询,SQL语句是标准的数据库查询语言,sql server、my sql通用,excel也内置支持
    Range("i2").CopyFromRecordset rs    '把查询的数据集写在以I2单元格为左上角的地方,rs是sql执行后数据集,你不用担心它会内存溢出
    For i = 1 To rs.Fields.Count       '循环写入数据,这个过程不需要,直接把rs写在a1单元格就好了,可能是怕出错而丢失了数据而做的过度吧
        Cells(1, 8 + i).Value = rs.Fields(i - 1).Name
    Next i
    cn.Close    '关闭adol连接
    Set cn = Nothing: Set rs = Nothing


还有一种普通一点的方法:
1、循环删除上月数据:
     For i = 1 To [b10000].End(3).Row
          If Month(Cells(i, 4)) = 4 Then
             Rows(i).Delete
             i = i - 1     '删掉一行后,后面一行会补上来,所以需要再次对本行进行判断
         End If
     Next i


2、然后代码排序即可:
    Range("a1:f" & [a10000].end(3).row ).Sort key1:=Range("c1"), order1:=xlAscending,key2:=Range("d1"), order2:=xlAscending, Header:=xlYes

    参数 key1是第一个排序列,order1是升序,xlAscending是常数,可以简写为数字1,降序是数字2
           key2是第二个排序列,如果还有更多排序列,顺序添加;
           header:=xlyes表示是否有标题行,本例是有

3、如果只是排序,代码排序更简单,代码排序是利用了系统的内置单元格区域排序功能,用其他方法反而更复杂。SQL方法的优势不仅仅是排序,更具有筛选、计算以及字段组合的所有功能,功能更强大,效率极高,百万数据也就1、2秒就有结果了,常用于大型数据库的数据连接。


回复

使用道具 举报

发表于 2019-9-2 08:31 | 显示全部楼层
好内容!
回复

使用道具 举报

发表于 2019-9-2 09:32 | 显示全部楼层
Sub test()
        Dim i%
        Application.DisplayAlerts = False '禁止警告
        Application.ScreenUpdating = False '禁止刷新
        Sheets("Old").Activate '活动工作表
        For i = [d65536].End(3).Row To 2 Step -1 '从大到小循环
                If Month(Cells(i, 4)) = 4 Then '如果月份为4,就……
                        Rows(i).Delete '删除行
                End If
        Next i
        Range("a1:f" & [d65536].End(3).Row).Sort [c1], 1, , [d1], 1, , , 1 '区域先按C列排序,再按D列排序
        Application.DisplayAlerts = True '允许警告
        Application.ScreenUpdating = True '允许刷新
End Sub
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 17:42 , Processed in 0.334785 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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