这背后的想法是有一个输入区域和一个显示区域。输入区域保存值,显示值显示(全部准备完成)。输入区域可以小于或大于要提供的内容。这是一个场景;
----sheet3------ ------sheet4-------
DISPLAY INPUTS
Name Val Name Val
A8 B8 D8 E8
1 x -1 Oranges 5
2 x -1 Peanutes 2
3 x -1 Peaches 6
4 x -1 Coffee -1
Nuts 6
Corn 10
如图所示,显示屏只能包含四个非-1的值。我们可以在代码中将这个数字4设为固定数字。我有功能到位(countif公式)填充显示器先到先服务,但需要功能将msgbox输入名称,如果显示器中没有空间。 -1值表示无输入。我需要一个消息框,显示无法显示的输入名称。在这种情况下,一个消息框" Corn"因为这是唯一一个无法显示的。我怎么能用范围而不是固定的单元格数来做这个呢?
这是一个非工作的pseduo /编写的代码示例,我将它们放在一起以更好地了解如何使用范围执行此操作。 Range1代表D8,而Range2代表D13。
Dim i As Long, cnt As Long
cnt = 1
For i = Worksheets("Sheet4").Range("range1").count To Worksheets("Sheet4").Range("range2").count 'Get all items between.
If cnt <= 4 'if less what display can offer
If i != -1 then 'val is not nothing
cnt = cnt + 1 'increment how many items we have displayed
end if
else
msgbox Sheets("Sheet4").Range("A" & i).Value ' The value of I is incorrect as that is not the true range row number. Can you get the actual row of the range with something like .Rows?
end if
Next i
答案 0 :(得分:1)
试试这个。我已经改变它,因此只有一个命名范围以简化。即range1
是D8:E13。 (如果您愿意,可以很容易地将其更改)
Option Explicit
Sub test()
Dim i As Long, cnt As Long
cnt = 1
For i = Worksheets("Sheet4").Range("range1").Row To Worksheets("Sheet4").Range("range1").Row + Worksheets("Sheet4").Range("range1").Rows.Count - 1 'Get all items between.
If cnt <= 4 Then 'if less what display can offer
If Worksheets("Sheet4").Range("range1").Cells(i - Worksheets("Sheet4").Range("range1").Row + 1, 2) <> -1 Then 'val is not nothing
cnt = cnt + 1 'increment how many items we have displayed
End If
Else
MsgBox Worksheets("Sheet4").Range("range1").Cells(i - Worksheets("Sheet4").Range("range1").Row + 1, 1).Value
End If
Next i
End Sub
答案 1 :(得分:0)
你可以试试这个
Sub main()
Dim cnt As Long
Dim cell As Range
Dim msgString As String
With Worksheets("Sheet4")
With .Range("D7", .Cells(.Rows.count, "D").End(xlUp))
.Offset(, 1).AutoFilter field:=1, Criteria1:="<>-1"
For Each cell In .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
cnt = cnt + 1
If cnt > 4 Then msgString = msgString & cell.Value & vbCrLf
Next cell
If msgString <> "" Then MsgBox Left(msgString, Len(msgString) - 1)
End With
.AutoFilterMode = False
End With
End Sub