Excel精英培训网

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

[已解决]求高手编辑超复杂的VBA

[复制链接]
发表于 2013-10-9 19:46 | 显示全部楼层 |阅读模式
QQ20131009174229.jpg
如上图所示,我已经实现第一、二个条件了(附件里的VBA程序里),但因一个工作表里只能设置一下自动运行宏的功能,所以得把所有条件都合并,因能力有限,敬请高手继续在我的原编程里继续补充,实现1~4个条件同时计算,而且都是自动运行(即无须设置控件按扭),谢谢!
最佳答案
2013-10-25 07:42
  1. Option Explicit

  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3. If Target.Row = 1 Then Exit Sub
  4. Dim i As Long, c As Object, Rng As String, j As Long, s As String
  5. Select Case Target.Column
  6. Case 4
  7.     Target.Offset(, 1).Resize(, 2).ClearContents
  8.     Set c = Sheet2.Columns(1).Find(Target, LookIn:=xlValues, lookat:=xlWhole)
  9.     If Not c Is Nothing Then
  10.         For i = c.Row To Sheet2.[B65536].End(xlUp).Row
  11.             If Sheet2.Cells(i, 1) = "" Or Sheet2.Cells(i, 1) = c Then
  12.                 Rng = Rng & "," & Sheet2.Cells(i, 2)
  13.             Else
  14.                 Exit For
  15.             End If
  16.         Next i
  17.         Rng = Mid(Rng, 2)
  18.         With Target.Offset(, 1).Validation
  19.             .Delete
  20.             .Add 3, 1, 1, Rng
  21.         End With
  22.     End If
  23.     Target.Offset(, 5) = Target.Offset(, 2) * Target.Offset(, 3) * Target.Offset(0, 4)
  24. Case 5
  25.     Target.Offset(, 1).NumberFormatLocal = "@"
  26.     Set c = Sheet2.Columns(2).Find(Target, LookIn:=xlValues, lookat:=xlWhole)
  27.     If Not c Is Nothing Then
  28.         Target.Offset(, 1) = c.Offset(, 1)
  29.     Else
  30.         s = 1
  31.         For j = 1 To Len(Target)
  32.             If Asc(Mid(Target, j, 1)) > 0 Then
  33.                 s = s * Mid(Target, j, 1)
  34.             End If
  35.         Next j
  36.         Target.Offset(, 1) = s
  37.         Target.Offset(, 4) = Target.Offset(, 1) * Target.Offset(, 2) * Target.Offset(0, 3)
  38.     End If
  39. Case 6, 7, 8
  40.     Cells(Target.Row, 9) = Cells(Target.Row, 6) * Cells(Target.Row, 7) * Cells(Target.Row, 8)
  41. End Select
  42. End Sub
复制代码

有条件的下拉菜单2.rar

10.37 KB, 下载次数: 13

发表于 2013-10-9 22:11 | 显示全部楼层
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Row = 1 Then Exit Sub
  3. Dim i As Long, c As Object, Rng As String, j As Long, s As String
  4. Select Case Target.Column
  5. Case 4
  6.     Target.Offset(, 1).Resize(, 2).ClearContents
  7.     Set c = Sheet2.Columns(1).Find(Target, LookIn:=xlValues, lookat:=xlWhole)
  8.     If Not c Is Nothing Then
  9.         For i = c.Row To Sheet2.[B65536].End(xlUp).Row
  10.             If Sheet2.Cells(i, 1) = "" Or Sheet2.Cells(i, 1) = c Then
  11.                 Rng = Rng & "," & Sheet2.Cells(i, 2)
  12.             Else
  13.                 Exit For
  14.             End If
  15.         Next i
  16.         Rng = Mid(Rng, 2)
  17.         With Target.Offset(, 1).Validation
  18.             .Delete
  19.             .Add 3, 1, 1, Rng
  20.         End With
  21.     End If
  22. Case 5
  23.     Target.Offset(, 1).NumberFormatLocal = "@"
  24.     Set c = Sheet2.Columns(2).Find(Target, LookIn:=xlValues, lookat:=xlWhole)
  25.     If Not c Is Nothing Then
  26.         Target.Offset(, 1) = c.Offset(, 1)
  27.     Else
  28.         For j = 1 To Len(Target)
  29.             If Asc(Mid(Target, j, 1)) > 0 Then
  30.                 s = s & Mid(Target, j, 1)
  31.             End If
  32.         Next j
  33.         Target.Offset(, 1) = s
  34.     End If
  35. Case 6
  36.     If Target.Text <> "" Then Target.Offset(, 1) = Target.Offset(, 2) + Target.Offset(0, 3)
  37. End Select
  38. End Sub

复制代码
回复

使用道具 举报

 楼主| 发表于 2013-10-18 17:14 | 显示全部楼层
能否再精简,实现从后面输入或前面输入,结果都能计算出来,因为按上楼楼术的程序,结果只能实现从前面到后面,而不能实现从后面到前面的改变
回复

