Excel VBA嵌套循环将再次从0开始计数

时间:2018-08-28 08:36:54

标签: excel vba excel-vba

我正在编写一个脚本以在消息框中打印,单元格值和重复数从1-5开始计数。

当前,我有一个for循环,用于计算电子表格中的总行数。我不确定如何添加另一个for循环(嵌套的for循环)以调用该程序以将1到5添加到前5行,然后在第6行再次从1到5重新启动,依此类推。

例如,

如果单元格A1到A10中的值分别是“ Apple”,我想将数字从1转换为5,以便得到以下结果:

A1 = "Apple1"
A2 = "Apple2"
A3 = "Apple3"
A4 = "Apple4"
A5 = "Apple5"
A6 = "Apple1" 'it starts from 1 again
A7 = "Apple2"

以此类推

下面是我的示例代码:

Option Explicit
Sub appendCount()
    Dim q, i, rowStart, rowEnd , rowNum, LR as Long

    LR = Cells(Rows.Count, 1).End(xlUp).Row
    rowNum = Range("A1:A" & LR).Count

    For q = 1 To rowNum Step 1
        If Not IsNull(Range("A" & q)) Then
        For i = 1 to 5        
            MsgBox Range("A" & q).Value & i
        Next i
        End If
    Next q
End Sub

任何帮助将不胜感激!

7 个答案:

答案 0 :(得分:2)

单元格上的

IsNull()将始终返回False。将IsNull替换为IsEmpty
或使用someCell <> ""

请参见https://stackoverflow.com/a/2009754/78522

答案 1 :(得分:2)

我相信以下内容将达到您的期望,它将查看A列中的值,并将计数添加到B列中:

Option Explicit

Sub appendCount()
    Dim LR As Long, rownumber As Long, counter As Long
    Dim ws As Worksheet: Set ws = Worksheets("Sheet1")
    'declare and set the worksheet you are working with, amend as required
    counter = 0
    LR = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For rownumber = 1 To LR Step 1
        If Not IsEmpty(ws.Range("A" & rownumber)) Then
            counter = counter + 1
            If counter = 6 Then counter = 1
            ws.Range("B" & rownumber).Value =ws.Range("A" & rownumber).value & counter
        End If
    Next rownumber
End Sub

答案 2 :(得分:1)

我了解您的问题是,单元格A1到A10中的值分别是“ Apple”,您要包含从1到5的数字,那么A6到A10的内容也是1到5。

这是我的测试代码,您可以尝试:

显式选项

Sub appendCount()
    Dim q, i, cou, rowStart, rowEnd, rowNum, LR As Long

LR = Cells(Rows.count, 1).End(xlUp).Row
rowNum = Range("A1:A" & LR).count
cou = 1

For q = 1 To rowNum Step 1
    If Not IsNull(Range("A" & q)) Then

      For i = 1 To 5
        MsgBox Range("A" & q).Value & cou
        cou = cou + 1
        If cou = 6 Then
            cou = 1
        End If
      Next i
    End If
Next q
End Sub

答案 3 :(得分:1)

使用数组会更快。同样,mod会因为大量失败而失败,因此下面的代码可以处理大量数字。开始重新编号的点也放入一个常量中,以方便进行更改。因此,整体代码更加灵活和有弹性。

Option Explicit
Public Sub AddNumbering()
    Dim arr(), i As Long, lastRow As Long, index As Long
    Const RENUMBER_AT = 6

    With ThisWorkbook.Worksheets("Sheet1")
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        Select Case lastRow
        Case 1
            ReDim arr(1, 1): arr(1, 1) = .Range("A1").Value
        Case Else
            arr = .Range("A1:A" & lastRow).Value
        End Select
        index = 1
        For i = LBound(arr, 1) To UBound(arr, 1)
            If arr(i, 1) <> vbNullString Then
                If i - (CLng(i / RENUMBER_AT) * RENUMBER_AT) <> 0 And i <> 1 Then
                    index = index + 1
                Else
                    index = 1
                End If
                arr(i, 1) = arr(i, 1) & CStr(index)
            End If
        Next
        .Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    End With
End Sub

答案 4 :(得分:0)

您的声明是错误的,尽管您可能期望这些变量未声明为Long而是Variant:q,i,rowStart,rowEnd和rowNum,但必须分别包含每个变量的类型。

此代码应为您解决问题:

Sub appendCount()
    Dim q As Long, LR As Long, rowNum As Long

    LR = Cells(Rows.Count, 1).End(xlUp).Row
    rowNum = Range("A1:A" & LR).Count

    For q = 1 To rowNum Step 1
        If Not Len(Range("A" & q).Value) = 0 Then
            If q Mod 5 = 0 Then
                MsgBox Range("A" & q).Value & 5
            Else
                MsgBox Range("A" & q).Value & (q Mod 5)
            End If
        End If
    Next q
End Sub

答案 5 :(得分:0)

Sub appendCount()
Dim q, c, i, rowStart, rowEnd, rowNum, LR As Long

LR = Cells(Rows.Count, 1).End(xlUp).Row
rowNum = Range("A1:A" & LR).Count

c = 1
For q = 1 To rowNum Step 1
    If Not IsEmpty(Range("A" & q)) Then
    If (c Mod 6) <> 0 Then
    Range("B" & q).Value = Range("A" & q).Value & (c Mod 6)
    Else
    c = c + 1
    Range("B" & q).Value = Range("A" & q).Value & (c Mod 6)
    End If
    End If
c = c + 1
Next q

结束子

答案 6 :(得分:0)

这可以做到:

Sub Loops()
Dim i As Long, iMultiples As Long, iMultiple As Long

iMultiples = WorksheetFunction.Ceiling_Math(Cells(Rows.Count, 1).End(xlUp).Row, 5, 0) ' this rounds up to the nearest 5 (giving the number of multiples

For iMultiple = 1 To iMultiples
    For i = 1 To 5
        If Not IsNull(Range("A" & i).Value) Then Range("A" & i).Value = "Apple" & i 'This can be tweaked as needed
    Next
Next


End Sub