VBA Excel中的嵌套循环

我需要根据这些数据创build一个列表。 我需要它通过数字080808呈现数字000000.希望像这样格式化数据…

000000 – CHW设备RTU

000001 – CHW设备冷却器

等等。我需要列出所有可能的数字组合,并说明它们是什么。 喜欢:

=连接(A1,C1,E1,“ – ”,B1,“”,D1,“”,F1)

除了通过所有可能的组合循环。 有人可以帮我想出一个循环,这将做到这一点? 我不熟悉macros。

ABCDEF 00 CHW 00 Equipment 00 RTU 01 HHW 01 SM Steel Pipe 01 Chiller 02 Steam 02 LB Steel Pipe 02 Split System 03 Med Gas 03 Copper 03 Pump 04 UG/Soil 04 Cast Iron 04 Boiler 05 Domestic Water 05 Plastic 05 Cooling Tower 06 Compressed Air 06 Double-Wall 06 Air Compressor 07 Natural Gas 07 Sheetmetal 07 Fan 08 Refrigerant 08 Fixtures 08 Unit Vent 

  Sub GetAllCombinations() Dim rowNum As Integer Dim rowValue As String Dim celRange As String Dim A As String Dim B As String Dim C As String Dim D As String Dim E As String Dim F As String rowNum = 1 For Each cell In Range("A2:A10") A = Range("A" + CStr(cell.Row)).Value B = Range("B" + CStr(cell.Row)).Value For Each cell2 In Range("C2:C10") C = Range("C" + CStr(cell2.Row)).Value D = Range("D" + CStr(cell2.Row)).Value For Each cell3 In Range("E2:E10") E = Range("E" + CStr(cell3.Row)).Value F = Range("F" + CStr(cell3.Row)).Value Range("H" + CStr(rowNum)).Value = A + C + E + " - " + B + D + F rowNum = rowNum + 1 Next Next Next End Sub 

既然你说你不熟悉VBA,这里是一个工作表函数解决scheme。 只需input一列的第一行,并填入行729:

 =INDEX($A$1:$A$9,INT((ROW()-1)/81)+1)&INDEX($C$1:$C$9,MOD(INT((ROW()-1)/9),9)+1)&INDEX($E$1:$E$9,MOD(ROW()-1,9)+1)&" - "&INDEX($B$1:$B$9,INT(ROW()/81)+1)&" "&INDEX($D$1:$D$9,MOD(INT((ROW()-1)/9),9)+1)&" "&INDEX($F$1:$F$9,MOD(ROW()-1,9)+1) 

我同意@ARICH的评论,但由于我无法抵挡自己,所以是代码:

 Sub CombineList() Dim i As Integer Dim Cell1 As Range, Cell2 As Range, Cell3 As Range i = 0 For Each Cell1 In Range("A2:A10") For Each Cell2 In Range("C2:C10") For Each Cell3 In Range("E2:E10") i = i + 1 Range("G" & i + 1).Value = CStr(Cell1.Value) & (Cell2.Value) & (Cell3.Value) _ & " - " & CStr(Cell1.Offset(0, 1).Value) & " " & (Cell2.Offset(0, 1).Value) & _ " " & (Cell3.Offset(0, 1).Value) Next Cell3 Next Cell2 Next Cell1 End Sub 

我也做了一个…这是值得的

 Sub Create_list() 'Declare Variables Dim a As Integer Dim b As Integer Dim c As Integer Dim ws1lastrow As Integer Dim ws2lastrow As Integer Dim ws1 As Worksheet Dim ws2 As Worksheet 'Set Variables Set ws1 = ThisWorkbook.Sheets("sheet1") Set ws2 = ThisWorkbook.Sheets("sheet2") ws1lastrow = ws1.UsedRange.Rows.Count ws2lastrow = 2 'Start at row 2 to leave room for header 'The three loops For a = 2 To ws1lastrow 'Again start at row 2 For b = 2 To ws1lastrow For c = 2 To ws1lastrow 'Build the index number ws2.Cells(ws2lastrow, 1).Value = "'" & Format(ws1.Cells(a, 1).Value, "00") & Format(ws1.Cells(b, 3).Value, "00") & Format(ws1.Cells(c, 5).Value, "00") 'Build the value ws2.Cells(ws2lastrow, 2).Value = ws1.Cells(a, 2).Value & " " & ws1.Cells(b, 4).Value & " " & ws1.Cells(c, 6).Value 'advance ws2's row counter ws2lastrow = ws2lastrow + 1 Next c Next b Next a End Sub 

inheritance人是一个通用的循环来获得所有范围的组合。 如果需要,这个方法可以扩展到更多的范围,我在这里创build了一个示例工作簿

 Sub AllCombos() Dim rngA As Range: Dim rngB As Range: Dim rngC As Range Dim vaResults() Dim ws As Worksheet 'User set references to ranges - they can be different sizes Set rngA = Range("A2:A10") Set rngB = Range("C2:C10") Set rngC = Range("E2:E10") 'Determine total number of combos that will be created iComboCount = rngA.Count * rngB.Count * rngC.Count ReDim vaResults(1 To iComboCount, 1 To 1) 'Loop through all combos of indices for ranges '---------------------------------------------- cnt = 0: aIndex = 0: bIndex = 0: cIndex = 0 Do Until cnt >= iComboCount cIndex = (cnt Mod rngC.Count) + 1 'if cIndex started over, add 1 to bIndex If cIndex = 1 Then bIndex = bIndex Mod rngB.Count + 1 'if bIndex AND cIndex started over, add 1 to aIndex If (bIndex * cIndex) = 1 Then aIndex = aIndex Mod rngA.Count + 1 'etc... if more columns needed 'Now we have all indices, save the desired value in VBA array vaResults(cnt + 1, 1) = "'" & _ rngA.Cells(aIndex, 1) & rngB.Cells(bIndex, 1) & rngC.Cells(cIndex, 1) & " - " & _ rngA.Cells(aIndex, 2) & rngB.Cells(bIndex, 2) & rngC.Cells(cIndex, 2) cnt = cnt + 1 Loop 'Output the result array to excel '---------------------------------- Set ws = Worksheets.Add 'Make an output range that is the same size as VBA array Set rngOutput = ws.Cells(1, 1).Resize(UBound(vaResults, 1), UBound(vaResults, 2)) 'Copy the VBA array to Excel rngOutput.Value = vaResults MsgBox "All combos created" End Sub