Excel精英培训网

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

請問如何簡化VBA代碼

[复制链接]
发表于 2017-5-28 20:39 | 显示全部楼层 |阅读模式
本帖最后由 idnoidno 于 2017-5-28 21:50 编辑

1
2
3
4
5

 


2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
2
1
2
1
10
76
0.083333
 

912
1
工作表如上,代碼如下,請問路過的高手大哥,可以指導一下嗎其中,
If a3>a1, a3*a1;
If a3<a2,a3*a2*2 ..............


76=a3*a1+b3*b1*2+c3*c1*2+d3*d1*2+e3*e1

0.083333=76/912
  1. Option Explicit
  2. Sub taa()
  3. Dim mrr
  4. Dim i As Integer, j As Integer
  5. Dim rg As Object
  6. Dim tempsum

  7. With Worksheets("工作表1")
  8. Range("f:f").ClearContents
  9. Set rg = Range("a1:f" & Cells(Rows.Count, "A").End(xlUp).Row)
  10. mrr = rg
  11. For i = 3 To UBound(mrr)
  12. tempsum = 0
  13.     For j = 1 To UBound(mrr, 2)
  14.         If mrr(i, j) > mrr(1, j) Then
  15.             mrr(i, UBound(mrr, 2)) = mrr(i, UBound(mrr, 2)) + mrr(i, j) * mrr(1, j)
  16.         Else
  17.             mrr(i, UBound(mrr, 2)) = mrr(i, UBound(mrr, 2)) + mrr(i, j) * mrr(1, j) * 2
  18.         End If
  19.     Next j
  20.     tempsum = tempsum + mrr(i, UBound(mrr, 2))
  21. Next i
  22. rg = mrr
  23. Set rg = Nothing
  24. End With

  25. Dim mrg As Object
  26. Dim brr As Variant

  27. With Worksheets("工作表1")
  28. Set mrg = Range("f1:g" & Cells(Rows.Count, "f").End(xlUp).Row + 1)
  29. brr = mrg
  30. For i = 3 To UBound(brr) - 1
  31.     brr(UBound(brr), 1) = brr(UBound(brr), 1) + brr(i, 1)
  32. Next i
  33. mrg = brr
  34. Set mrg = Nothing
  35. End With

  36. Dim nrg As Object
  37. Dim crr As Variant
  38. With Worksheets("工作表1")
  39. Set nrg = Range("f1:g" & Cells(Rows.Count, "f").End(xlUp).Row)
  40. crr = nrg
  41. For i = 3 To UBound(crr)
  42.     crr(i, 2) = crr(i, 1) / crr(UBound(crr), 1)
  43. Next i
  44. nrg = crr
  45. Set nrg = Nothing
  46. End With

  47. End Sub

复制代码



发表于 2017-5-28 21:13 | 显示全部楼层
先说两个小问题. Dim 可以接着写,比如dim ar,br  。不需要换行。    第二个,你使用with和end with,也没看见你使用。With不是表示在这个工作表操作, 是为了后续方便代替书写。
如果想表示“工作表1”的cells或者Range, 写成sheets("工作表1").range(A3).



回复

使用道具 举报

 楼主| 发表于 2017-5-28 21:22 | 显示全部楼层
謝謝您第一時間回復,關於WITH /END WITH的說明,意思是,其實是不用這樣子嗎?我不是很懂您的說明
回复

使用道具 举报

发表于 2017-5-28 21:46 | 显示全部楼层
idnoidno 发表于 2017-5-28 21:22
謝謝您第一時間回復,關於WITH /END WITH的說明,意思是,其實是不用這樣子嗎?我不是很懂您的說明

你With的用法不对,在With的范围内,可以用 .来代替With的指代。例如 :
  1. With Worksheets("工作表1")
  2.     A = .Range("A1")     ' .这个就代表了 Worksheets("工作表1").
  3. End With
复制代码


回复

使用道具 举报

 楼主| 发表于 2017-5-28 21:49 | 显示全部楼层
你的意思是我沒有用"."這樣的指代,其實我的代碼用了都是多餘的,有.和沒有.
意義是不一樣的,對嗎

点评

对的  发表于 2017-5-28 21:51
回复

使用道具 举报

 楼主| 发表于 2017-5-28 21:57 | 显示全部楼层
本帖最后由 idnoidno 于 2017-5-28 22:09 编辑

感謝上面兩位大大的指導,學到正確的用法,謝謝
回复

使用道具 举报

发表于 2017-5-28 21:59 | 显示全部楼层
" WITH /END WITH "
在 上面你程序中的 完全没有发挥作用 ,
你把上面 with sheets("工作表1") 改为 with sheets("工作表2") 会发现运行结果没有任何变化

-----------------------------------
with sheets("工作表1")
    .range("a1") =123    '有了前面那个 , 才跟 with 有关系
end with
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 04:46 , Processed in 0.341681 second(s), 18 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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