Excel精英培训网

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

[已解决]运行时错误'1004'

[复制链接]
发表于 2009-10-18 13:15 | 显示全部楼层 |阅读模式

jEXhLykm.rar (404.15 KB, 下载次数: 0)

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2009-10-18 13:23 | 显示全部楼层

这不是你的程序错误,这是EXCEL的限制,你在定位可见单元格时,选取的数据区域过大而致,用手工也无法完成
回复

使用道具 举报

发表于 2009-10-18 13:31 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2009-10-18 13:32 | 显示全部楼层

QUOTE:
以下是引用兰色幻想在2009-10-18 13:23:00的发言:
这不是你的程序错误,这是EXCEL的限制,你在定位可见单元格时,选取的数据区域过大而致,用手工也无法完成

谢谢兰版!

我发现也是,只保留少量行数(如20),不出错。

a()的目的就是筛选出符合条件的行。为此,用什么方法最好呢?

[em04]
回复

使用道具 举报

发表于 2009-10-18 13:36 | 显示全部楼层

QUOTE:
以下是引用爱疯在2009-10-18 13:32:00的发言:

谢谢兰版!

我发现也是,只保留少量行数(如20),不出错。

a()的目的就是筛选出符合条件的行。为此,用什么方法最好呢?

[em04]

你分两次定位,我试了一下20000行不出错,你正好可以分两次定位
回复

使用道具 举报

 楼主| 发表于 2009-10-18 13:36 | 显示全部楼层

QUOTE:
以下是引用lixianhu在2009-10-18 13:31:00的发言:

用数组吧

[em01]

谢谢lixianhu!

好在条件仅比较2个数字,用数组,也是哦。那我还是去想想好了。

PS:幻想一行无法执行的代码,能被另一行可执行的代码替代,能偷懒该多好呀 .... [em11]

回复

使用道具 举报

 楼主| 发表于 2009-10-18 13:44 | 显示全部楼层

QUOTE:
以下是引用兰色幻想在2009-10-18 13:36:00的发言:

你分两次定位,我试了一下20000行不出错,你正好可以分两次定位

分两次.....兰版的幻想,还真不错[em01][em01]

只保留原表中符合条件的行(当然标题也保留),是过程的最终目的。

想啊想,怎么做最好 。。。。。。。。。[em03]

回复

使用道具 举报

 楼主| 发表于 2009-10-18 14:08 | 显示全部楼层

Sub a()
    Dim r, T, Y, arr, i

    Y = 20091017000000#
    T = 20091018000000#
    r = Range("F1").End(xlDown).Row
   
   
    arr = Range("F2:F" & r)
    For i = 1 To UBound(arr)
        If arr(i, 1) <= Y Or arr(i, 1) >= T Then
            arr(i, 1) = ""
        End If
    Next i
    Range("F2").Resize(UBound(arr), 1) = arr
   
    Range("F2:F" & r).SpecialCells(xlCellTypeBlanks).Select
    Selection.Delete (3)

End Sub

为什么我这样设置断点后,Range("F2:F" & r).SpecialCells(xlCellTypeBlanks).Select,并没选其中所有的空格呢?

[em04][em04][em04]
回复

使用道具 举报

发表于 2009-10-18 15:05 | 显示全部楼层    本楼为最佳答案   

爱疯,你的选区还是太大啦,Excel罢工了[em01],用临时数组存放筛选出来的数据吧[em01]

让我做的话,两个办法

一,用高级筛选代码

这个只要用4个辅助单元格就行,可以录制宏完成,简单方便,适合初学VBA者。

在O1和P1分别都输入“建链时间”;在O2和P2分别输入“>20091017000000”和“<20091018000000”

然后录制宏后修改一下代码,就得出以下代码了(很简单哦[em01]):

Sub bb()
    Dim r As Long

    r = Range("F1").End(xlDown).Row
    Range("A1:M" & r).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
                                     Range("O1:P2"), CopyToRange:=Range("R1"), Unique:=False

    Range("R1:AD" & r).Cut Destination:=Range("A1:M" & r)
End Sub

二,用条件循环筛选代码

这个不需要辅助单元格,利用数组,速度也很快,适合不想要辅助单元格的VBA入门者(以下代码是对爱疯代码的修正)。

Sub aa()
    Dim arr, arr2()
    Dim k As Long
    Dim i As Long
    Dim j As Long
    Dim r As Long
    Dim T As Double
    Dim Y As Double

    Y = 20091017000000#
    T = 20091018000000#
    r = Range("F1").End(xlDown).Row

    ReDim arr2(1 To r - 1, 1 To 13)
    arr = Range("A2:M" & r)
    For i = 1 To UBound(arr)
        If arr(i, 6) > Y And arr(i, 6) < T Then
            k = k + 1
            For j = 1 To 13
                arr2(k, j) = arr(i, j)
            Next j
        End If
    Next i

    Range("A2:M" & r) = arr2

End Sub

[此贴子已经被作者于2009-10-18 16:04:34编辑过]
回复

使用道具 举报

 楼主| 发表于 2009-10-18 15:36 | 显示全部楼层

谢谢喵喵,谢谢大家!

明白了。高级筛选方式用得少,得想很久。

PS:你做的总这么干净[em04]

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 10:47 , Processed in 0.358782 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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