需要简单的Excel VBA循环

时间:2016-01-19 20:50:42

标签: excel vba excel-vba for-loop

我正在尝试在Excel VBA中创建一个简单的循环,该循环从一行中获取信息并将相同的信息复制到下一行(或插入一个新行),具体取决于特定单元格上的值。

例如,第1行具有这些值(房屋1a,3级)

然后在单元格H5上创建结果

(house 1a, bottom level)
(house 1a, mid level)
(house 1a, top level)

意味着房屋1a的每个等级被分成3排。然后想象一下,我会列出另外10个不同等级的房子,最多3个,随机。

对于括号感到抱歉,但这位编辑一直在想我正在编写代码。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我假设源列是列A(1),输出行是列B(2)。

问题的一个可能解决方案是使用正则表达式和while循环。

要在VBA中启用正则表达式,请进入编辑器(VBE)。

  1. 点击工具标签。
  2. 点击参考文献
  3. 检查Microsoft VBScript正则表达式5.5
  4. 要运行代码,请创建一个单独的模块并插入:

    Sub splitCol()
    
        'Variables used in the regular expression
        Dim re As New RegExp
        Dim mc As MatchCollection
    
        'Variables used for row looping
        Dim sourceRow As Integer
        Dim targetRow As Integer
    
        'Variables used for output string
        Dim numberOfLevels As Integer
        Dim currentLevel As Integer
        Dim houseName As String
    
        'Regular expression patter
        re.Pattern = "(.+)?\,+\s+?(\d+)+\s+?levels"
    
        'With the asumption that Row 1 are headers I'm starting at row 2
        sourceRow = 2
        targetRow = 2
        numberOfLevels = 0
    
        'Loop through input row until blank is found
        While (Cells(sourceRow, 1).Value <> "")
            'Execute the regular expression
            Set mc = re.Execute(Cells(sourceRow, 1).Value)
    
            'Only create output string if regular expression was able to
            'executed without a problem
            If mc.Count > 0 Then
                houseName = mc(0).SubMatches(0)
                numberOfLevels = mc(0).SubMatches(1)
    
                currentLevel = 1
                While currentLevel <= numberOfLevels
                    Cells(targetRow, 2).Value = houseName & " , Level " & CStr(currentLevel)
                    targetRow = targetRow + 1
                    currentLevel = currentLevel + 1
                Wend
            End If
            sourceRow = sourceRow + 1
        Wend
    
    End Sub