Excel 如果对行进行排序以使行号不为';t连续

Excel 如果对行进行排序以使行号不为';t连续,excel,vba,loops,rows,Excel,Vba,Loops,Rows,我试图使用VBA在excel电子表格中的行中循环,只涉及第17列中的数据(因此是单元格(I,17).Value)。我想遍历第17列中的行,然后遍历特定单元格中的各个字符,检查它们是否包含数字或句号。如果有,我想将它们添加到一个变量num中,然后在遍历单元格并到达末尾后,我想用num变量中存储的内容替换单元格的内容。然后我转到下一行并重复,直到循环通过所有行。我相信到目前为止我的代码可以做到这一点 然而,我已经意识到,由于我在行中循环的方式,我遇到了这个问题。我循环通过的行没有连续编号,因此我的f

我试图使用VBA在excel电子表格中的行中循环,只涉及第17列中的数据(因此是单元格(I,17).Value)。我想遍历第17列中的行,然后遍历特定单元格中的各个字符,检查它们是否包含数字或句号。如果有,我想将它们添加到一个变量num中,然后在遍历单元格并到达末尾后,我想用num变量中存储的内容替换单元格的内容。然后我转到下一行并重复,直到循环通过所有行。我相信到目前为止我的代码可以做到这一点

然而,我已经意识到,由于我在行中循环的方式,我遇到了这个问题。我循环通过的行没有连续编号,因此我的for循环从第1行开始,然后是第2行。这会导致问题,因为我必须循环通过的数据没有连续编号,因此行号为:

1、182、477、480、620等。它们在物理上是一个比另一个低,但在数字上不是一个,因此我正在努力研究如何在没有连续行号的行中循环

很抱歉,这是我在这个论坛上的第一个问题,非常感谢您的帮助,我也是VisualBasic新手,如果我的回答看起来很愚蠢,那么很抱歉

以下是我目前掌握的代码:

LastRow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row

For i = 1 To LastRow

If Cells(i, 17).Value <> "Remaining Labor Units" Then

    For CharCellCount = 1 To Len(Cells(i, 17).Value)
        char = Mid(Cells(i, 17), CharCellCount, 1)

        If char Like "[0-9]" Then
            num = num + char

        ElseIf char Like "." Then
            num = num + char
        End If

        If CharCellCount = Len(Cells(i, 17).Value) Then
            CharCellCount = 0
            Cells(i, 17).Value = num
            num = 0
        End If
    Next CharCellCount

ElseIf Cells(i, 17).Value = "Remaining Labor Units" Then
    Cells(i, 17).Value = "Remaining Labor Units"

End If

Next i

End Sub
LastRow=Cells.Find(“*”,[A1],.xlByRows,xlPrevious).Row
对于i=1到最后一行
如果单元格(i,17).值为“剩余劳动力单位”,则
对于CharCellCount=1到Len(单元格(i,17).值)
char=Mid(单元格(i,17),CharCellCount,1)
如果char像“[0-9]”,那么
num=num+char
ElseIf char Like“那么
num=num+char
如果结束
如果CharCellCount=Len(单元格(i,17).Value),则
CharCellCount=0
单元格(i,17)。值=num
num=0
如果结束
下一个字符计数
ElseIf单元格(i,17).Value=“剩余劳动力单位”然后
单元格(i,17).Value=“剩余劳动力单位”
如果结束
接下来我
端接头

其他行是否隐藏?在这种情况下,您可以使用下面的代码。我已经实现了以下属性:

rng.SpecialCells(xlCellTypeVisible)
此代码将范围设置为可见的单元格

我在这里找到了解决方案:

公共子测试()
暗i作为范围
变暗rng As范围
将最后一行设置为整数
LastRow=单元格。查找(“*”,[A1],.xlByRows,xlPrevious)。行
设置rng=范围(“A1:A”和最后一行)
对于rng.SpecialCells中的每个i(xlCellTypeVisible)
如果单元格(i,17).值为“剩余劳动力单位”,则
对于CharCellCount=1到Len(单元格(i,17).值)
char=Mid(单元格(i,17),CharCellCount,1)
如果char像“[0-9]”,那么
num=num+char
ElseIf char Like“那么
num=num+char
如果结束
如果CharCellCount=Len(单元格(i,17).Value),则
CharCellCount=0
单元格(i,17)。值=num
num=0
如果结束
下一个字符计数
ElseIf单元格(i,17).Value=“剩余劳动力单位”然后
单元格(i,17).Value=“剩余劳动力单位”
如果结束
接下来我
端接头

Wouter

假设您实际上有一个筛选列表,该列表当前状态仅返回行1、182、477、480、620等,在这种情况下,您可以将
for
行更改为以下内容:

For Each cell In Range(Cells(1, 17), Cells(Rows.Count, 17).End(xlUp)).SpecialCells(xlCellTypeVisible)
在这种情况下,您还需要将引用,即
单元格(i,17).value
更改为仅
单元格.value

并将
next i
更改为just
next

为什么不在循环之前对数据进行排序?完成后,您可以按原始顺序重新排序。谢谢,效果很好!问题稍有不同,但如果我想将单元格的值设置为与num变量中存储的值相等,我该怎么做?我正在做cell.Value=num,但它似乎没有做任何事情。。。在一些模拟数据上对我来说似乎工作正常。“num”声明为什么?假设它是未声明的。将其声明为
Dim num as String
,然后使用
num=”“
而不是
num=0将其重置为字符串,我将其改为num=empty,谢谢您的帮助
For Each cell In Range(Cells(1, 17), Cells(Rows.Count, 17).End(xlUp)).SpecialCells(xlCellTypeVisible)