ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 单元格输入数据时添加虚线框格,删除数据时取消虚线框格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-1-14 12:42 | 显示全部楼层 |阅读模式
各位老师好!请会VBA的老师帮我看看,怎么修改我目前表格的代码才能达到我想要的要求。表格的样式模板,请看附件,望老师有时间帮我看看。十分感谢!(excel2010版)
        目前表格虽然能够在不改变1-2行格式的前提下,从第3行开始,当第6列单元格有数据时添加虚线框格,删除数据时取消虚线框格。目前弊端:当到达1000行时代码运行速度变慢。
要求:1、提升代码运行速度。
              2、在不改变1-2行格式的前提下,从第3行开始,在1-6列的任何一列单元格输入数据时添加虚线框格,删除数据时取消虚线框格(注:在1-6列同一行任何一个单元格有数据时,不取消虚线框格)。
              3、取消虚线框格的同时删除该行数据。


Private Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next '忽略错误提醒
    Dim nR1%, nR2% '定义
    If Target.Row < 3 Then Exit Sub
    If Target.CountLarge <> 1 Then Exit Sub
    If Target.Column * Target.Count <> 6 Then Exit Sub
    If Target.Row < Range("f" & Rows.Count).End(xlUp).Row Then Exit Sub
    nR2 = Target.Row
    If nR2 = 1 Then
        nR1 = 1
    Else
        If Target.Offset(-1).Value = "" Then
            nR1 = Target.End(xlUp).Row + 1
        Else
            nR1 = nR2
        End If
    End If
    With Range(Range("a" & nR1), Range("w" & nR2 + 1))
        .Borders.LineStyle = Target.Value <> ""
        .HorizontalAlignment = xlCenter  '添加表格线
        .VerticalAlignment = xlCenter '添加表格线
        .Font.Bold = True
        Call 变为虚线
    End With
End Sub

Sub 变为虚线()
Dim i As Long
With Sheet1
    For i = 3 To .Cells(65536, 6).End(xlUp).Row
        With .Range(.Cells(i + 1, 1), .Cells(i, 23))
            .Borders.LineStyle = xlDash     '内格虚线
        End With
     Next i
  End With
End Sub


添加表格线.rar

22.61 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2021-1-15 14:38 | 显示全部楼层
这个为什么要用宏写呢,用条件格式他不香吗

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-16 17:08 | 显示全部楼层
本帖最后由 宜信 于 2021-1-16 17:13 编辑
568132828 发表于 2021-1-15 14:38
这个为什么要用宏写呢,用条件格式他不香吗
条件格式不知能否达到我想要的效果:
如图所示:1、当B10单元格输入有数据时,B4到B9有没有数据都能自动填充A4到J10的框格线;
               2、当删除B10单元格的数据时,自动取消A7到J10的框格线;如再次删除B6的数据时,则再次取消A3到J6的框格线,但是A1至J2的框格线不受影响(即不取消框格线)。

    以上效果目前我上传的附件已经到达了,只是单元格达到1000行以后运行会变慢,所以还得请各位老师帮帮忙优化一下代码代码。

目前想要达到以下效果:
         在不改变1-2行格式的前提下,从第3行开始,在1-6列的任何一列单元格输入数据时添加虚线框格,删除数据时取消虚线框格(注:在1-6列同一行任何一个单元格有数据时,不取消虚线框格,除非1至6列同一行的数据全部删除方可取消该行的框格线)。
取消虚线框格的同时删除该行数据。



2.png

TA的精华主题

TA的得分主题

发表于 2021-1-18 09:14 | 显示全部楼层
条件格式,新建,使用公式。
=$a1<>""
应用于:$a:$j

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-18 19:59 | 显示全部楼层
本帖最后由 宜信 于 2021-1-18 20:02 编辑
568132828 发表于 2021-1-18 09:14
条件格式,新建,使用公式。
=$a1""
应用于:$a:$j

        您好!很感谢百忙之中来回复我的问题。用条件格式这个公式没有办法实现我的需求!这个公式如果是逐行输入数据或者逐行删除数据都是符合要求,但是隔几行才输入数据就只有输入数据的行自动添加框格线,中间没有数据的行就没有办法实现自动添加框格线,当删除数据行时,也仅仅只能实现取消刚删除数据这一行的框格线,中间没有数据的框格线没有办法取消!
        这个公式只能实现图1-图2的效果!当直接在A12输入数据时,这个公式就只能实现自动添加A12至J12的框格线;当删除A12的数据时,也只能自动取消A12至J12的框格线!


          我要的是图3-图4的效果。即当在A12输入数据时连同A6至J11的框格线也能自动添加,当删除A12的数据时也连同A6至J11的框格线一起取消。

