Excel精英培训网

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

[已解决]如何记录一列已用过滤器的条件,并恢复

[复制链接]
发表于 2016-2-29 09:41 | 显示全部楼层 |阅读模式
由于合并完单元格以后,输入内容的时候没法自动换行,所以写了一小段VBA实现上述功能。(如图对D5:D16单元格进行行高调整)
2016-02-29_092631.jpg
现在遇到的问题是:如果第5行激活了过滤器,则运行完VBA后,行高被重新调整,过滤的东西被重新显示出来。
希望增加的功能:在执行VBA之前,记录第5行的过滤器内容,运行完VBA后,再恢复之前的过滤器。

Test.zip (20.48 KB, 下载次数: 5)
发表于 2016-2-29 11:26 | 显示全部楼层    本楼为最佳答案   
Sub AdjustRowHeight()
    Dim i, h, s As Long
    Application.ScreenUpdating = False
    Sheet1.Activate
    For i = 5 To Cells(5, 1).End(xlDown).Row
        '        StaR = Sheet1.Cells(i, 4)
        '        h = 0
        '        For k = 1 To Len(StaR)
        '            If Mid(StaR, k, 1) = Chr(10) Then     '计算字串中有几个换行
        '                h = h + 1
        '            End If
        '        Next
        h = UBound(Split(Cells(i, 4), Chr(10)))
        h = (h + 1) * 12.75
        '如果行高不一致,则改变行高
        If Rows(i).RowHeight <> 0 Then If Rows(i).RowHeight <> h Then Rows(i).RowHeight = (h + 1) * 12.75: s = s + 1
    Next
    Application.ScreenUpdating = True
    MsgBox ("Done!" & Chr(10) & s & " Rows Changed")
End Sub

Test2.rar (20.37 KB, 下载次数: 14)
回复

使用道具 举报

 楼主| 发表于 2016-2-29 12:37 | 显示全部楼层
爱疯 发表于 2016-2-29 11:26
Sub AdjustRowHeight()
    Dim i, h, s As Long
    Application.ScreenUpdating = False

非常感谢版主!
在您代码的基础上进行了优化,已可以使用。
  • 增加了2个End If
  • 最后行高h赋值不需要再次计算。如果用版主的公式,则出现报错:Run-time erroe'1004': Unable to set the RowHeight property of the Range class. 这个能否帮忙解释下原因?

Sub AdjustRowHeight()
    Dim i, h, s As Long
    Application.ScreenUpdating = False
    Sheet1.Activate
    For i = 5 To Cells(5, 1).End(xlDown).Row
        h = UBound(Split(Cells(i, 4), Chr(10)))
        h = (h + 1) * 12.75
        If Rows(i).RowHeight <> 0 Then
            If Rows(i).RowHeight <> h Then
            Rows(i).RowHeight = h
            s = s + 1
            End If
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox ("Done!" & Chr(10) & s & " Rows Changed")
End Sub

Test3.zip (18.58 KB, 下载次数: 6)
回复

使用道具 举报

发表于 2016-2-29 16:08 | 显示全部楼层
你已经搞好了?

我没明白,是在做啥时报错
回复

使用道具 举报

 楼主| 发表于 2016-3-1 08:15 | 显示全部楼层
爱疯 发表于 2016-2-29 16:08
你已经搞好了?

我没明白,是在做啥时报错

恩,搞好了,用您的思路判断行高就OK了。

在给行高赋值的那一步会报错。
  • 如果用这个公式:Rows(i).RowHeight = (h + 1) * 12.75,就会报错;报出来的错误是Run-time erroe'1004': Unable to set the RowHeight property of the Range class.
  • 如果用这个公式:Rows(i).RowHeight = h,就没问题。

再次感谢版主!


回复

使用道具 举报

发表于 2016-3-1 09:31 | 显示全部楼层
没明白是做什么操作,但发现2楼的错误了:

h已求出,所以判断后应用 Rows(i).RowHeight = h
回复

使用道具 举报

 楼主| 发表于 2016-3-1 10:18 | 显示全部楼层
爱疯 发表于 2016-3-1 09:31
没明白是做什么操作,但发现2楼的错误了:

h已求出,所以判断后应用 Rows(i).RowHeight = h

为什么再次计算的时候会出错呢?
回复

使用道具 举报

发表于 2016-3-1 10:20 | 显示全部楼层
你能发下动画操作吗?

我一直不知道你是在做什么操作时,出的错
回复

使用道具 举报

 楼主| 发表于 2016-3-2 09:04 | 显示全部楼层
爱疯 发表于 2016-3-1 10:20
你能发下动画操作吗?

我一直不知道你是在做什么操作时,出的错

GIF.gif
回复

使用道具 举报

发表于 2016-3-2 09:28 | 显示全部楼层
hai0625 发表于 2016-3-2 09:04

程序的作用:单元格中N个换行符,则该行的 行高 = n*12.75
报错的原因:超出最大行高。
                     比如excel2010里最大允许是409,如果达到410,就会出现这样的提示。
                     例子中出错时是行高便 = (140.25+1) *12.75 ,所以报错。


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 21:53 , Processed in 0.441316 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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