ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 222|回复: 10

求助 请大神帮忙查看一下什么原因造成死机

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-3 16:32 | 显示全部楼层 |阅读模式
本帖最后由 willem168 于 2024-9-3 16:34 编辑

运行下列代码 excel会死机行数也不算多 测试10行可以过此代码 求大神优化一下





Sub DeleteRows()
    Application.ScreenUpdating = False
    Dim i As Long, ii As Integer
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("欠费统计1") ' 修改为你的工作表名
    For i = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row - 1 To 1 Step -1
        x = ""
        For ii = 1 To 12
            If ws.Cells(i, ii + 2).Value <> "" Then
                x = ws.Cells(i, ii + 2).Value
                Exit For
            End If
        Next ii
        If x = "" Then ws.Rows(i).Delete
    Next i
    Application.ScreenUpdating = True
End Sub





补充内容 (2024-9-8 13:37):
感谢各位大师的指点但是最后实际数据处理需要2万多条 最后还是改用sql 获取 Sub 统计数量01()

  ThisWorkbook.Sheets("2016年(办公) ").[a2].Resize(1, 14).Copy Destination:=ThisWorkbook.Sheets("欠费统计2...

电费.rar

1.32 MB, 下载次数: 13

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-3 17:14 | 显示全部楼层
大神救命啊

TA的精华主题

TA的得分主题

发表于 2024-9-3 17:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA删除不连续的行,用for循环遍历、判断后一条一条的删除的效率是很低的,想要快,大致思路是先将这些行连续起来,再批量删除。比如你的需求是将C列至N列没有内容的行删除,你可以用for遍历出没有内容的行并标记在辅助列上,比如第二行没有内容,就在P2上标记1,最后再把P列排序一下,这样所有需要删除的行就连续了,这样一次性删除一秒都不用

TA的精华主题

TA的得分主题

发表于 2024-9-3 17:37 | 显示全部楼层
要使用数组或者字典才能提高速度,不停读取单元格,速度超慢,搞了下,速度提高了,供你参考。。。
image.png
image.png

电费.zip

1.2 MB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2024-9-3 17:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
代码如下。。。。

Sub DeleteRows()
    t = Timer
    Application.ScreenUpdating = False
    Dim rng As Range
    Dim i As Long, ii As Integer
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("欠费统计1") ' 修改为你的工作表名
    arr = ws.UsedRange
    For i = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row To 1 Step -1           '原来是有-1,不明白为什么,不是应该是最后一行开始吗?
        x = ""
        For ii = 1 To 12
            If Len(arr(i, ii + 2)) <> 0 Then
                x = arr(i, ii + 2)
                Exit For
            End If
        Next ii
        If x = "" Then If rng Is Nothing Then Set rng = ws.Rows(i) Else Set rng = Union(rng, ws.Rows(i))
    Next i
    rng.Delete
    Application.ScreenUpdating = True
    MsgBox "共耗时:" & Timer - t
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-3 17:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
xjl565135022 发表于 2024-9-3 17:31
VBA删除不连续的行,用for循环遍历、判断后一条一条的删除的效率是很低的,想要快,大致思路是先将这些行连 ...

Sub DeleteRows()
    Application.ScreenUpdating = False
    Dim i As Long, ii As Integer
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("欠费统计1") ' 修改为你的工作表名
    For i = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row - 1 To 1 Step -1
        x = ""
        For ii = 1 To 12
            If ws.Cells(i, ii + 2).Value <> "" Then
                x = ws.Cells(i, ii + 2).Value
                Exit For
            End If
        Next ii
       If x <> "" Then ws.Cells(i, 18) = "有数据"
    Next i
    Application.ScreenUpdating = True
End Sub


果然 我把删行改成标记 也就1秒不到 果然是 不能一条一条删除

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-3 18:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
quqiyuan 发表于 2024-9-3 17:38
代码如下。。。。

Sub DeleteRows()

受教了大师 多谢指导

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-3 18:18 | 显示全部楼层
quqiyuan 发表于 2024-9-3 17:38
代码如下。。。。

Sub DeleteRows()

测试的时候 吧合计删除了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-3 18:21 | 显示全部楼层
万分感谢各位大师的指导
Sub DeleteRows2()


    Dim t As Double
    t = Timer
    Application.ScreenUpdating = False
    Dim rng As Range
    Dim i As Long, ii As Integer
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("欠费统计1")
    arr = ws.UsedRange
    For i = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row To 1 Step -1
    Debug.Print i
   
        x = ""
        For ii = 1 To 12
            If Len(arr(i, ii + 2)) <> 0 Then
                x = arr(i, ii + 2)
                Exit For
            End If
        Next ii
        If x = "" Then
            If rng Is Nothing Then
                Set rng = ws.Rows(i)
            Else
                Set rng = Union(rng, ws.Rows(i))
            End If
        End If
    Next i
    If Not rng Is Nothing Then rng.Delete
    Application.ScreenUpdating = True
    MsgBox "共耗时:?" & Timer - t
End Sub

TA的精华主题

TA的得分主题

发表于 2024-9-3 20:07 来自手机 | 显示全部楼层
Sub test()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("欠费统计1")
arr = ws.Range("A1:Q" & [A65536].End(3).Row)
For i = 2 To UBound(arr)
    arr(i, 16) = i
    Data = False
    For j = 3 To 14
        If arr(i, j) <> "" Then
            Data = True
            Exit For
        End If
    Next
    If Data = True Then
        arr(i, 17) = 1
    End If
Next
ws.Range("A1:Q" & [A65536].End(3).Row) = arr
ws.Range("A1:Q" & [A65536].End(3).Row).Sort key1:=Range("Q1"), order1:=xlAscending, Header:=xlYes
ws.Rows([Q65536].End(3).Row + 1 & ":" & UBound(arr)).Delete
ws.Range("A1:Q" & [A65536].End(3).Row).Sort key1:=Range("P1"), order1:=xlAscending, Header:=xlYes
End Sub
有合并单元格的话不能排序,要先取消合并单元格
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 19:53 , Processed in 0.045957 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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