使用道具 举报

 楼主| 发表于 2013-10-24 22:01 | 显示全部楼层 |阅读模式
QQ图片20131018175306.jpg 如图所示,如论从前面或后面都能实现自动计算,谢谢!
最佳答案
2013-10-25 07:42
  1. Option Explicit

  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3. If Target.Row = 1 Then Exit Sub
  4. Dim i As Long, c As Object, Rng As String, j As Long, s As String
  5. Select Case Target.Column
  6. Case 4
  7.     Target.Offset(, 1).Resize(, 2).ClearContents
  8.     Set c = Sheet2.Columns(1).Find(Target, LookIn:=xlValues, lookat:=xlWhole)
  9.     If Not c Is Nothing Then
  10.         For i = c.Row To Sheet2.[B65536].End(xlUp).Row
  11.             If Sheet2.Cells(i, 1) = "" Or Sheet2.Cells(i, 1) = c Then
  12.                 Rng = Rng & "," & Sheet2.Cells(i, 2)
  13.             Else
  14.                 Exit For
  15.             End If
  16.         Next i
  17.         Rng = Mid(Rng, 2)
  18.         With Target.Offset(, 1).Validation
  19.             .Delete
  20.             .Add 3, 1, 1, Rng
  21.         End With
  22.     End If
  23.     Target.Offset(, 5) = Target.Offset(, 2) * Target.Offset(, 3) * Target.Offset(0, 4)
  24. Case 5
  25.     Target.Offset(, 1).NumberFormatLocal = "@"
  26.     Set c = Sheet2.Columns(2).Find(Target, LookIn:=xlValues, lookat:=xlWhole)
  27.     If Not c Is Nothing Then
  28.         Target.Offset(, 1) = c.Offset(, 1)
  29.     Else
  30.         s = 1
  31.         For j = 1 To Len(Target)
  32.             If Asc(Mid(Target, j, 1)) > 0 Then
  33.                 s = s * Mid(Target, j, 1)
  34.             End If
  35.         Next j
  36.         Target.Offset(, 1) = s
  37.         Target.Offset(, 4) = Target.Offset(, 1) * Target.Offset(, 2) * Target.Offset(0, 3)
  38.     End If
  39. Case 6, 7, 8
  40.     Cells(Target.Row, 9) = Cells(Target.Row, 6) * Cells(Target.Row, 7) * Cells(Target.Row, 8)
  41. End Select
  42. End Sub
复制代码

如何编辑自动运行宏1018.rar

3.17 KB, 下载次数: 14

发表于 2013-10-25 07:42 | 显示全部楼层    本楼为最佳答案   
  1. Option Explicit

  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3. If Target.Row = 1 Then Exit Sub
  4. Dim i As Long, c As Object, Rng As String, j As Long, s As String
  5. Select Case Target.Column
  6. Case 4
  7.     Target.Offset(, 1).Resize(, 2).ClearContents
  8.     Set c = Sheet2.Columns(1).Find(Target, LookIn:=xlValues, lookat:=xlWhole)
  9.     If Not c Is Nothing Then
  10.         For i = c.Row To Sheet2.[B65536].End(xlUp).Row
  11.             If Sheet2.Cells(i, 1) = "" Or Sheet2.Cells(i, 1) = c Then
  12.                 Rng = Rng & "," & Sheet2.Cells(i, 2)
  13.             Else
  14.                 Exit For
  15.             End If
  16.         Next i
  17.         Rng = Mid(Rng, 2)
  18.         With Target.Offset(, 1).Validation
  19.             .Delete
  20.             .Add 3, 1, 1, Rng
  21.         End With
  22.     End If
  23.     Target.Offset(, 5) = Target.Offset(, 2) * Target.Offset(, 3) * Target.Offset(0, 4)
  24. Case 5
  25.     Target.Offset(, 1).NumberFormatLocal = "@"
  26.     Set c = Sheet2.Columns(2).Find(Target, LookIn:=xlValues, lookat:=xlWhole)
  27.     If Not c Is Nothing Then
  28.         Target.Offset(, 1) = c.Offset(, 1)
  29.     Else
  30.         s = 1
  31.         For j = 1 To Len(Target)
  32.             If Asc(Mid(Target, j, 1)) > 0 Then
  33.                 s = s * Mid(Target, j, 1)
  34.             End If
  35.         Next j
  36.         Target.Offset(, 1) = s
  37.         Target.Offset(, 4) = Target.Offset(, 1) * Target.Offset(, 2) * Target.Offset(0, 3)
  38.     End If
  39. Case 6, 7, 8
  40.     Cells(Target.Row, 9) = Cells(Target.Row, 6) * Cells(Target.Row, 7) * Cells(Target.Row, 8)
  41. End Select
  42. End Sub
复制代码
回复

使用道具 举报

发表于 2013-10-25 09:05 | 显示全部楼层
学习学习
回复

使用道具 举报

发表于 2013-10-25 09:57 | 显示全部楼层
思路很好
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 10:26 , Processed in 0.134304 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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