【问题标题】:macro range / specific cells msg box宏范围/特定单元格消息框
【发布时间】:2016-12-15 11:43:03
【问题描述】:

你能帮我处理宏吗?我有一个 3 代码,仅在特定值时才向我显示消息框。但不要为我工作。 :/我不知道为什么。一些错误,我想制作所有范围,然后在满足值时向我展示 msgbox。有人知道吗?

现在我已经显示错误了,请看图片

Public Sub found(worksheets)

Dim found As Boolean
Dim c   As Range

found = False
For Each c In worksheets("data").Range("D155,D456,D757,D1058,D1359,D1660,D1961:D1964,D36811,D36813,D38015,D38617,D39219,D39821,D40423,D41025,D52576,D53178,D54984,D55586,D56790,D57392,D58897")

    If c.Value = 8 Then
        found = True
        c.Value = -1
    End If
Next
If found Then MsgBox ("    ZAHLASTE BALENÍ !!!") & vbCrLf & ("BALÍCÍ MNOŽSTVÍ JE 15 KS")

found = False
For Each c In worksheets("data").Range("D29,D31,D33,D35,D37,D39,D41,D43,D45,D47,D49,D51:D57,D59,D61,D63,D65,D67:D83,D85,D87,D89,D91:D95,D97:D101,D103,D105,D107,D109,D110:D111,D41944,D42246:D42250,D45263,D45265,D45267,D45269,D45271,D45273,D45275,D45277,D45279,D45280,D45581,D45882,D46183,D46484,D46785,D47086,D47387")

    If c.Value = 5 Then
        found = True
        c.Value = -1
    End If
Next
If found Then MsgBox ("    ZAHLASTE BALENÍ") & vbCrLf & ("BALÍCÍ MNOŽSTVÍ JE 6 KS")

found = False
For Each c In worksheets("data").Range("D3165,D3466,D3767,D4068,D4369,D4670,D4971,D5272,D5573,D5874,D6175:D10088,D10389,D10690,D41643,D41945,D42251,D42552,D42853,D43154,D43455,D43755,D44057,D44357,D44658,D44959,D48892,D49193,D49494,D49795,D50097,D50397,D50698,D50999,D51308:D51339")

    If c.Value = 8 Then
        found = True
        c.Value = -1
    End If
Next
If found Then MsgBox ("    ZAHLASTE BALENÍ") & vbCrLf & ("BALÍCÍ MNOŽSTVÍ JE 9 KS")

End Sub

在下一张我打电话给Call Module1.check(worksheets)

这部分代码显示错误。

【问题讨论】:

  • 修改你的.Range("D155:D155", "D456:D456", "D757:D757", "D1058:D758",....) 为``.Range("D155, D456, D757, D1058" ....)`。您需要确保您的Ranges 有效。 " 位于括号 ( ) 的开头和结尾
  • 如果您的worksheets 参数是Worksheets 对象的实际Worksheets 集合,那么您最好将您的函数传递给workbook 对象(即:Public Sub check(wb As Workbook)),然后使用@987654334 @,只是不要弄乱内置对象的名称
  • 好的,我尝试更改,代码的第一部分很好,但第二部分在这部分显示错误: For Each c In worksheets("data").Range("D29,D31,D33, D35,D37,D39,D41,D43,D45,D47,D49,D51:D57,D59,
  • 请编辑问题以发布您更新的代码,并准确说明错误消息。
  • 请在下面查看我编辑的答案的最后一部分。

标签: excel vba macros msgbox


【解决方案1】:

除了应用上面的cmets(特别是用"D155"代替"D155:D155"等,

以下是在每个操作完成后仅显示一次 msgbox 的方法:

Dim found as Boolean

found = false
For Each c In worksheets("data").Range(...)
    If c.Value = 8 Then
        found = True
        c.Value = -1
    End If
Next
If found then MsgBox ("    ZAHLASTE BALENÍ !!!") & vbCrLf & ("BALÍCÍ MNOŽSTVÍ JE 15 KS")

found = false
For Each c In worksheets("data").Range(...)
    If c.Value = 5 Then
        found = True
        c.Value = -1
    End If
Next
If found then MsgBox ("    ZAHLASTE BALENÍ") & vbCrLf & ("BALÍCÍ MNOŽSTVÍ JE 6 KS")

found = false
For Each c In worksheets("data").Range(...)
    If c.Value = 8 Then
        found = True
        c.Value = -1
    End If
Next
If found then MsgBox ("    ZAHLASTE BALENÍ") & vbCrLf & ("BALÍCÍ MNOŽSTVÍ JE 9 KS")

编辑:下一个问题

如果提交的字符串长度过长,超过 255 个字符,Range 方法将失败。您可以通过将范围的规范分成两部分来解决它:

Dim r As Range
Set r = worksheets("data").Range("D29,D31,D33,D35,D37,D39,D41,D43,D45,D47,D49,D51:D57,D59,D61,D63,D65,D67:D83,D85,D87,D89,D91:D95,D97:D101,D103,D105,D107,D109,D110:D111,D41944,D42246:D42250,D45263,D45265,D45267,D45269,D45271,D45273")
Set r = Union(r, worksheets("data").Range("D45275,D45277,D45279,D45280,D45581,D45882,D46183,D46484,D46785,D47086,D47387"))
For Each d in r  ' <-- Proceed from here

【讨论】:

  • 谢谢你的作品完美!现在消息框在后台等待单击然后在前台显示我如何仅在前台执行 msgbox? [链接]postimg.org/image/gf567vsnz
  • 不客气,很高兴它有帮助。对于新的问题,我觉得性质完全不同,所以我建议自己问一个问题(Excel VBA msgBox 在后台弹出),希望有人遇到同样的问题,并会给你一个解决方案。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多