首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Excel值。

使用Excel值。
EN

Stack Overflow用户
提问于 2022-11-04 06:40:40
回答 1查看 38关注 0票数 1

我有个小问题,我想不出来。

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

和照片一样,我需要它来找出女巫的数字。这些数字被放在另外12张纸上,所以我得把它们都搜一遍。

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

诚挚的问候。

希望有人能帮忙

代码语言:javascript
运行
复制
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

已经尝试过这段代码,但只得到了第一行。所以我想是出了点问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-04 10:50:31

欢迎来到这里。

当你说用过的数字时,我理解你指的是相邻列是X(或其他FindString)的那些数字。

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

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

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

代码语言:javascript
运行
复制
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

输出:

你只需要调整一些部件就能得到你想要的东西。

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

代码语言:javascript
运行
复制
DataRows = Evaluate("ROW(" & rngSource.Address(, , , True) & ")*(--(" & rngSource.Address(, , , True) & "=" & FindString & "))")

计算将评估一个函数,就像您在Excel中键入它一样,所以在第一个循环中,它将如下所示:

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

这是一个很复杂的函数,它返回一个数字数组。(B1:25="X"),如果单元格等于或不等于X,它只是一个1和0的数组。然后将该数组乘以行号。如果单元格不是X,那么rownumber*0=0就意味着它是空的。在另一种情况下,使用的数字只有零和行号,所以rownumber*1=rownumber :)

然后将其保存到数组中(数组工作得更快),如果数组中的值不是0,则只获得输出。

顺便说一下,DataRows是一个二维数组,您需要代码中的索引行i和列索引(代码中总是有1)。

其余的代码很容易理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74313070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档