Vba 嵌套循环流控制
我会简明扼要,坚持我所知道的。这段代码在很大程度上可以正常工作。唯一的问题是x和z循环的迭代。这些to循环应设置Y循环的范围和yLABEL。 我可以通过一套,在事情变得疯狂之后,我可以找到正确的射程。我知道其中的一些与不打破x设置z,然后回到x更新范围有关 它应该工作z,然后找到x。它们之间的范围设置为y。然后下一个x,但y保持,然后y和x之间的范围设置为y。。诸如此类,诸如此类,有点像一个从楼梯上溜走的人。或者一个滑动尺,取决于我如何设置循环,在两次迭代后,我会在所有地方结束 我做了一些事情,但每次我突破x设置z时,x都会在范围的顶部重新启动。至少我认为我看到的是这样。在示例工作表中,我已经改变了偏移处理循环的方式,但想法仍然是一样的。我现在有goto语句,我打算在循环工作后尝试找出条件开关。任何帮助、指导或建议都将不胜感激Vba 嵌套循环流控制,vba,loops,excel,nested,Vba,Loops,Excel,Nested,我会简明扼要,坚持我所知道的。这段代码在很大程度上可以正常工作。唯一的问题是x和z循环的迭代。这些to循环应设置Y循环的范围和yLABEL。 我可以通过一套,在事情变得疯狂之后,我可以找到正确的射程。我知道其中的一些与不打破x设置z,然后回到x更新范围有关 它应该工作z,然后找到x。它们之间的范围设置为y。然后下一个x,但y保持,然后y和x之间的范围设置为y。。诸如此类,诸如此类,有点像一个从楼梯上溜走的人。或者一个滑动尺,取决于我如何设置循环,在两次迭代后,我会在所有地方结束 我做了一些事情,
Option Explicit
Sub parse()
Application.DisplayAlerts = False
'Application.EnableCancelKey = xlDisabled
Dim strPath As String, strPathused As String
strPath = "C:\clerk plan2"
Dim objfso As FileSystemObject, objFolder As Folder, objfile As Object
Set objfso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objfso.GetFolder(strPath)
'Loop through objWorkBooks
For Each objfile In objFolder.Files
If objfso.GetExtensionName(objfile.Path) = "xlsx" Then
Dim objWorkbook As Workbook
Set objWorkbook = Workbooks.Open(objfile.Path)
' Set path for move to at end of script
strPathused = "C:\prodplan\used\" & objWorkbook.Name
objWorkbook.Worksheets("inbound transfer sheet").Activate
objWorkbook.Worksheets("inbound transfer sheet").Cells.UnMerge
'Range management WB
Dim SRCwb As Worksheet, SRCrange1 As Range, SRCrange2 As Range, lastrow As Range
Set SRCwb = objWorkbook.Worksheets("inbound transfer sheet")
Set SRCrange1 = SRCwb.Range("g3:g150")
Set SRCrange2 = SRCwb.Range("a1:a150")
Dim DSTws As Worksheet
Set DSTws = Workbooks("clerkplan2.xlsm").Worksheets("transfer")
Dim STR1 As String, STR2 As String, xVAL As String, zVAL As String, xSTR As String, zSTR As String
STR1 = "INBOUND TRANS"
STR2 = "INBOUND CA TRANS"
Dim x As Variant, z As Variant, y As Variant, zxRANGE As Range
For Each z In SRCrange2
zSTR = Mid(z, 1, 16)
If zSTR <> STR2 Then GoTo zNEXT
If zSTR = STR2 Then
zVAL = z
End If
For Each x In SRCrange2
xSTR = Mid(x, 1, 13)
If xSTR <> STR1 Then GoTo xNEXT
If xSTR = STR1 Then
xVAL = x
End If
Dim yLABEL As String
If xVAL = x And zVAL = z Then
If x.Row > z.Row Then
Set zxRANGE = SRCwb.Range(x.Offset(1, 0).Address & " : " & z.Offset(-1, 0).Address)
yLABEL = z.Value
Else
Set zxRANGE = SRCwb.Range(z.Offset(-1, 0).Address & " : " & x.Offset(1, 0).Address)
yLABEL = x.Value
End If
End If
MsgBox zxRANGE.Address ' DEBUG
For Each y In zxRANGE
If y.Offset(0, 6) = "Temp" Or y.Offset(0, 14) = "Begin Time" Or y.Offset(0, 15) = "End Time" Or _
Len(y.Offset(0, 6)) = 0 Or Len(y.Offset(0, 14)) = 0 Or Len(y.Offset(0, 15)) = "0" Then yNEXT
Set lastrow = Workbooks("clerkplan2.xlsm").Worksheets("transfer").Range("c" & DSTws.Rows.Count).End(xlUp).Offset(1, 0)
y.Offset(0, 6).Copy
lastrow.PasteSpecial Paste:=xlPasteValues, operation:=xlNone, skipblanks:=True, Transpose:=False
DSTws.Activate
ActiveCell.Offset(0, -1) = objWorkbook.Name
ActiveCell.Offset(0, -2) = yLABEL
objWorkbook.Activate
y.Offset(0, 14).Copy
Set lastrow = Workbooks("clerkplan2.xlsm").Worksheets("transfer").Range("d" & DSTws.Rows.Count).End(xlUp).Offset(1, 0)
lastrow.PasteSpecial Paste:=xlPasteValues, operation:=xlNone, skipblanks:=True, Transpose:=False
objWorkbook.Activate
y.Offset(0, 15).Copy
Set lastrow = Workbooks("clerkplan2.xlsm").Worksheets("transfer").Range("e" & DSTws.Rows.Count).End(xlUp).Offset(1, 0)
lastrow.PasteSpecial Paste:=xlPasteValues, operation:=xlNone, skipblanks:=True, Transpose:=False
yNEXT:
Next y
xNEXT:
Next x
zNEXT:
Next z
strPathused = "C:\clerk plan2\used\" & objWorkbook.Name
objWorkbook.Close False
'Move proccesed file to new Dir
Dim OldFilePath As String
Dim NewFilePath As String
OldFilePath = objfile 'original file location
NewFilePath = strPathused ' new file location
Name OldFilePath As NewFilePath ' move the file
End If
Next
End Sub
选项显式
子解析()
Application.DisplayAlerts=False
'Application.EnableCancelKey=xlDisabled
将strPath设置为字符串,将strPath设置为字符串
strPath=“C:\clerk plan2”
Dim objfso作为文件系统对象,objFolder作为文件夹,objfile作为对象
设置objfso=CreateObject(“Scripting.FileSystemObject”)
设置objFolder=objfso.GetFolder(strPath)
'通过objworkbook循环
对于objFolder.Files中的每个objfile
如果objfso.GetExtensionName(objfile.Path)=“xlsx”,则
将工作簿设置为工作簿
设置objWorkbook=Workbooks.Open(objfile.Path)
'在脚本末尾设置移动到的路径
strPathused=“C:\prodplan\used\”&objWorkbook.Name
OBJ工作簿。工作表(“入站转账单”)。激活
objWorkbook.Worksheets(“入站转账单”).Cells.UnMerge
“射程管理WB
将SRCwb标注为工作表,SRCrange1标注为范围,SRCrange2标注为范围,最后一行标注为范围
设置SRCwb=objWorkbook.Worksheets(“入站转账单”)
设置SRCrange1=SRCwb.Range(“g3:g150”)
设置SRCrange2=SRCwb.Range(“a1:a150”)
将DSTW设置为工作表
设置DSTws=工作簿(“clerkplan2.xlsm”)。工作表(“转移”)
Dim STR1作为字符串,STR2作为字符串,xVAL作为字符串,zVAL作为字符串,xSTR作为字符串,zSTR作为字符串
STR1=“入站传输”
STR2=“入站CA传输”
尺寸x为变型,z为变型,y为变型,ZX范围为范围
对于SRCrange2中的每个z
zSTR=Mid(z,1,16)
如果是zSTR STR2,则转到zNEXT
如果zSTR=STR2,则
zVAL=z
如果结束
对于SRCrange2中的每个x
xSTR=Mid(x,1,13)
如果是xSTR STR1,则转到xNEXT
如果xSTR=STR1,则
xVAL=x
如果结束
以字符串形式显示标签
如果xVAL=x且zVAL=z,则
如果x行>z行,则
设置zxRANGE=SRCwb.Range(x.Offset(1,0).Address&“:”&z.Offset(-1,0).Address)
yLABEL=z.值
其他的
设置zxRANGE=SRCwb.Range(z.Offset(-1,0).Address&“:”&x.Offset(1,0).Address)
yLABEL=x.值
如果结束
如果结束
MsgBox zxRANGE.Address“调试”
对于ZX范围内的每个y
如果y偏移量(0,6)=“温度”或y偏移量(0,14)=“开始时间”或y偏移量(0,15)=“结束时间”或_
Len(y.Offset(0,6))=0或Len(y.Offset(0,14))=0或Len(y.Offset(0,15))=0”,然后是yNEXT
Set lastrow=工作簿(“clerkplan2.xlsm”)。工作表(“传输”)。范围(“c”和DSTws.Rows.Count)。结束(xlUp)。偏移量(1,0)
y、 偏移量(0,6)。复制
lastrow.PasteSpecial Paste:=xlPasteValues,操作:=xlNone,skipblanks:=True,转置:=False
激活
ActiveCell.Offset(0,-1)=obj工作簿.Name
ActiveCell.Offset(0,-2)=yLABEL
objWorkbook.Activate
y、 偏移量(0,14)。复制
设置lastrow=工作簿(“clerkplan2.xlsm”)。工作表(“传输”)。范围(“d”和DSTws.Rows.Count)。结束(xlUp)。偏移量(1,0)
lastrow.PasteSpecial Paste:=xlPasteValues,操作:=xlNone,skipblanks:=True,转置:=False
objWorkbook.Activate
y、 偏移量(0,15)。复制
设置lastrow=工作簿(“clerkplan2.xlsm”)。工作表(“传输”)。范围(“e”和DSTws.Rows.Count)。结束(xlUp)。偏移量(1,0)
lastrow.PasteSpecial Paste:=xlPasteValues,操作:=xlNone,skipblanks:=True,转置:=False
yNEXT:
下一个y
xNEXT:
下一个x
zNEXT:
下一个z
strPathused=“C:\clerk plan2\used\”&objWorkbook.Name
objWorkbook.Close False
'将已处理的文件移动到新目录
将OldFilePath设置为字符串
将NewFilePath设置为字符串
OldFilePath=objfile的原始文件位置
NewFilePath=strPathused“新文件位置”
将OldFilePath命名为NewFilePath“移动文件”
如果结束
下一个
端接头
当你说:
用于SRCrange2中的每个z
和用于SRCrange2中的每个x
这是否有帮助,或者至少让你走上正轨
For Each z In SRCrange2
zSTR = Mid(z, 1, 16)
xSTR = Mid(x, 1, 13)
If zSTR <> STR2 AND xSTR <> STR1 Then GoTo zNEXT
If zSTR = STR2 Then zVAL = z
If xSTR = STR1 Then xVAL = x
... [rest of code] ...
zNext:
Next z
用于SRCrange2中的每个z
zSTR=Mid(z,1,16)
xSTR=Mid(x,1,13)
如果是zSTR STR2和xSTR STR1,则转到zNEXT
如果zSTR=STR2,则zVAL=z
如果xSTR=STR1,那么xVAL=x
... [代码的其余部分]。。。
zNext:
下一个z
我假设在文件中循环不是问题,所以我不打算解决这个问题。如果我要把你的原始数据转换成你的数据
Sub Parse()
Dim rRng As Range
Dim rCell As Range
Dim bStartGroup As Boolean
Dim shDest As Worksheet
Dim sDateCycle As String
Dim rNext As Range
Set rRng = Sheet1.Range("A1:A150")
Set shDest = ThisWorkbook.Sheets.Add
For Each rCell In rRng.Cells
'only change sDateCycle when a new group starts
If StartsGroup(rCell.Value) Then
sDateCycle = rCell.Value
Else 'not the start of a group, so process the data
'don't copy blanks or headers
If IsData(rCell.Value) Then
'find the next blank cell
Set rNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0)
'write the date cycle
rNext.Value = sDateCycle
'write the workbook name
rNext.Offset(0, 1).Value = rRng.Parent.Parent.Name
'write the time in, time out, and smelly
rCell.Offset(0, 1).Resize(1, 3).Copy rNext.Offset(0, 2).Resize(1, 3)
End If
End If
Next rCell
End Sub
Function StartsGroup(ByVal sValue As String) As Boolean
'You need to write this funciton to return True when the cell you're on starts a new date cycle
'I wrote it to check if everything after the last space is a date
'Your logic may be different (and easier)
Dim lSpace As Long
lSpace = InStrRev(sValue, Space(1))
If lSpace > 0 Then
StartsGroup = IsDate(Mid(sValue, lSpace + 1, Len(sValue)))
End If
End Function
Function IsData(ByVal sValue As String) As Boolean
'You need to write this function to return True when the cell your on should be copied
'I wrote it to not copy blanks or headers
'Your logic will likely be different
IsData = Len(sValue) > 0 And sValue <> "clerks"
End Function
StartsGroup = rCell.Value = "This" and rCell.Offset(0,10).Value = "That"