2016-12-15 73 views
1

你能帮我用宏吗?我有一个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)

这部分代码显示了我的错误。 enter image description here

+1

修改'.Range( “D155:D155”, “D456:D456”, “D757:D757”, “D1058:D758” ,....)''到''.Range(“D155,D456,D757,D1058”....)'。你需要确保你的'范围'是有效的。该'“'都在开始时和括号结束'()' –

+0

如果你的'worksheets'的说法是真实的''Worksheets'收集Workbook'对象,那么你最好通过你的函数'workbook'对象(即:'公用Sub检查(WB作为练习册)'),然后使用'关于C在wb.Worksheets(“数据”)',只是不要乱用内置的对象名称 – user3598756

+0

好吧,我试图改变,第一部分代码是好的,但第二部分显示我在这部分的错误:对于每个c在工作表(“数据”)范围(“D29,D31,D33,D35,D37,D39,D41,D43,D45,D47,D49, D51:D57,D59, –

回答

2

除了应用上述评论(尤其是使用"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") 

编辑:下一个问题

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

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 
+0

感谢您完美的作品!。现在消息框在背景上,然后等待点击然后在前景上显示我如何仅在前景上使用msgbox? [链接] https://postimg.org/image/gf567vsnz/ –

+0

不客气,很高兴帮助。对于新问题,我认为它是完全不同的性质,所以我建议单独提出一个问题(Excel VBA msgBox在后台弹出),希望有人遇到同样的问题,并会给你一个解决方案。 –