图1.png
图2.png
图3.png
图4.png

TA的精华主题

TA的得分主题

发表于 2021-1-18 23:59 | 显示全部楼层
Dim x1
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next '忽略错误提醒
    If Target.Row < 3 Then Exit Sub
    If Target.CountLarge <> 1 Then Exit Sub
    If Target.Column > 6 Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    x2 = 2
    For i = 1 To 6
        x2 = WorksheetFunction.Max(x2, Cells(Rows.Count, i).End(xlUp).Row)
    Next
    If x1 = x2 Then Exit Sub
    If x1 < x2 Then x1 = x1 + 1: flag = True
    If x2 < x1 Then x2 = x2 + 1: flag = False
    With Range(Cells(x1, "A"), Cells(x2, "W"))
        .Borders.LineStyle = flag
        .HorizontalAlignment = xlCenter  '添加表格线
        .VerticalAlignment = xlCenter '添加表格线
        .Font.Bold = True
        If flag = True Then .Borders.LineStyle = xlDash
    End With
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    x1 = 2
    For i = 1 To 6
        x1 = WorksheetFunction.Max(x1, Cells(Rows.Count, i).End(xlUp).Row)
    Next
End Sub

添加表格线-1.zip

22.68 KB, 下载次数: 18

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-1-19 08:42 | 显示全部楼层
计算行号的两段过程是一样的,所以可以拿到外面共用。

Dim x1

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next '忽略错误提醒
    If Target.Row < 3 Then Exit Sub
    If Target.CountLarge <> 1 Then Exit Sub
    If Target.Column > 6 Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    x2 = HH
    If x1 = x2 Then Exit Sub
    If x1 < x2 Then x1 = x1 + 1: flag = True
    If x2 < x1 Then x2 = x2 + 1: flag = False
    With Range(Cells(x1, "A"), Cells(x2, "W"))
        .Borders.LineStyle = flag
        .HorizontalAlignment = xlCenter  '添加表格线
        .VerticalAlignment = xlCenter '添加表格线
        .Font.Bold = True
        If flag = True Then .Borders.LineStyle = xlDash
    End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    x1 = HH
End Sub

Function HH()
    x = 2
    For i = 1 To 6
        x = WorksheetFunction.Max(x, Cells(Rows.Count, i).End(xlUp).Row)
    Next
    HH = x
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-19 23:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zjzyj 发表于 2021-1-19 08:42
计算行号的两段过程是一样的,所以可以拿到外面共用。

Dim x1

十分感谢老师的帮忙,问题得以解决。不过你说的“计算行号的两段过程是一样的,所以可以拿到外面共用”这确实不明白!还望老师解惑,我是一小白,最好上传附件让我更能看得明白些,谢谢!谢谢!谢谢!

TA的精华主题

TA的得分主题

发表于 2021-1-20 00:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
宜信 发表于 2021-1-19 23:45
十分感谢老师的帮忙,问题得以解决。不过你说的“计算行号的两段过程是一样的,所以可以拿到外面共用”这 ...

代码简单复制过去就可以了

添加表格线-2.zip

25.04 KB, 下载次数: 13

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-20 17:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zjzyj 发表于 2021-1-20 00:28
代码简单复制过去就可以了

您好,测试后还有一个问题,如图所示A7:C8单元格,在已添加框格线的表格内单元格合并居中后,随后又撤销了内单元格合并居中,此时的A7:C8单元格没有自动添加框格线,请问老师,如何才能实现自动添加?
图.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 13:45 , Processed in 0.051125 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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