确定列表中下一个未使用的值

问题描述 投票:0回答:1

我有一长串数字。我需要弄清楚哪个是使用的,哪个是免费的。

这些数字被放在另外12张纸中,所以我必须将它们全部搜索出来。

我需要它来生成下一个免费工具编号,不同的工具有不同的起始编号。

Rcount = 0
Row = 2
Set ran = Sheets("Alle").Range("A2:A1600")

For Each cell In ran
    
    FindString = Sheets("All").Cells(Row, 1).Value
    
    'MsgBox ("Test: " & FindString)
    If Trim(FindString) <> "" Then
        For Each sh In ActiveWorkbook.Worksheets
            With sh.Range("A:A")
                Set Rng = .Find(What:=FindString, _
                            After:=.Cells(.Cells.Count), _
                            LookIn:=xlValues, _
                            LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlNext, _
                            MatchCase:=False)
                If Not Rng Is Nothing Then
                MsgBox ("Row: " & Row)
                Exit Sub
            End If
        End With
    Next
End If
Row = Row + 1
Next cell

此代码仅获取第一行。

excel vba sequence
1个回答
0
投票

欢迎来到SO。

当你说使用的数字我理解你的意思是那些相邻列是X(或其他

FindString
)的数字

您可以创建一个包含所有行号的数组,其中 0 表示该行中没有

FindString
或行号(如果有)。

举个例子,我有 4 张工作表:

如果 B 列中有 X,我的代码仅返回每个工作表中的行号:

Sub test()
Dim DataRows As Variant
Dim i As Long
Dim rngSource As Range
Dim FindString As String
Dim wk As Worksheet


For Each wk In Sheets(Array("Sheet1", "Sheet3", "Sheet4")) 'array of 12 sheets
    
    'maybe you need to change parameters in each sheet. You can do it with Select Case
    ' I'm using the same parameters for all worksheets

    FindString = """X""" 'so it saves the quotes too
    Set rngSource = wk.Range("B1:B25")
    
    DataRows = Evaluate("ROW(" & rngSource.Address(, , , True) & ")*(--(" & rngSource.Address(, , , True) & "=" & FindString & "))")
    
    For i = LBound(DataRows) To UBound(DataRows) Step 1
        If DataRows(i, 1) > 0 Then Debug.Print wk.Name, DataRows(i, 1), wk.Range("A" & DataRows(i, 1)).Value 'show only row numbers of used numbers and used numbers
    Next i
    
    Erase DataRows

Next wk

End Sub

输出:

您只需要调整一些部分即可得到您想要的。

这里最棘手的部分是这行代码:

DataRows = Evaluate("ROW(" & rngSource.Address(, , , True) & ")*(--(" & rngSource.Address(, , , True) & "=" & FindString & "))")

Evaluate 将计算一个函数,就像您在 Excel 中键入它一样,因此在第一个循环中它将像这样:

ROW(B1:B25)*(--(B1:25="X"))

这是一个棘手的函数,它返回一个数字数组。

(B1:25="X")
如果单元格是否等于 X,它只是一个 1 和 0 的数组。然后将该数组乘以行号。如果单元格不是 X,则
rownumber*0=0
表示它是空的。在其他情况下
rownumber*1=rownumber
所以你只得到零和所用数字的行号:)

然后将其保存到一个数组中(数组工作得更快),如果数组中的值零,则仅获取输出。

顺便说一句,

DataRows
是一个二维数组,代码中需要一个索引行
i
和一个列索引(代码中始终为1)。

其余代码很容易理解。

© www.soinside.com 2019 - 2024. All rights reserved.