Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 嵌套循环流控制_Vba_Loops_Excel_Nested - Fatal编程技术网

Vba 嵌套循环流控制

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。。诸如此类,诸如此类,有点像一个从楼梯上溜走的人。或者一个滑动尺,取决于我如何设置循环,在两次迭代后,我会在所有地方结束 我做了一些事情,

我会简明扼要,坚持我所知道的。这段代码在很大程度上可以正常工作。唯一的问题是x和z循环的迭代。这些to循环应设置Y循环的范围和yLABEL。 我可以通过一套,在事情变得疯狂之后,我可以找到正确的射程。我知道其中的一些与不打破x设置z,然后回到x更新范围有关

它应该工作z,然后找到x。它们之间的范围设置为y。然后下一个x,但y保持,然后y和x之间的范围设置为y。。诸如此类,诸如此类,有点像一个从楼梯上溜走的人。或者一个滑动尺,取决于我如何设置循环,在两次迭代后,我会在所有地方结束

我做了一些事情,但每次我突破x设置z时,x都会在范围的顶部重新启动。至少我认为我看到的是这样。在示例工作表中,我已经改变了偏移处理循环的方式,但想法仍然是一样的。我现在有goto语句,我打算在循环工作后尝试找出条件开关。任何帮助、指导或建议都将不胜感激

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"