多个下一个循环,其中2(或更多)必须同时更改

我有以下的逻辑scheme和价值:

Sub PrezziFissi() Dim i As Integer, k As Integer, z As Integer Dim FornitCerca As Range, data As Range, FornitVerif As Range, DataPaste As Range, NomePaste As Range, PrezzoPaste As Range Dim PrezzoFisso As Range Dim foglio As Worksheet Set foglio = ActiveWorkbook.Sheets("CODICI") For k = 10 To 110 Set FornitCerca = foglio.Range("I" & k) Set PrezzoFisso = foglio.Range("J" & k) For z = 3 To 601 Set data = foglio.Range("R" & z) Set FornitVerif = foglio.Range("S" & z) If FornitCerca = FornitVerif Then 'ELABORA - copia e incolla For i = 20 To 150 Set DataPaste = foglio.Range("B" & i) Set NomePaste = foglio("C" & i) Set PrezzoPaste = foglio("D" & i) If PrezzoPaste = 0 Then PrezzoFisso.Copy PrezzoPaste.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, operation:=xlNone Application.CutCopyMode = False FornitCerca.Copy 'c 20 NomePaste.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, operation:=xlNone Application.CutCopyMode = False data.Copy 'b 20 DataPaste.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, operation:=xlNone Application.CutCopyMode = False Else: Next i End If Next i Else: Next z End If Next z Next k End Sub 

因为只有(i)改变为前进1,则它在所有列D,C和B中复制z = 3的值,如果只有z改变,则在位置D20,C20,B20中覆盖来自匹配的值第20行

相反,我想(i)向前移动1到另一个destionation空单元格(第21行),也匹配移动从S3到S4(下面的单元格到S列)我希望把下一个z,下一我可能吗? 如果是,VBA会同时更改这些variables吗? 非常感谢你,为你的时间而道歉

三个循环可能不是必需的,尤其是因为你的循环限制不alignment:z运行的时间比k短很多,我比z短得多。 此外,嵌套循环将有乘法迭代。 例如,对于每个第k个元素,z将迭代3到150,然后对每个第z个元素迭代20到150,所以整体上是598 * 100 * 130! 几乎是笛卡尔乘积效应。 这是为什么你看到覆盖发生,因为你不断迭代相同的单元格。

广义循环

为了同时进行迭代,你可以把所有的范围包装在一个通用迭代中(你已经做了),初始化迭代器,然后运行if / then逻辑和复制/粘贴处理:

 k = 10 z = 3 i = 20 for iter = iter to 1000 Set yourfirstrange = Range("A" & k) Set yoursecondrange = Range("B" & z) Set yourthirdrange = Range("C" & i) ... k = k + 1 z = z + 1 i = i + 1 next iter 

再次,请注意您的范围限制和单元格编号没有充分alignment。

VLOOKUP

但是,可能有机会使用Vlookup,因为您只需在列范围内复制和粘贴匹配值的单元格。

下面是你最内层的/ next(i)循环的例子:

 'PrezzoFisso.Copy ---> PrezzoPaste.PasteSpecial Range("D20").Formula = "=VLOOKUP(S3, "I10:J110", 2, FALSE)" ... Range("D150").Formula = "=VLOOKUP(S133, "I10:J110", 2, FALSE)" 'FornitCerca.Copy ---> NomePaste.PasteSpecial Range("C20").Formula = "=VLOOKUP(S3, "I10:J110", 1, FALSE)" ... Range("C150").Formula = "=VLOOKUP(S133, "I10:J110", 1, FALSE)" 'data.Copy ---> DataPaste.PasteSpecial Range("B20").Formula = "=IF(VLOOKUP(S3, "I10:J110", 1, FALSE) > 0, R3, 0)" ... Range("B150").Formula = "=IF(VLOOKUP(S133, "I10:J110", 1, FALSE) > 0, R133, 0)" 

注意事项S不能超过133,因为公式运行单元格到单元格。

INDEX / MATCH

或者,您可以使用索引/匹配来克服一些Vlookup限制:

 'PrezzoFisso.Copy ---> PrezzoPaste.PasteSpecial Range("D20").Formula = "=INDEX(I10:J110,MATCH(S3,I10:I110,0),2)" 'FornitCerca.Copy ---> NomePaste.PasteSpecial Range("C20").Formula = "=INDEX(I10:J110,MATCH(S3,I10:I110,0),1)" 'data.Copy ---> DataPaste.PasteSpecial Range("B20").Formula = "=IF(INDEX(I10:J110,MATCH(S3,I10:I110,0),1)>0, R3, 0)" 

数据库

最后,在关于笛卡儿积的问题上,在关系数据库中, SQL查询连接就是这样:表中的笛卡儿积。 因此,如果你可以将你的范围(FornitCerca,PrezzoFisso,FornitVerif等等)放到不同的表中,可以将相关的列连接在一起,在你的最终结果集中创build一个查询。 MS Access ,Excel的兄弟办公室产品可以轻松地执行此join或使用Microsoft Query